[{"data":1,"prerenderedAt":5772},["ShallowReactive",2],{"navigation_docs":3,"-modules-forms":153,"-modules-forms-surround":5767},[4,35,50,59,144],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting started",false,"\u002Fgetting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F2.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Local Development","\u002Fgetting-started\u002Flocal-development","1.getting-started\u002F3.local-development","i-lucide-terminal",{"title":21,"path":22,"stem":23,"icon":24},"Publishing Packages","\u002Fgetting-started\u002Fpublishing","1.getting-started\u002F4.publishing","i-lucide-package-check",{"title":26,"path":27,"stem":28,"icon":29},"Writing a Module","\u002Fgetting-started\u002Fwriting-a-module","1.getting-started\u002F5.writing-a-module","i-lucide-puzzle",{"title":31,"path":32,"stem":33,"icon":34},"UX Patterns","\u002Fgetting-started\u002Fux-patterns","1.getting-started\u002F6.ux-patterns","i-lucide-layout-template",{"title":36,"path":37,"stem":38,"children":39},"Applications","\u002Fapplications","2.applications",[40,45],{"title":41,"path":42,"stem":43,"icon":44},"Website","\u002Fapplications\u002Fwebsite","2.applications\u002F1.website","i-lucide-layout-dashboard",{"title":46,"path":47,"stem":48,"icon":49},"Docs","\u002Fapplications\u002Fdocs","2.applications\u002F2.docs","i-lucide-book-open",{"title":51,"path":52,"stem":53,"children":54},"Layers","\u002Flayers","3.layers",[55],{"title":56,"path":57,"stem":58},"Base Layer","\u002Flayers\u002Fbase","3.layers\u002F1.base",{"title":60,"path":61,"stem":62,"children":63},"Modules","\u002Fmodules","4.modules",[64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140],{"title":65,"path":66,"stem":67},"Account","\u002Fmodules\u002Faccount","4.modules\u002F01.account",{"title":69,"path":70,"stem":71},"Admin","\u002Fmodules\u002Fadmin","4.modules\u002F02.admin",{"title":73,"path":74,"stem":75},"Auth","\u002Fmodules\u002Fauth","4.modules\u002F03.auth",{"title":77,"path":78,"stem":79},"Authorization","\u002Fmodules\u002Fauthorization","4.modules\u002F04.authorization",{"title":81,"path":82,"stem":83},"Cookie Consent","\u002Fmodules\u002Fcookie-consent","4.modules\u002F05.cookie-consent",{"title":85,"path":86,"stem":87},"Events","\u002Fmodules\u002Fevents","4.modules\u002F06.events",{"title":89,"path":90,"stem":91},"Forms","\u002Fmodules\u002Fforms","4.modules\u002F07.forms",{"title":93,"path":94,"stem":95},"MCP","\u002Fmodules\u002Fmcp","4.modules\u002F08.mcp",{"title":97,"path":98,"stem":99},"Menu","\u002Fmodules\u002Fmenu","4.modules\u002F09.menu",{"title":101,"path":102,"stem":103},"Module Kit","\u002Fmodules\u002Fmodule-kit","4.modules\u002F10.module-kit",{"title":105,"path":106,"stem":107},"Notify","\u002Fmodules\u002Fnotify","4.modules\u002F11.notify",{"title":109,"path":110,"stem":111},"OAuth Server","\u002Fmodules\u002Foauth-server","4.modules\u002F12.oauth-server",{"title":113,"path":114,"stem":115},"Payments","\u002Fmodules\u002Fpayments","4.modules\u002F13.payments",{"title":117,"path":118,"stem":119},"Preferences","\u002Fmodules\u002Fpreferences","4.modules\u002F14.preferences",{"title":121,"path":122,"stem":123},"Stripe","\u002Fmodules\u002Fstripe","4.modules\u002F15.stripe",{"title":125,"path":126,"stem":127},"Subscriptions","\u002Fmodules\u002Fsubscriptions","4.modules\u002F16.subscriptions",{"title":129,"path":130,"stem":131},"UI","\u002Fmodules\u002Fui","4.modules\u002F17.ui",{"title":133,"path":134,"stem":135},"Users","\u002Fmodules\u002Fusers","4.modules\u002F18.users",{"title":137,"path":138,"stem":139},"Widget","\u002Fmodules\u002Fwidget","4.modules\u002F19.widget",{"title":141,"path":142,"stem":143},"Email Templates","\u002Fmodules\u002Femail-templates","4.modules\u002F20.email-templates",{"title":145,"path":146,"stem":147,"children":148},"Packages","\u002Fpackages","5.packages",[149],{"title":150,"path":151,"stem":152},"CLI","\u002Fpackages\u002Fcli","5.packages\u002F4.cli",{"id":154,"title":89,"body":155,"description":5762,"extension":4121,"links":5763,"meta":5764,"navigation":1403,"path":90,"seo":5765,"stem":91,"__hash__":5766},"docs\u002F4.modules\u002F07.forms.md",{"type":156,"value":157,"toc":5727},"minimark",[158,167,244,249,319,323,460,476,599,611,615,620,990,993,1072,1075,1086,2028,2042,2045,2158,2163,2173,2352,2392,2396,2410,2644,2661,2665,2679,2790,2889,2926,2929,2934,3107,3152,3197,3207,3211,3238,3264,3268,3272,3320,3415,3417,3423,3493,3523,3527,3543,3546,3561,3597,3600,3603,3629,3633,3682,3686,3700,3703,3738,3742,3787,3791,3797,3875,3879,3883,3969,3975,3979,4093,4097,4117,4147,4232,4239,4304,4308,4314,4438,4442,4447,4585,4598,4601,4607,4697,4925,5048,5081,5085,5104,5464,5467,5600,5605,5609,5723],[159,160,161,162,166],"p",{},"Forms as one declarative ",[163,164,165],"strong",{},"definition"," stored in the database, one renderer and one server pipeline: single page or\nstepped, conditional fields, file uploads, captcha, access control, and stored or email-only submissions.",[168,169,170,173,174,181,182,187,188,181,193,181,198,203,204,209,210,213,214,217,218,221,222,173,225,230,231,236,237,240,241,243],"note",{},[163,171,172],{},"Requires"," ",[175,176,177],"a",{"href":102},[178,179,180],"code",{},"@frigear-nu\u002Fmodule-kit",", ",[175,183,184],{"href":74},[178,185,186],{},"@frigear-nu\u002Fauth",",\n",[175,189,190],{"href":134},[178,191,192],{},"@frigear-nu\u002Fusers",[175,194,195],{"href":94},[178,196,197],{},"@frigear-nu\u002Fmcp",[175,199,200],{"href":106},[178,201,202],{},"@frigear-nu\u002Fnotify","\n(email delivery; the host picks the driver), ",[175,205,206],{"href":130},[178,207,208],{},"@frigear-nu\u002Fui"," and ",[178,211,212],{},"@nuxthub\u002Fcore"," with ",[163,215,216],{},"KV"," (rate\nlimiting) and ",[163,219,220],{},"blob"," (uploads) enabled.\n",[163,223,224],{},"Optional",[175,226,227],{"href":98},[178,228,229],{},"@frigear-nu\u002Fmenu"," (menu entries) and ",[175,232,233],{"href":70},[178,234,235],{},"@frigear-nu\u002Fadmin"," (the admin\npages live in its shell, so they only exist when it is installed). The pages follow the\n",[175,238,239],{"href":32},"UX patterns"," and are built from the shared components of ",[178,242,208],{},".",[245,246,248],"h2",{"id":247},"design","Design",[250,251,252,263,272,282,295,301,310],"ul",{},[253,254,255,258,259,262],"li",{},[163,256,257],{},"A form is data."," The definition is JSON in the ",[178,260,261],{},"forms"," table, so editors can change fields without a deploy.",[253,264,265,173,268,271],{},[163,266,267],{},"One compiler.",[178,269,270],{},"buildFormSchema(definition, answers)"," turns a definition into a zod schema. The client uses it per\nstep, the server for the whole form, so both sides agree on what is required.",[253,273,274,277,278,281],{},[163,275,276],{},"Submissions are snapshots."," Each submission stores the definition (and its ",[178,279,280],{},"version",") it was answered against, so\nold submissions keep rendering after the form changes.",[253,283,284,173,287,290,291,294],{},[163,285,286],{},"Storing is optional.",[178,288,289],{},"storage: 'none'"," never persists answers: they are only emitted through ",[178,292,293],{},"forms:submitted","\n(and emailed).",[253,296,297,300],{},[163,298,299],{},"Delivery never loses a stored submission."," The row is written first; delivery errors are recorded on it and can be\nretried from the admin.",[253,302,303,306,307,243],{},[163,304,305],{},"Staff access is the host's decision."," There is no shared permission system; see ",[175,308,77],{"href":309},"#authorization",[253,311,312,173,315,318],{},[163,313,314],{},"Forms are never deleted.",[178,316,317],{},"DELETE"," archives, so submissions always keep their form.",[245,320,322],{"id":321},"quick-setup","Quick setup",[324,325,330],"pre",{"className":326,"code":327,"language":328,"meta":329,"style":329},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  forms: {\n    settings: {\n      pages: { form: true, admin: true, adminForm: true, adminSubmissions: true, adminSubmission: true },\n    },\n  },\n})\n","ts","",[178,331,332,356,369,379,439,445,451],{"__ignoreMap":329},[333,334,337,341,344,348,352],"span",{"class":335,"line":336},"line",1,[333,338,340],{"class":339},"s7zQu","export",[333,342,343],{"class":339}," default",[333,345,347],{"class":346},"s2Zo4"," defineNuxtConfig",[333,349,351],{"class":350},"sTEyZ","(",[333,353,355],{"class":354},"sMK4o","{\n",[333,357,359,363,366],{"class":335,"line":358},2,[333,360,362],{"class":361},"swJcz","  forms",[333,364,365],{"class":354},":",[333,367,368],{"class":354}," {\n",[333,370,372,375,377],{"class":335,"line":371},3,[333,373,374],{"class":361},"    settings",[333,376,365],{"class":354},[333,378,368],{"class":354},[333,380,382,385,387,390,393,395,399,402,405,407,409,411,414,416,418,420,423,425,427,429,432,434,436],{"class":335,"line":381},4,[333,383,384],{"class":361},"      pages",[333,386,365],{"class":354},[333,388,389],{"class":354}," {",[333,391,392],{"class":361}," form",[333,394,365],{"class":354},[333,396,398],{"class":397},"sfNiH"," true",[333,400,401],{"class":354},",",[333,403,404],{"class":361}," admin",[333,406,365],{"class":354},[333,408,398],{"class":397},[333,410,401],{"class":354},[333,412,413],{"class":361}," adminForm",[333,415,365],{"class":354},[333,417,398],{"class":397},[333,419,401],{"class":354},[333,421,422],{"class":361}," adminSubmissions",[333,424,365],{"class":354},[333,426,398],{"class":397},[333,428,401],{"class":354},[333,430,431],{"class":361}," adminSubmission",[333,433,365],{"class":354},[333,435,398],{"class":397},[333,437,438],{"class":354}," },\n",[333,440,442],{"class":335,"line":441},5,[333,443,444],{"class":354},"    },\n",[333,446,448],{"class":335,"line":447},6,[333,449,450],{"class":354},"  },\n",[333,452,454,457],{"class":335,"line":453},7,[333,455,456],{"class":354},"}",[333,458,459],{"class":350},")\n",[159,461,462,463,471,472,475],{},"Pages are opt-in and use ",[175,464,468],{"href":465,"rel":466},"https:\u002F\u002Fui.nuxt.com",[467],"nofollow",[178,469,470],{},"@nuxt\u002Fui",". ",[178,473,474],{},"\u003CFormRenderer slug=\"...\" \u002F>"," can also be placed in any page.",[324,477,479],{"className":326,"code":478,"language":328,"meta":329,"style":329},"\u002F\u002F server\u002Fplugins\u002Fforms-policy.ts - who may manage forms (denied by default)\nexport default defineNitroPlugin((nitro) => {\n  nitro.hooks.hook('forms:authorize', async (ctx) => {\n    ctx.allowed = await isStaff(ctx.userId)\n  })\n})\n",[178,480,481,487,513,556,586,593],{"__ignoreMap":329},[333,482,483],{"class":335,"line":336},[333,484,486],{"class":485},"sHwdD","\u002F\u002F server\u002Fplugins\u002Fforms-policy.ts - who may manage forms (denied by default)\n",[333,488,489,491,493,496,498,500,504,507,511],{"class":335,"line":358},[333,490,340],{"class":339},[333,492,343],{"class":339},[333,494,495],{"class":346}," defineNitroPlugin",[333,497,351],{"class":350},[333,499,351],{"class":354},[333,501,503],{"class":502},"sHdIc","nitro",[333,505,506],{"class":354},")",[333,508,510],{"class":509},"spNyl"," =>",[333,512,368],{"class":354},[333,514,515,518,520,523,525,528,530,533,537,539,541,544,547,550,552,554],{"class":335,"line":371},[333,516,517],{"class":350},"  nitro",[333,519,243],{"class":354},[333,521,522],{"class":350},"hooks",[333,524,243],{"class":354},[333,526,527],{"class":346},"hook",[333,529,351],{"class":361},[333,531,532],{"class":354},"'",[333,534,536],{"class":535},"sfazB","forms:authorize",[333,538,532],{"class":354},[333,540,401],{"class":354},[333,542,543],{"class":509}," async",[333,545,546],{"class":354}," (",[333,548,549],{"class":502},"ctx",[333,551,506],{"class":354},[333,553,510],{"class":509},[333,555,368],{"class":354},[333,557,558,561,563,566,569,572,575,577,579,581,584],{"class":335,"line":381},[333,559,560],{"class":350},"    ctx",[333,562,243],{"class":354},[333,564,565],{"class":350},"allowed",[333,567,568],{"class":354}," =",[333,570,571],{"class":339}," await",[333,573,574],{"class":346}," isStaff",[333,576,351],{"class":361},[333,578,549],{"class":350},[333,580,243],{"class":354},[333,582,583],{"class":350},"userId",[333,585,459],{"class":361},[333,587,588,591],{"class":335,"line":441},[333,589,590],{"class":354},"  }",[333,592,459],{"class":361},[333,594,595,597],{"class":335,"line":447},[333,596,456],{"class":354},[333,598,459],{"class":350},[600,601,602,603,607,608,243],"warning",{},"Every host app and test fixture must generate and commit a migration for the module's tables. See ",[175,604,606],{"href":605},"#database","Database","\nand ",[175,609,101],{"href":610},"\u002Fmodules\u002Fmodule-kit#migrations-and-database-backed-module-tests",[245,612,614],{"id":613},"options","Options",[159,616,617,618,243],{},"All options live under ",[178,619,261],{},[621,622,623,642],"table",{},[624,625,626],"thead",{},[627,628,629,633,636,639],"tr",{},[630,631,632],"th",{},"Option",[630,634,635],{},"Type",[630,637,638],{},"Default",[630,640,641],{},"Purpose",[643,644,645,674,698,722,745,771,795,814,837,867,896,930,948,968],"tbody",{},[627,646,647,653,658,661],{},[648,649,650],"td",{},[178,651,652],{},"settings.pages.form",[648,654,655],{},[178,656,657],{},"string | boolean",[648,659,660],{},"off",[648,662,663,664,471,667,670,671,243],{},"Public form page; must contain ",[178,665,666],{},":slug",[178,668,669],{},"true"," = ",[178,672,673],{},"\u002Fforms\u002F:slug",[627,675,676,681,685,687],{},[648,677,678],{},[178,679,680],{},"settings.pages.admin",[648,682,683],{},[178,684,657],{},[648,686,660],{},[648,688,689,690,670,692,695,696,243],{},"Admin list. ",[178,691,669],{},[178,693,694],{},"\u002Fadmin\u002Fforms",". Admin pages need ",[178,697,235],{},[627,699,700,705,709,711],{},[648,701,702],{},[178,703,704],{},"settings.pages.adminForm",[648,706,707],{},[178,708,657],{},[648,710,660],{},[648,712,713,714,471,717,670,719,243],{},"Admin editor; must contain ",[178,715,716],{},":id",[178,718,669],{},[178,720,721],{},"\u002Fadmin\u002Fforms\u002F:id",[627,723,724,729,733,735],{},[648,725,726],{},[178,727,728],{},"settings.pages.adminSubmissions",[648,730,731],{},[178,732,657],{},[648,734,660],{},[648,736,737,738,471,740,670,742,243],{},"Submissions of one form; must contain ",[178,739,716],{},[178,741,669],{},[178,743,744],{},"\u002Fadmin\u002Fforms\u002F:id\u002Fsubmissions",[627,746,747,752,756,758],{},[648,748,749],{},[178,750,751],{},"settings.pages.adminSubmission",[648,753,754],{},[178,755,657],{},[648,757,660],{},[648,759,760,761,209,763,471,766,670,768,243],{},"One submission; must contain ",[178,762,716],{},[178,764,765],{},":submissionId",[178,767,669],{},[178,769,770],{},"\u002Fadmin\u002Fforms\u002F:id\u002Fsubmissions\u002F:submissionId",[627,772,773,778,783,788],{},[648,774,775],{},[178,776,777],{},"settings.rateLimit",[648,779,780],{},[178,781,782],{},"number",[648,784,785],{},[178,786,787],{},"10",[648,789,790,791,794],{},"Submissions per client and form per window; ",[178,792,793],{},"0"," disables rate limiting (including password-attempt limiting).",[627,796,797,802,806,811],{},[648,798,799],{},[178,800,801],{},"settings.rateLimitWindowSeconds",[648,803,804],{},[178,805,782],{},[648,807,808],{},[178,809,810],{},"600",[648,812,813],{},"Length of the window.",[627,815,816,821,826,831],{},[648,817,818],{},[178,819,820],{},"settings.mcp",[648,822,823],{},[178,824,825],{},"boolean",[648,827,828],{},[178,829,830],{},"false",[648,832,833,834,836],{},"Expose this module's tools on the ",[175,835,93],{"href":94}," endpoint.",[627,838,839,844,848,852],{},[648,840,841],{},[178,842,843],{},"seed.enabled",[648,845,846],{},[178,847,825],{},[648,849,850],{},[178,851,830],{},[648,853,854,855,858,859,862,863,243],{},"Insert ",[178,856,857],{},"seed.forms"," at startup (env ",[178,860,861],{},"NUXT_FORMS_SEED_ENABLED","). See ",[175,864,866],{"href":865},"#seeding-and-import","Seeding and import",[627,868,869,873,878,883],{},[648,870,871],{},[178,872,857],{},[648,874,875],{},[178,876,877],{},"SeedForm[]",[648,879,880],{},[178,881,882],{},"[]",[648,884,885,888,889,892,893,243],{},[178,886,887],{},"{ slug, name, status?, definition }","; ",[178,890,891],{},"status"," defaults to ",[178,894,895],{},"draft",[627,897,898,903,908,913],{},[648,899,900],{},[178,901,902],{},"captcha.\u003Cprovider>.siteKey",[648,904,905],{},[178,906,907],{},"string",[648,909,910],{},[178,911,912],{},"''",[648,914,915,916,919,920,181,923,926,927,243],{},"Public site key; ",[178,917,918],{},"\u003Cprovider>"," is ",[178,921,922],{},"turnstile",[178,924,925],{},"recaptcha"," or ",[178,928,929],{},"hcaptcha",[627,931,932,937,941,945],{},[648,933,934],{},[178,935,936],{},"captcha.\u003Cprovider>.secretKey",[648,938,939],{},[178,940,907],{},[648,942,943],{},[178,944,912],{},[648,946,947],{},"Secret key, server only.",[627,949,950,955,960,965],{},[648,951,952],{},[178,953,954],{},"captcha.defaultProvider",[648,956,957],{},[178,958,959],{},"CaptchaProvider",[648,961,962],{},[178,963,964],{},"'turnstile'",[648,966,967],{},"Provider of a captcha field that names none.",[627,969,970,975,979,983],{},[648,971,972],{},[178,973,974],{},"encryptionKey",[648,976,977],{},[178,978,907],{},[648,980,981],{},[178,982,912],{},[648,984,985,986,989],{},"Key for per-form secrets. Falls back to ",[178,987,988],{},"NUXT_ENCRYPTION_KEY",", then the session password.",[159,991,992],{},"Environment variables:",[621,994,995,1004],{},[624,996,997],{},[627,998,999,1002],{},[630,1000,1001],{},"Variable",[630,1003,632],{},[643,1005,1006,1016,1033,1050,1061],{},[627,1007,1008,1012],{},[648,1009,1010],{},[178,1011,861],{},[648,1013,1014],{},[178,1015,843],{},[627,1017,1018,1029],{},[648,1019,1020,181,1023,181,1026],{},[178,1021,1022],{},"NUXT_PUBLIC_FORMS_CAPTCHA_TURNSTILE_SITE_KEY",[178,1024,1025],{},"..._RECAPTCHA_SITE_KEY",[178,1027,1028],{},"..._HCAPTCHA_SITE_KEY",[648,1030,1031],{},[178,1032,902],{},[627,1034,1035,1046],{},[648,1036,1037,181,1040,181,1043],{},[178,1038,1039],{},"NUXT_FORMS_CAPTCHA_TURNSTILE_SECRET_KEY",[178,1041,1042],{},"..._RECAPTCHA_SECRET_KEY",[178,1044,1045],{},"..._HCAPTCHA_SECRET_KEY",[648,1047,1048],{},[178,1049,936],{},[627,1051,1052,1057],{},[648,1053,1054],{},[178,1055,1056],{},"NUXT_PUBLIC_FORMS_CAPTCHA_DEFAULT_PROVIDER",[648,1058,1059],{},[178,1060,954],{},[627,1062,1063,1068],{},[648,1064,1065],{},[178,1066,1067],{},"NUXT_FORMS_ENCRYPTION_KEY",[648,1069,1070],{},[178,1071,974],{},[245,1073,1074],{"id":165},"Definition",[159,1076,1077,1078,1081,1082,1085],{},"Author definitions with ",[178,1079,1080],{},"defineForm()"," from ",[178,1083,1084],{},"@frigear-nu\u002Fforms\u002Futils",". These are the real types (abridged):",[324,1087,1089],{"className":326,"code":1088,"language":328,"meta":329,"style":329},"type FormDefinition = {\n  mode: 'single' | 'stepped' \u002F\u002F 'single' has exactly one step and no stepper\n  storage: 'db' | 'none' \u002F\u002F default 'db'\n  steps: FormStep[]\n  submit?: {\n    label?: Translated\n    successMessage?: Translated\n    redirect?: string \u002F\u002F same-origin path\n    allowResubmit?: { keep: string[] } \u002F\u002F offers \"send another\"; these field keys stay filled in\n  }\n  delivery?: {\n    email?: {\n      to: string[] \u002F\u002F literal addresses; ${...} placeholders are rejected\n      subject?: Translated \u002F\u002F may use {{variables}}\n      body?: Translated \u002F\u002F plain text with {{variables}}, up to 10,000 characters per language\n      routes?: { field: string, to: Record\u003Cstring, string[]> } \u002F\u002F recipients by one field's answer, falling back to `to`\n      replyToField?: string \u002F\u002F key of an email field\n    }\n  }\n  access?: FormAccess \u002F\u002F default { availability: 'web', auth: 'none' }\n}\n\ntype FormStep = { id: string, title?: Translated, description?: Translated, showIf?: Condition, fields: FormField[] }\n\ntype FormField = {\n  key: string \u002F\u002F unique across the form; the key of the answer\n  type: 'text' | 'email' | 'tel' | 'number' | 'textarea' | 'select' | 'radio' | 'checkbox' | 'date' | 'file' | 'markdown' | 'captcha'\n  label?: Translated\n  description?: Translated\n  placeholder?: Translated\n  content?: Translated \u002F\u002F markdown fields\n  required?: boolean\n  options?: { value: string, label: Translated }[] \u002F\u002F select \u002F radio\n  multiple?: boolean \u002F\u002F file fields\n  autocomplete?: string \u002F\u002F defaults: 'email' for email, 'tel' for tel ('tel-national' next to a country selector)\n  validation?: { min?, max?, minLength?, maxLength?, pattern?, maxFiles?, maxSize?, accept?: string[], message?: Translated }\n  phone?: PhoneConfig \u002F\u002F tel fields\n  captcha?: CaptchaConfig \u002F\u002F captcha fields\n  showIf?: Condition\n}\n\ntype Condition = { field: string, op: 'eq' | 'neq' | 'in' | 'empty' | 'notEmpty' | 'truthy', value?: unknown }\n\ntype FormAccess = {\n  availability: 'web' | 'api' \u002F\u002F 'api' = no public page\n  auth: 'none' | 'user' | 'token' | 'password'\n  schedule?: Schedule \u002F\u002F default always open; see Open period\n}\n",[178,1090,1091,1104,1132,1158,1171,1181,1191,1200,1214,1239,1245,1255,1265,1280,1294,1307,1354,1367,1373,1378,1392,1398,1405,1465,1470,1481,1494,1608,1618,1628,1638,1651,1662,1695,1709,1722,1789,1803,1817,1828,1833,1838,1925,1930,1941,1968,2009,2023],{"__ignoreMap":329},[333,1092,1093,1096,1100,1102],{"class":335,"line":336},[333,1094,1095],{"class":509},"type",[333,1097,1099],{"class":1098},"sBMFI"," FormDefinition",[333,1101,568],{"class":354},[333,1103,368],{"class":354},[333,1105,1106,1109,1111,1114,1117,1119,1122,1124,1127,1129],{"class":335,"line":358},[333,1107,1108],{"class":361},"  mode",[333,1110,365],{"class":354},[333,1112,1113],{"class":354}," '",[333,1115,1116],{"class":535},"single",[333,1118,532],{"class":354},[333,1120,1121],{"class":354}," |",[333,1123,1113],{"class":354},[333,1125,1126],{"class":535},"stepped",[333,1128,532],{"class":354},[333,1130,1131],{"class":485}," \u002F\u002F 'single' has exactly one step and no stepper\n",[333,1133,1134,1137,1139,1141,1144,1146,1148,1150,1153,1155],{"class":335,"line":371},[333,1135,1136],{"class":361},"  storage",[333,1138,365],{"class":354},[333,1140,1113],{"class":354},[333,1142,1143],{"class":535},"db",[333,1145,532],{"class":354},[333,1147,1121],{"class":354},[333,1149,1113],{"class":354},[333,1151,1152],{"class":535},"none",[333,1154,532],{"class":354},[333,1156,1157],{"class":485}," \u002F\u002F default 'db'\n",[333,1159,1160,1163,1165,1168],{"class":335,"line":381},[333,1161,1162],{"class":361},"  steps",[333,1164,365],{"class":354},[333,1166,1167],{"class":1098}," FormStep",[333,1169,1170],{"class":350},"[]\n",[333,1172,1173,1176,1179],{"class":335,"line":441},[333,1174,1175],{"class":361},"  submit",[333,1177,1178],{"class":354},"?:",[333,1180,368],{"class":354},[333,1182,1183,1186,1188],{"class":335,"line":447},[333,1184,1185],{"class":361},"    label",[333,1187,1178],{"class":354},[333,1189,1190],{"class":1098}," Translated\n",[333,1192,1193,1196,1198],{"class":335,"line":453},[333,1194,1195],{"class":361},"    successMessage",[333,1197,1178],{"class":354},[333,1199,1190],{"class":1098},[333,1201,1203,1206,1208,1211],{"class":335,"line":1202},8,[333,1204,1205],{"class":361},"    redirect",[333,1207,1178],{"class":354},[333,1209,1210],{"class":1098}," string",[333,1212,1213],{"class":485}," \u002F\u002F same-origin path\n",[333,1215,1217,1220,1222,1224,1227,1229,1231,1234,1236],{"class":335,"line":1216},9,[333,1218,1219],{"class":361},"    allowResubmit",[333,1221,1178],{"class":354},[333,1223,389],{"class":354},[333,1225,1226],{"class":361}," keep",[333,1228,365],{"class":354},[333,1230,1210],{"class":1098},[333,1232,1233],{"class":350},"[] ",[333,1235,456],{"class":354},[333,1237,1238],{"class":485}," \u002F\u002F offers \"send another\"; these field keys stay filled in\n",[333,1240,1242],{"class":335,"line":1241},10,[333,1243,1244],{"class":354},"  }\n",[333,1246,1248,1251,1253],{"class":335,"line":1247},11,[333,1249,1250],{"class":361},"  delivery",[333,1252,1178],{"class":354},[333,1254,368],{"class":354},[333,1256,1258,1261,1263],{"class":335,"line":1257},12,[333,1259,1260],{"class":361},"    email",[333,1262,1178],{"class":354},[333,1264,368],{"class":354},[333,1266,1268,1271,1273,1275,1277],{"class":335,"line":1267},13,[333,1269,1270],{"class":361},"      to",[333,1272,365],{"class":354},[333,1274,1210],{"class":1098},[333,1276,1233],{"class":350},[333,1278,1279],{"class":485},"\u002F\u002F literal addresses; ${...} placeholders are rejected\n",[333,1281,1283,1286,1288,1291],{"class":335,"line":1282},14,[333,1284,1285],{"class":361},"      subject",[333,1287,1178],{"class":354},[333,1289,1290],{"class":1098}," Translated",[333,1292,1293],{"class":485}," \u002F\u002F may use {{variables}}\n",[333,1295,1297,1300,1302,1304],{"class":335,"line":1296},15,[333,1298,1299],{"class":361},"      body",[333,1301,1178],{"class":354},[333,1303,1290],{"class":1098},[333,1305,1306],{"class":485}," \u002F\u002F plain text with {{variables}}, up to 10,000 characters per language\n",[333,1308,1310,1313,1315,1317,1320,1322,1324,1326,1329,1331,1334,1337,1339,1341,1343,1345,1348,1351],{"class":335,"line":1309},16,[333,1311,1312],{"class":361},"      routes",[333,1314,1178],{"class":354},[333,1316,389],{"class":354},[333,1318,1319],{"class":361}," field",[333,1321,365],{"class":354},[333,1323,1210],{"class":1098},[333,1325,401],{"class":354},[333,1327,1328],{"class":361}," to",[333,1330,365],{"class":354},[333,1332,1333],{"class":1098}," Record",[333,1335,1336],{"class":354},"\u003C",[333,1338,907],{"class":1098},[333,1340,401],{"class":354},[333,1342,1210],{"class":1098},[333,1344,882],{"class":350},[333,1346,1347],{"class":354},">",[333,1349,1350],{"class":354}," }",[333,1352,1353],{"class":485}," \u002F\u002F recipients by one field's answer, falling back to `to`\n",[333,1355,1357,1360,1362,1364],{"class":335,"line":1356},17,[333,1358,1359],{"class":361},"      replyToField",[333,1361,1178],{"class":354},[333,1363,1210],{"class":1098},[333,1365,1366],{"class":485}," \u002F\u002F key of an email field\n",[333,1368,1370],{"class":335,"line":1369},18,[333,1371,1372],{"class":354},"    }\n",[333,1374,1376],{"class":335,"line":1375},19,[333,1377,1244],{"class":354},[333,1379,1381,1384,1386,1389],{"class":335,"line":1380},20,[333,1382,1383],{"class":361},"  access",[333,1385,1178],{"class":354},[333,1387,1388],{"class":1098}," FormAccess",[333,1390,1391],{"class":485}," \u002F\u002F default { availability: 'web', auth: 'none' }\n",[333,1393,1395],{"class":335,"line":1394},21,[333,1396,1397],{"class":354},"}\n",[333,1399,1401],{"class":335,"line":1400},22,[333,1402,1404],{"emptyLinePlaceholder":1403},true,"\n",[333,1406,1408,1410,1412,1414,1416,1419,1421,1423,1425,1428,1430,1432,1434,1437,1439,1441,1443,1446,1448,1451,1453,1456,1458,1461,1463],{"class":335,"line":1407},23,[333,1409,1095],{"class":509},[333,1411,1167],{"class":1098},[333,1413,568],{"class":354},[333,1415,389],{"class":354},[333,1417,1418],{"class":361}," id",[333,1420,365],{"class":354},[333,1422,1210],{"class":1098},[333,1424,401],{"class":354},[333,1426,1427],{"class":361}," title",[333,1429,1178],{"class":354},[333,1431,1290],{"class":1098},[333,1433,401],{"class":354},[333,1435,1436],{"class":361}," description",[333,1438,1178],{"class":354},[333,1440,1290],{"class":1098},[333,1442,401],{"class":354},[333,1444,1445],{"class":361}," showIf",[333,1447,1178],{"class":354},[333,1449,1450],{"class":1098}," Condition",[333,1452,401],{"class":354},[333,1454,1455],{"class":361}," fields",[333,1457,365],{"class":354},[333,1459,1460],{"class":1098}," FormField",[333,1462,1233],{"class":350},[333,1464,1397],{"class":354},[333,1466,1468],{"class":335,"line":1467},24,[333,1469,1404],{"emptyLinePlaceholder":1403},[333,1471,1473,1475,1477,1479],{"class":335,"line":1472},25,[333,1474,1095],{"class":509},[333,1476,1460],{"class":1098},[333,1478,568],{"class":354},[333,1480,368],{"class":354},[333,1482,1484,1487,1489,1491],{"class":335,"line":1483},26,[333,1485,1486],{"class":361},"  key",[333,1488,365],{"class":354},[333,1490,1210],{"class":1098},[333,1492,1493],{"class":485}," \u002F\u002F unique across the form; the key of the answer\n",[333,1495,1497,1500,1502,1504,1507,1509,1511,1513,1516,1518,1520,1522,1525,1527,1529,1531,1533,1535,1537,1539,1542,1544,1546,1548,1551,1553,1555,1557,1560,1562,1564,1566,1569,1571,1573,1575,1578,1580,1582,1584,1587,1589,1591,1593,1596,1598,1600,1602,1605],{"class":335,"line":1496},27,[333,1498,1499],{"class":361},"  type",[333,1501,365],{"class":354},[333,1503,1113],{"class":354},[333,1505,1506],{"class":535},"text",[333,1508,532],{"class":354},[333,1510,1121],{"class":354},[333,1512,1113],{"class":354},[333,1514,1515],{"class":535},"email",[333,1517,532],{"class":354},[333,1519,1121],{"class":354},[333,1521,1113],{"class":354},[333,1523,1524],{"class":535},"tel",[333,1526,532],{"class":354},[333,1528,1121],{"class":354},[333,1530,1113],{"class":354},[333,1532,782],{"class":535},[333,1534,532],{"class":354},[333,1536,1121],{"class":354},[333,1538,1113],{"class":354},[333,1540,1541],{"class":535},"textarea",[333,1543,532],{"class":354},[333,1545,1121],{"class":354},[333,1547,1113],{"class":354},[333,1549,1550],{"class":535},"select",[333,1552,532],{"class":354},[333,1554,1121],{"class":354},[333,1556,1113],{"class":354},[333,1558,1559],{"class":535},"radio",[333,1561,532],{"class":354},[333,1563,1121],{"class":354},[333,1565,1113],{"class":354},[333,1567,1568],{"class":535},"checkbox",[333,1570,532],{"class":354},[333,1572,1121],{"class":354},[333,1574,1113],{"class":354},[333,1576,1577],{"class":535},"date",[333,1579,532],{"class":354},[333,1581,1121],{"class":354},[333,1583,1113],{"class":354},[333,1585,1586],{"class":535},"file",[333,1588,532],{"class":354},[333,1590,1121],{"class":354},[333,1592,1113],{"class":354},[333,1594,1595],{"class":535},"markdown",[333,1597,532],{"class":354},[333,1599,1121],{"class":354},[333,1601,1113],{"class":354},[333,1603,1604],{"class":535},"captcha",[333,1606,1607],{"class":354},"'\n",[333,1609,1611,1614,1616],{"class":335,"line":1610},28,[333,1612,1613],{"class":361},"  label",[333,1615,1178],{"class":354},[333,1617,1190],{"class":1098},[333,1619,1621,1624,1626],{"class":335,"line":1620},29,[333,1622,1623],{"class":361},"  description",[333,1625,1178],{"class":354},[333,1627,1190],{"class":1098},[333,1629,1631,1634,1636],{"class":335,"line":1630},30,[333,1632,1633],{"class":361},"  placeholder",[333,1635,1178],{"class":354},[333,1637,1190],{"class":1098},[333,1639,1641,1644,1646,1648],{"class":335,"line":1640},31,[333,1642,1643],{"class":361},"  content",[333,1645,1178],{"class":354},[333,1647,1290],{"class":1098},[333,1649,1650],{"class":485}," \u002F\u002F markdown fields\n",[333,1652,1654,1657,1659],{"class":335,"line":1653},32,[333,1655,1656],{"class":361},"  required",[333,1658,1178],{"class":354},[333,1660,1661],{"class":1098}," boolean\n",[333,1663,1665,1668,1670,1672,1675,1677,1679,1681,1684,1686,1688,1690,1692],{"class":335,"line":1664},33,[333,1666,1667],{"class":361},"  options",[333,1669,1178],{"class":354},[333,1671,389],{"class":354},[333,1673,1674],{"class":361}," value",[333,1676,365],{"class":354},[333,1678,1210],{"class":1098},[333,1680,401],{"class":354},[333,1682,1683],{"class":361}," label",[333,1685,365],{"class":354},[333,1687,1290],{"class":1098},[333,1689,1350],{"class":354},[333,1691,1233],{"class":350},[333,1693,1694],{"class":485},"\u002F\u002F select \u002F radio\n",[333,1696,1698,1701,1703,1706],{"class":335,"line":1697},34,[333,1699,1700],{"class":361},"  multiple",[333,1702,1178],{"class":354},[333,1704,1705],{"class":1098}," boolean",[333,1707,1708],{"class":485}," \u002F\u002F file fields\n",[333,1710,1712,1715,1717,1719],{"class":335,"line":1711},35,[333,1713,1714],{"class":361},"  autocomplete",[333,1716,1178],{"class":354},[333,1718,1210],{"class":1098},[333,1720,1721],{"class":485}," \u002F\u002F defaults: 'email' for email, 'tel' for tel ('tel-national' next to a country selector)\n",[333,1723,1725,1728,1730,1732,1735,1738,1741,1743,1746,1748,1751,1753,1756,1758,1761,1763,1766,1768,1771,1773,1775,1777,1779,1782,1784,1786],{"class":335,"line":1724},36,[333,1726,1727],{"class":361},"  validation",[333,1729,1178],{"class":354},[333,1731,389],{"class":354},[333,1733,1734],{"class":361}," min",[333,1736,1737],{"class":354},"?,",[333,1739,1740],{"class":361}," max",[333,1742,1737],{"class":354},[333,1744,1745],{"class":361}," minLength",[333,1747,1737],{"class":354},[333,1749,1750],{"class":361}," maxLength",[333,1752,1737],{"class":354},[333,1754,1755],{"class":361}," pattern",[333,1757,1737],{"class":354},[333,1759,1760],{"class":361}," maxFiles",[333,1762,1737],{"class":354},[333,1764,1765],{"class":361}," maxSize",[333,1767,1737],{"class":354},[333,1769,1770],{"class":361}," accept",[333,1772,1178],{"class":354},[333,1774,1210],{"class":1098},[333,1776,882],{"class":350},[333,1778,401],{"class":354},[333,1780,1781],{"class":361}," message",[333,1783,1178],{"class":354},[333,1785,1290],{"class":1098},[333,1787,1788],{"class":354}," }\n",[333,1790,1792,1795,1797,1800],{"class":335,"line":1791},37,[333,1793,1794],{"class":361},"  phone",[333,1796,1178],{"class":354},[333,1798,1799],{"class":1098}," PhoneConfig",[333,1801,1802],{"class":485}," \u002F\u002F tel fields\n",[333,1804,1806,1809,1811,1814],{"class":335,"line":1805},38,[333,1807,1808],{"class":361},"  captcha",[333,1810,1178],{"class":354},[333,1812,1813],{"class":1098}," CaptchaConfig",[333,1815,1816],{"class":485}," \u002F\u002F captcha fields\n",[333,1818,1820,1823,1825],{"class":335,"line":1819},39,[333,1821,1822],{"class":361},"  showIf",[333,1824,1178],{"class":354},[333,1826,1827],{"class":1098}," Condition\n",[333,1829,1831],{"class":335,"line":1830},40,[333,1832,1397],{"class":354},[333,1834,1836],{"class":335,"line":1835},41,[333,1837,1404],{"emptyLinePlaceholder":1403},[333,1839,1841,1843,1845,1847,1849,1851,1853,1855,1857,1860,1862,1864,1867,1869,1871,1873,1876,1878,1880,1882,1885,1887,1889,1891,1894,1896,1898,1900,1903,1905,1907,1909,1912,1914,1916,1918,1920,1923],{"class":335,"line":1840},42,[333,1842,1095],{"class":509},[333,1844,1450],{"class":1098},[333,1846,568],{"class":354},[333,1848,389],{"class":354},[333,1850,1319],{"class":361},[333,1852,365],{"class":354},[333,1854,1210],{"class":1098},[333,1856,401],{"class":354},[333,1858,1859],{"class":361}," op",[333,1861,365],{"class":354},[333,1863,1113],{"class":354},[333,1865,1866],{"class":535},"eq",[333,1868,532],{"class":354},[333,1870,1121],{"class":354},[333,1872,1113],{"class":354},[333,1874,1875],{"class":535},"neq",[333,1877,532],{"class":354},[333,1879,1121],{"class":354},[333,1881,1113],{"class":354},[333,1883,1884],{"class":535},"in",[333,1886,532],{"class":354},[333,1888,1121],{"class":354},[333,1890,1113],{"class":354},[333,1892,1893],{"class":535},"empty",[333,1895,532],{"class":354},[333,1897,1121],{"class":354},[333,1899,1113],{"class":354},[333,1901,1902],{"class":535},"notEmpty",[333,1904,532],{"class":354},[333,1906,1121],{"class":354},[333,1908,1113],{"class":354},[333,1910,1911],{"class":535},"truthy",[333,1913,532],{"class":354},[333,1915,401],{"class":354},[333,1917,1674],{"class":361},[333,1919,1178],{"class":354},[333,1921,1922],{"class":1098}," unknown",[333,1924,1788],{"class":354},[333,1926,1928],{"class":335,"line":1927},43,[333,1929,1404],{"emptyLinePlaceholder":1403},[333,1931,1933,1935,1937,1939],{"class":335,"line":1932},44,[333,1934,1095],{"class":509},[333,1936,1388],{"class":1098},[333,1938,568],{"class":354},[333,1940,368],{"class":354},[333,1942,1944,1947,1949,1951,1954,1956,1958,1960,1963,1965],{"class":335,"line":1943},45,[333,1945,1946],{"class":361},"  availability",[333,1948,365],{"class":354},[333,1950,1113],{"class":354},[333,1952,1953],{"class":535},"web",[333,1955,532],{"class":354},[333,1957,1121],{"class":354},[333,1959,1113],{"class":354},[333,1961,1962],{"class":535},"api",[333,1964,532],{"class":354},[333,1966,1967],{"class":485}," \u002F\u002F 'api' = no public page\n",[333,1969,1971,1974,1976,1978,1980,1982,1984,1986,1989,1991,1993,1995,1998,2000,2002,2004,2007],{"class":335,"line":1970},46,[333,1972,1973],{"class":361},"  auth",[333,1975,365],{"class":354},[333,1977,1113],{"class":354},[333,1979,1152],{"class":535},[333,1981,532],{"class":354},[333,1983,1121],{"class":354},[333,1985,1113],{"class":354},[333,1987,1988],{"class":535},"user",[333,1990,532],{"class":354},[333,1992,1121],{"class":354},[333,1994,1113],{"class":354},[333,1996,1997],{"class":535},"token",[333,1999,532],{"class":354},[333,2001,1121],{"class":354},[333,2003,1113],{"class":354},[333,2005,2006],{"class":535},"password",[333,2008,1607],{"class":354},[333,2010,2012,2015,2017,2020],{"class":335,"line":2011},47,[333,2013,2014],{"class":361},"  schedule",[333,2016,1178],{"class":354},[333,2018,2019],{"class":1098}," Schedule",[333,2021,2022],{"class":485}," \u002F\u002F default always open; see Open period\n",[333,2024,2026],{"class":335,"line":2025},48,[333,2027,1397],{"class":354},[159,2029,2030,2033,2034,2037,2038,2041],{},[178,2031,2032],{},"Translated"," is a string or a ",[178,2035,2036],{},"{ da, en }"," map (falls back to ",[178,2039,2040],{},"en",", then the first value).",[159,2043,2044],{},"Rules enforced when a definition is saved or seeded:",[250,2046,2047,2083,2089,2115,2132,2145],{},[253,2048,2049,173,2052,2055,2056,2059,2060,2063,2064,2066,2067,2069,2070,2072,2073,181,2075,209,2077,2079,2080,2082],{},[163,2050,2051],{},"Conditions.",[178,2053,2054],{},"showIf"," only sees answers of fields ",[163,2057,2058],{},"earlier"," in the form and must reference an input field.\n",[178,2061,2062],{},"value"," is the compared value for ",[178,2065,1866],{},"\u002F",[178,2068,1875],{},", a list for ",[178,2071,1884],{},", and unused for ",[178,2074,1893],{},[178,2076,1902],{},[178,2078,1911],{}," (an\nalias of ",[178,2081,1902],{},"). A hidden field's stale answer never keeps another field shown; hidden fields are not required\nand their answers are dropped.",[253,2084,2085,2088],{},[163,2086,2087],{},"Keys."," Field keys start with a letter and contain letters, digits and underscores; keys and step ids are unique.",[253,2090,2091,173,2094,209,2096,2098,2099,2101,2102,2105,2106,2108,2109,888,2112,2114],{},[163,2092,2093],{},"Fields.",[178,2095,1550],{},[178,2097,1559],{}," need options; ",[178,2100,1595],{}," needs ",[178,2103,2104],{},"content"," and collects no answer; ",[178,2107,1586],{}," needs\n",[178,2110,2111],{},"storage: 'db'",[178,2113,1604],{}," is always required while visible.",[253,2116,2117,173,2120,2123,2124,2127,2128,2131],{},[163,2118,2119],{},"Files.",[178,2121,2122],{},"maxSize"," defaults to 10 MB, ",[178,2125,2126],{},"maxFiles"," to 10 (1 unless ",[178,2129,2130],{},"multiple",").",[253,2133,2134,173,2137,2140,2141,2144],{},[163,2135,2136],{},"Access.",[178,2138,2139],{},"auth: 'token'"," requires ",[178,2142,2143],{},"availability: 'api'",", because a bearer token cannot be typed into a page.",[253,2146,2147,173,2150,2153,2154,2157],{},[163,2148,2149],{},"Email.",[178,2151,2152],{},"routes.field"," must be an earlier input field and ",[178,2155,2156],{},"replyToField"," an email field.",[2159,2160,2162],"h3",{"id":2161},"phone-fields","Phone fields",[159,2164,2165,2166,2168,2169,2172],{},"A ",[178,2167,1524],{}," field is one free-form input by default. ",[178,2170,2171],{},"phone.mode: 'country'"," adds a searchable country selector.",[324,2174,2176],{"className":326,"code":2175,"language":328,"meta":329,"style":329},"type PhoneConfig = {\n  mode?: 'simple' | 'country' \u002F\u002F default 'simple'\n  countries?: string[] \u002F\u002F ISO 3166-1 alpha-2, in display order; default all. Enforced on the server.\n  defaultCountry?: string \u002F\u002F default 'DK' when offered, else the first offered country\n}\n\n{ key: 'phone', type: 'tel', phone: { mode: 'country', countries: ['DK', 'SE', 'NO'], defaultCountry: 'DK' } }\n",[178,2177,2178,2188,2213,2227,2239,2243,2247],{"__ignoreMap":329},[333,2179,2180,2182,2184,2186],{"class":335,"line":336},[333,2181,1095],{"class":509},[333,2183,1799],{"class":1098},[333,2185,568],{"class":354},[333,2187,368],{"class":354},[333,2189,2190,2192,2194,2196,2199,2201,2203,2205,2208,2210],{"class":335,"line":358},[333,2191,1108],{"class":361},[333,2193,1178],{"class":354},[333,2195,1113],{"class":354},[333,2197,2198],{"class":535},"simple",[333,2200,532],{"class":354},[333,2202,1121],{"class":354},[333,2204,1113],{"class":354},[333,2206,2207],{"class":535},"country",[333,2209,532],{"class":354},[333,2211,2212],{"class":485}," \u002F\u002F default 'simple'\n",[333,2214,2215,2218,2220,2222,2224],{"class":335,"line":371},[333,2216,2217],{"class":361},"  countries",[333,2219,1178],{"class":354},[333,2221,1210],{"class":1098},[333,2223,1233],{"class":350},[333,2225,2226],{"class":485},"\u002F\u002F ISO 3166-1 alpha-2, in display order; default all. Enforced on the server.\n",[333,2228,2229,2232,2234,2236],{"class":335,"line":381},[333,2230,2231],{"class":361},"  defaultCountry",[333,2233,1178],{"class":354},[333,2235,1210],{"class":1098},[333,2237,2238],{"class":485}," \u002F\u002F default 'DK' when offered, else the first offered country\n",[333,2240,2241],{"class":335,"line":441},[333,2242,1397],{"class":354},[333,2244,2245],{"class":335,"line":447},[333,2246,1404],{"emptyLinePlaceholder":1403},[333,2248,2249,2252,2255,2257,2259,2262,2264,2266,2269,2271,2273,2275,2277,2279,2282,2284,2286,2289,2291,2293,2295,2297,2299,2302,2304,2307,2309,2312,2314,2316,2318,2321,2323,2325,2327,2330,2332,2335,2337,2340,2342,2344,2346,2348,2350],{"class":335,"line":453},[333,2250,2251],{"class":354},"{",[333,2253,2254],{"class":361}," key",[333,2256,365],{"class":354},[333,2258,1113],{"class":354},[333,2260,2261],{"class":535},"phone",[333,2263,532],{"class":354},[333,2265,401],{"class":354},[333,2267,2268],{"class":361}," type",[333,2270,365],{"class":354},[333,2272,1113],{"class":354},[333,2274,1524],{"class":535},[333,2276,532],{"class":354},[333,2278,401],{"class":354},[333,2280,2281],{"class":361}," phone",[333,2283,365],{"class":354},[333,2285,389],{"class":354},[333,2287,2288],{"class":361}," mode",[333,2290,365],{"class":354},[333,2292,1113],{"class":354},[333,2294,2207],{"class":535},[333,2296,532],{"class":354},[333,2298,401],{"class":354},[333,2300,2301],{"class":361}," countries",[333,2303,365],{"class":354},[333,2305,2306],{"class":350}," [",[333,2308,532],{"class":354},[333,2310,2311],{"class":535},"DK",[333,2313,532],{"class":354},[333,2315,401],{"class":354},[333,2317,1113],{"class":354},[333,2319,2320],{"class":535},"SE",[333,2322,532],{"class":354},[333,2324,401],{"class":354},[333,2326,1113],{"class":354},[333,2328,2329],{"class":535},"NO",[333,2331,532],{"class":354},[333,2333,2334],{"class":350},"]",[333,2336,401],{"class":354},[333,2338,2339],{"class":361}," defaultCountry",[333,2341,365],{"class":354},[333,2343,1113],{"class":354},[333,2345,2311],{"class":535},[333,2347,532],{"class":354},[333,2349,1350],{"class":354},[333,2351,1788],{"class":354},[250,2353,2354,2371,2374],{},[253,2355,2356,2357,2360,2361,546,2364,2367,2368,2370],{},"The answer is ",[163,2358,2359],{},"one string",". With a selector it is ",[178,2362,2363],{},"+\u003Cdial code>\u003Cnumber>",[178,2365,2366],{},"+4512345678","; a leading trunk ",[178,2369,793],{}," is\ndropped, Italian numbers keep it), so submissions, emails and the API never see two values.",[253,2372,2373],{},"Country mode requires an international number of at most 15 digits (E.164) with at least 4 digits after the code.",[253,2375,2376,2377,181,2380,181,2383,209,2386,2389,2390,243],{},"Helpers ",[178,2378,2379],{},"composePhone",[178,2381,2382],{},"parsePhone",[178,2384,2385],{},"phoneCountries",[178,2387,2388],{},"allPhoneCountries"," are exported from ",[178,2391,1084],{},[2159,2393,2395],{"id":2394},"open-period-seasonal-forms","Open period (seasonal forms)",[159,2397,2398,2401,2402,2405,2406,2409],{},[178,2399,2400],{},"access.schedule"," limits when a form accepts answers. A yearly season whose end is before its start wraps over new\nyear. ",[178,2403,2404],{},"from"," is inclusive, ",[178,2407,2408],{},"to"," exclusive.",[324,2411,2413],{"className":326,"code":2412,"language":328,"meta":329,"style":329},"\u002F\u002F Every year from 1 Jan 23:00 to 1 Feb 23:00 (Oslo wall-clock time).\naccess: {\n  availability: 'web',\n  auth: 'none',\n  schedule: {\n    type: 'yearly',\n    timezone: 'Europe\u002FOslo',\n    from: { month: 1, day: 1, time: '23:00' },\n    to: { month: 2, day: 1, time: '23:00' },\n  },\n}\n\n\u002F\u002F One fixed period (either end may be left out for an open-ended window).\nschedule: { type: 'range', from: '2026-03-01T10:00:00Z', to: '2026-03-15T10:00:00Z' }\n",[178,2414,2415,2420,2429,2443,2457,2465,2481,2497,2540,2578,2582,2586,2590,2595],{"__ignoreMap":329},[333,2416,2417],{"class":335,"line":336},[333,2418,2419],{"class":485},"\u002F\u002F Every year from 1 Jan 23:00 to 1 Feb 23:00 (Oslo wall-clock time).\n",[333,2421,2422,2425,2427],{"class":335,"line":358},[333,2423,2424],{"class":1098},"access",[333,2426,365],{"class":354},[333,2428,368],{"class":354},[333,2430,2431,2433,2435,2437,2439,2441],{"class":335,"line":371},[333,2432,1946],{"class":1098},[333,2434,365],{"class":354},[333,2436,1113],{"class":354},[333,2438,1953],{"class":535},[333,2440,532],{"class":354},[333,2442,187],{"class":354},[333,2444,2445,2447,2449,2451,2453,2455],{"class":335,"line":381},[333,2446,1973],{"class":1098},[333,2448,365],{"class":354},[333,2450,1113],{"class":354},[333,2452,1152],{"class":535},[333,2454,532],{"class":354},[333,2456,187],{"class":354},[333,2458,2459,2461,2463],{"class":335,"line":441},[333,2460,2014],{"class":1098},[333,2462,365],{"class":354},[333,2464,368],{"class":354},[333,2466,2467,2470,2472,2474,2477,2479],{"class":335,"line":447},[333,2468,2469],{"class":1098},"    type",[333,2471,365],{"class":354},[333,2473,1113],{"class":354},[333,2475,2476],{"class":535},"yearly",[333,2478,532],{"class":354},[333,2480,187],{"class":354},[333,2482,2483,2486,2488,2490,2493,2495],{"class":335,"line":453},[333,2484,2485],{"class":1098},"    timezone",[333,2487,365],{"class":354},[333,2489,1113],{"class":354},[333,2491,2492],{"class":535},"Europe\u002FOslo",[333,2494,532],{"class":354},[333,2496,187],{"class":354},[333,2498,2499,2502,2504,2506,2509,2511,2515,2517,2520,2522,2524,2526,2529,2531,2533,2536,2538],{"class":335,"line":1202},[333,2500,2501],{"class":1098},"    from",[333,2503,365],{"class":354},[333,2505,389],{"class":354},[333,2507,2508],{"class":1098}," month",[333,2510,365],{"class":354},[333,2512,2514],{"class":2513},"sbssI"," 1",[333,2516,401],{"class":354},[333,2518,2519],{"class":1098}," day",[333,2521,365],{"class":354},[333,2523,2514],{"class":2513},[333,2525,401],{"class":354},[333,2527,2528],{"class":1098}," time",[333,2530,365],{"class":354},[333,2532,1113],{"class":354},[333,2534,2535],{"class":535},"23:00",[333,2537,532],{"class":354},[333,2539,438],{"class":354},[333,2541,2542,2545,2547,2549,2551,2553,2556,2558,2560,2562,2564,2566,2568,2570,2572,2574,2576],{"class":335,"line":1216},[333,2543,2544],{"class":1098},"    to",[333,2546,365],{"class":354},[333,2548,389],{"class":354},[333,2550,2508],{"class":1098},[333,2552,365],{"class":354},[333,2554,2555],{"class":2513}," 2",[333,2557,401],{"class":354},[333,2559,2519],{"class":1098},[333,2561,365],{"class":354},[333,2563,2514],{"class":2513},[333,2565,401],{"class":354},[333,2567,2528],{"class":1098},[333,2569,365],{"class":354},[333,2571,1113],{"class":354},[333,2573,2535],{"class":535},[333,2575,532],{"class":354},[333,2577,438],{"class":354},[333,2579,2580],{"class":335,"line":1241},[333,2581,450],{"class":354},[333,2583,2584],{"class":335,"line":1247},[333,2585,1397],{"class":354},[333,2587,2588],{"class":335,"line":1257},[333,2589,1404],{"emptyLinePlaceholder":1403},[333,2591,2592],{"class":335,"line":1267},[333,2593,2594],{"class":485},"\u002F\u002F One fixed period (either end may be left out for an open-ended window).\n",[333,2596,2597,2600,2602,2604,2606,2608,2610,2613,2615,2617,2620,2622,2624,2627,2629,2631,2633,2635,2637,2640,2642],{"class":335,"line":1282},[333,2598,2599],{"class":1098},"schedule",[333,2601,365],{"class":354},[333,2603,389],{"class":354},[333,2605,2268],{"class":1098},[333,2607,365],{"class":354},[333,2609,1113],{"class":354},[333,2611,2612],{"class":535},"range",[333,2614,532],{"class":354},[333,2616,401],{"class":354},[333,2618,2619],{"class":1098}," from",[333,2621,365],{"class":354},[333,2623,1113],{"class":354},[333,2625,2626],{"class":535},"2026-03-01T10:00:00Z",[333,2628,532],{"class":354},[333,2630,401],{"class":354},[333,2632,1328],{"class":1098},[333,2634,365],{"class":354},[333,2636,1113],{"class":354},[333,2638,2639],{"class":535},"2026-03-15T10:00:00Z",[333,2641,532],{"class":354},[333,2643,1788],{"class":354},[159,2645,2646,2647,213,2650,471,2653,2656,2657,2660],{},"Outside the period the public page shows a \"closed\" notice (with the next opening when there is one) and the\ndefinition and submit endpoints answer ",[178,2648,2649],{},"403",[178,2651,2652],{},"data: { closed: true, opensAt }",[178,2654,2655],{},"isFormOpen"," and\n",[178,2658,2659],{},"nextFormOpening"," are exported from the utils for custom UI.",[2159,2662,2664],{"id":2663},"email-body-and-variables","Email body and variables",[159,2666,2667,2668,2671,2672,2674,2675,2678],{},"Without ",[178,2669,2670],{},"delivery.email.body"," the notification lists every visible answer. The body is chosen by the submission's\nlocale (falling back to ",[178,2673,2040],{},"); ",[178,2676,2677],{},"subject"," accepts the same variables.",[324,2680,2682],{"className":326,"code":2681,"language":328,"meta":329,"style":329},"delivery: {\n  email: {\n    to: ['office@example.com'],\n    subject: 'New message from {{ answer.name }}',\n    body: { en: 'Hi team,\\n\\n{{answer.name}} wrote via {{form.name}}:\\n{{answer.message}}\\n\\nAll answers:\\n{{answers}}' },\n  },\n}\n",[178,2683,2684,2693,2702,2721,2737,2782,2786],{"__ignoreMap":329},[333,2685,2686,2689,2691],{"class":335,"line":336},[333,2687,2688],{"class":1098},"delivery",[333,2690,365],{"class":354},[333,2692,368],{"class":354},[333,2694,2695,2698,2700],{"class":335,"line":358},[333,2696,2697],{"class":1098},"  email",[333,2699,365],{"class":354},[333,2701,368],{"class":354},[333,2703,2704,2706,2708,2710,2712,2715,2717,2719],{"class":335,"line":371},[333,2705,2544],{"class":1098},[333,2707,365],{"class":354},[333,2709,2306],{"class":361},[333,2711,532],{"class":354},[333,2713,2714],{"class":535},"office@example.com",[333,2716,532],{"class":354},[333,2718,2334],{"class":361},[333,2720,187],{"class":354},[333,2722,2723,2726,2728,2730,2733,2735],{"class":335,"line":381},[333,2724,2725],{"class":1098},"    subject",[333,2727,365],{"class":354},[333,2729,1113],{"class":354},[333,2731,2732],{"class":535},"New message from {{ answer.name }}",[333,2734,532],{"class":354},[333,2736,187],{"class":354},[333,2738,2739,2742,2744,2746,2749,2751,2753,2756,2759,2762,2765,2768,2770,2773,2775,2778,2780],{"class":335,"line":441},[333,2740,2741],{"class":1098},"    body",[333,2743,365],{"class":354},[333,2745,389],{"class":354},[333,2747,2748],{"class":1098}," en",[333,2750,365],{"class":354},[333,2752,1113],{"class":354},[333,2754,2755],{"class":535},"Hi team,",[333,2757,2758],{"class":350},"\\n\\n",[333,2760,2761],{"class":535},"{{answer.name}} wrote via {{form.name}}:",[333,2763,2764],{"class":350},"\\n",[333,2766,2767],{"class":535},"{{answer.message}}",[333,2769,2758],{"class":350},[333,2771,2772],{"class":535},"All answers:",[333,2774,2764],{"class":350},[333,2776,2777],{"class":535},"{{answers}}",[333,2779,532],{"class":354},[333,2781,438],{"class":354},[333,2783,2784],{"class":335,"line":447},[333,2785,450],{"class":354},[333,2787,2788],{"class":335,"line":453},[333,2789,1397],{"class":354},[621,2791,2792,2801],{},[624,2793,2794],{},[627,2795,2796,2798],{},[630,2797,1001],{},[630,2799,2800],{},"Replaced with",[643,2802,2803,2819,2831,2844,2857,2867,2877],{},[627,2804,2805,2816],{},[648,2806,2807,181,2810,181,2813],{},[178,2808,2809],{},"{{form.name}}",[178,2811,2812],{},"{{form.slug}}",[178,2814,2815],{},"{{form.version}}",[648,2817,2818],{},"The form's name, slug and version",[627,2820,2821,2826],{},[648,2822,2823],{},[178,2824,2825],{},"{{submission.id}}",[648,2827,2828,2829,506],{},"The stored submission id (empty when ",[178,2830,289],{},[627,2832,2833,2841],{},[648,2834,2835,181,2838],{},[178,2836,2837],{},"{{submission.createdAt}}",[178,2839,2840],{},"{{submission.locale}}",[648,2842,2843],{},"ISO timestamp and locale of the submission",[627,2845,2846,2850],{},[648,2847,2848],{},[178,2849,2777],{},[648,2851,2852,2853,2856],{},"All visible answers as ",[178,2854,2855],{},"label: value"," lines (a table in the HTML version), without captcha",[627,2858,2859,2864],{},[648,2860,2861],{},[178,2862,2863],{},"{{answer.\u003CfieldKey>}}",[648,2865,2866],{},"One answer, formatted like the default email: option labels, joined lists, file names, yes\u002Fno per locale",[627,2868,2869,2874],{},[648,2870,2871],{},[178,2872,2873],{},"{{files}}",[648,2875,2876],{},"Names of the files stored with the submission",[627,2878,2879,2884],{},[648,2880,2881],{},[178,2882,2883],{},"{{replyTo}}",[648,2885,2886,2887],{},"The reply-to address taken from ",[178,2888,2156],{},[250,2890,2891,2898,2904,2911],{},[253,2892,2893,2894,2897],{},"Whitespace inside the braces is ignored. Unknown variables, hidden fields and unanswered fields render empty; the\nadmin definition check warns about unknown variables (",[178,2895,2896],{},"unknownBodyVariables(definition)",") but never fails the save.",[253,2899,2900,2901,2903],{},"Values are inserted once and never re-scanned, so an answer containing ",[178,2902,2809],{}," stays literal.",[253,2905,2906,2907,2910],{},"The body is plain text. The HTML version escapes every value and turns newlines into ",[178,2908,2909],{},"\u003Cbr>",". In the subject, line\nbreaks are collapsed so an answer cannot inject headers.",[253,2912,2913,2914,546,2916,181,2919,181,2922,2925],{},"Rendering lives in ",[178,2915,1084],{},[178,2917,2918],{},"composeEmail",[178,2920,2921],{},"renderTemplateText",[178,2923,2924],{},"renderTemplateHtml","), so the\nbuilder previews the exact result with sample answers.",[2159,2927,2928],{"id":1604},"Captcha",[159,2930,2165,2931,2933],{},[178,2932,1604],{}," field renders Cloudflare Turnstile, Google reCAPTCHA v2 (checkbox) or hCaptcha.",[324,2935,2937],{"className":326,"code":2936,"language":328,"meta":329,"style":329},"type CaptchaConfig = {\n  provider?: 'turnstile' | 'recaptcha' | 'hcaptcha' \u002F\u002F default: captcha.defaultProvider\n  siteKey?: string \u002F\u002F public; overrides the configured site key for this field\n  theme?: 'auto' | 'light' | 'dark'\n  size?: 'normal' | 'compact'\n}\n\n{ key: 'human', type: 'captcha', captcha: { provider: 'turnstile' } }\n",[178,2938,2939,2949,2981,2993,3025,3048,3052,3056],{"__ignoreMap":329},[333,2940,2941,2943,2945,2947],{"class":335,"line":336},[333,2942,1095],{"class":509},[333,2944,1813],{"class":1098},[333,2946,568],{"class":354},[333,2948,368],{"class":354},[333,2950,2951,2954,2956,2958,2960,2962,2964,2966,2968,2970,2972,2974,2976,2978],{"class":335,"line":358},[333,2952,2953],{"class":361},"  provider",[333,2955,1178],{"class":354},[333,2957,1113],{"class":354},[333,2959,922],{"class":535},[333,2961,532],{"class":354},[333,2963,1121],{"class":354},[333,2965,1113],{"class":354},[333,2967,925],{"class":535},[333,2969,532],{"class":354},[333,2971,1121],{"class":354},[333,2973,1113],{"class":354},[333,2975,929],{"class":535},[333,2977,532],{"class":354},[333,2979,2980],{"class":485}," \u002F\u002F default: captcha.defaultProvider\n",[333,2982,2983,2986,2988,2990],{"class":335,"line":371},[333,2984,2985],{"class":361},"  siteKey",[333,2987,1178],{"class":354},[333,2989,1210],{"class":1098},[333,2991,2992],{"class":485}," \u002F\u002F public; overrides the configured site key for this field\n",[333,2994,2995,2998,3000,3002,3005,3007,3009,3011,3014,3016,3018,3020,3023],{"class":335,"line":381},[333,2996,2997],{"class":361},"  theme",[333,2999,1178],{"class":354},[333,3001,1113],{"class":354},[333,3003,3004],{"class":535},"auto",[333,3006,532],{"class":354},[333,3008,1121],{"class":354},[333,3010,1113],{"class":354},[333,3012,3013],{"class":535},"light",[333,3015,532],{"class":354},[333,3017,1121],{"class":354},[333,3019,1113],{"class":354},[333,3021,3022],{"class":535},"dark",[333,3024,1607],{"class":354},[333,3026,3027,3030,3032,3034,3037,3039,3041,3043,3046],{"class":335,"line":441},[333,3028,3029],{"class":361},"  size",[333,3031,1178],{"class":354},[333,3033,1113],{"class":354},[333,3035,3036],{"class":535},"normal",[333,3038,532],{"class":354},[333,3040,1121],{"class":354},[333,3042,1113],{"class":354},[333,3044,3045],{"class":535},"compact",[333,3047,1607],{"class":354},[333,3049,3050],{"class":335,"line":447},[333,3051,1397],{"class":354},[333,3053,3054],{"class":335,"line":453},[333,3055,1404],{"emptyLinePlaceholder":1403},[333,3057,3058,3060,3062,3064,3066,3069,3071,3073,3075,3077,3079,3081,3083,3085,3088,3090,3092,3095,3097,3099,3101,3103,3105],{"class":335,"line":1202},[333,3059,2251],{"class":354},[333,3061,2254],{"class":361},[333,3063,365],{"class":354},[333,3065,1113],{"class":354},[333,3067,3068],{"class":535},"human",[333,3070,532],{"class":354},[333,3072,401],{"class":354},[333,3074,2268],{"class":361},[333,3076,365],{"class":354},[333,3078,1113],{"class":354},[333,3080,1604],{"class":535},[333,3082,532],{"class":354},[333,3084,401],{"class":354},[333,3086,3087],{"class":361}," captcha",[333,3089,365],{"class":354},[333,3091,389],{"class":354},[333,3093,3094],{"class":361}," provider",[333,3096,365],{"class":354},[333,3098,1113],{"class":354},[333,3100,922],{"class":535},[333,3102,532],{"class":354},[333,3104,1350],{"class":354},[333,3106,1788],{"class":354},[250,3108,3109,3126,3136,3142],{},[253,3110,3111,3113,3114,3117,3118,3122,3123,3125],{},[163,3112,2087],{}," Site key: the field's ",[178,3115,3116],{},"siteKey",", else the configured one. Secret key: the form's own encrypted secret\n(see ",[175,3119,3121],{"href":3120},"#per-form-secrets","Per-form secrets","), else the configured one, else the check fails closed. The admin builder\nwarns when a provider has neither a field ",[178,3124,3116],{}," nor a configured site key.",[253,3127,3128,3131,3132,3135],{},[163,3129,3130],{},"Client."," The provider script loads lazily in the browser only. The token lives in the form state under the field\nkey, the widget resets after every failed submit, and the token is ",[163,3133,3134],{},"never"," stored, delivered or shown in the\npreview JSON. In the admin preview and \"Try it\" modal the field is a stub that supplies a dummy token.",[253,3137,3138,3141],{},[163,3139,3140],{},"Server."," The token is verified (with the visitor's IP) against the provider's siteverify endpoint before anything\nis stored or delivered.",[253,3143,3144,3147,3148,3151],{},[163,3145,3146],{},"Token access."," Submissions with a valid form API token (",[178,3149,3150],{},"access.auth: 'token'",") skip the captcha.",[621,3153,3154,3164],{},[624,3155,3156],{},[627,3157,3158,3161],{},[630,3159,3160],{},"Outcome",[630,3162,3163],{},"Status",[643,3165,3166,3177,3187],{},[627,3167,3168,3171],{},[648,3169,3170],{},"Token missing or invalid",[648,3172,3173,3176],{},[178,3174,3175],{},"422"," with an issue on the captcha field key",[627,3178,3179,3182],{},[648,3180,3181],{},"Provider has no secret key (fails closed)",[648,3183,3184],{},[178,3185,3186],{},"500",[627,3188,3189,3192],{},[648,3190,3191],{},"Provider unreachable",[648,3193,3194],{},[178,3195,3196],{},"502",[159,3198,3199,3200,3206],{},"Hosts and tests can replace the network call with the ",[175,3201,3203],{"href":3202},"#hooks",[178,3204,3205],{},"forms:captcha:verify"," hook.",[2159,3208,3210],{"id":3209},"visual-builder","Visual builder",[159,3212,3213,3214,3216,3217,181,3220,181,3223,209,3226,3229,3230,3233,3234,3237],{},"The admin editor (",[178,3215,721],{},") has ",[163,3218,3219],{},"Builder",[163,3221,3222],{},"Delivery & storage",[163,3224,3225],{},"Access",[163,3227,3228],{},"JSON"," tabs, all editing\nthe same unsaved definition (so they are state tabs, not routes); ",[163,3231,3232],{},"Save form"," is only enabled while it passes\nvalidation. The heading carries the breadcrumb back to the list, the form's status badge and a ",[178,3235,3236],{},"⋯"," menu with\nSubmissions, Copy link, Duplicate form and Archive form.",[250,3239,3240,3251,3257],{},[253,3241,3242,3243,926,3247,3250],{},"Pick ",[3244,3245,3246],"em",{},"Single page",[3244,3248,3249],{},"Stepped"," (switching to single merges all steps), drag field types from the palette (or click\nto append), and drag fields or step headers to re-order. Every row has up\u002Fdown buttons for pointer-free use; drag and\ndrop uses the browser's native API.",[253,3252,3253,3254,3256],{},"Selecting a field or step opens its settings: label, help text, placeholder, required, options, limits, its step and\na ",[178,3255,2054],{}," condition on an earlier field.",[253,3258,3259,3260,3263],{},"Every text has a language button: plain text is the same in every language, and translating turns it into a map with\none row per locale (the host's ",[178,3261,3262],{},"@nuxtjs\u002Fi18n"," locales, plus any code you add). Empty languages are dropped.",[245,3265,3267],{"id":3266},"server","Server",[2159,3269,3271],{"id":3270},"submitting","Submitting",[159,3273,3274,3277,3278,3281,3282,3285,3286,3289,3290,3293,3294,3297,3298,546,3301,919,3304,3307,3308,3310,3311,3314,3315,173,3318,243],{},[178,3275,3276],{},"POST \u002Fapi\u002Fforms\u002F:slug\u002Fsubmit"," takes JSON ",[178,3279,3280],{},"{ answers, locale }",", or ",[178,3283,3284],{},"multipart\u002Fform-data"," with an ",[178,3287,3288],{},"answers"," JSON part,\na ",[178,3291,3292],{},"locale"," part and one ",[178,3295,3296],{},"file:\u003Ckey>"," part per file. The response is ",[178,3299,3300],{},"{ ok: true, id }",[178,3302,3303],{},"id",[178,3305,3306],{},"null"," when\n",[178,3309,289],{},"). ",[178,3312,3313],{},"GET \u002Fapi\u002Fforms\u002F:slug"," returns the published definition ",[163,3316,3317],{},"without",[178,3319,2688],{},[621,3321,3322,3331],{},[624,3323,3324],{},[627,3325,3326,3328],{},[630,3327,3163],{},[630,3329,3330],{},"Cause",[643,3332,3333,3349,3360,3370,3383,3397],{},[627,3334,3335,3340],{},[648,3336,3337],{},[178,3338,3339],{},"401",[648,3341,3342,3345,3346,506],{},[178,3343,3344],{},"access.auth"," is not satisfied (sign-in, token or password missing or wrong; ",[178,3347,3348],{},"data.access: true",[627,3350,3351,3355],{},[648,3352,3353],{},[178,3354,2649],{},[648,3356,3357,3358,506],{},"The form is closed (",[178,3359,2652],{},[627,3361,3362,3367],{},[648,3363,3364],{},[178,3365,3366],{},"404",[648,3368,3369],{},"Unknown or unpublished form",[627,3371,3372,3376],{},[648,3373,3374],{},[178,3375,3175],{},[648,3377,3378,3379,3382],{},"Validation errors in ",[178,3380,3381],{},"data.issues",", or a failed captcha",[627,3384,3385,3390],{},[648,3386,3387],{},[178,3388,3389],{},"429",[648,3391,3392,3393,3396],{},"Rate limit hit (",[178,3394,3395],{},"Retry-After"," header)",[627,3398,3399,3406],{},[648,3400,3401,3403,3404],{},[178,3402,3186],{}," \u002F ",[178,3405,3196],{},[648,3407,3408,3409,3411,3412,3414],{},"Captcha not configured \u002F unreachable; ",[178,3410,3196],{}," is also returned when ",[178,3413,289],{}," delivery fails",[2159,3416,3225],{"id":2424},[159,3418,3419,3420,3422],{},"A form's ",[178,3421,2424],{}," decides who may read and submit it. Secrets are never part of the definition.",[621,3424,3425,3437],{},[624,3426,3427],{},[627,3428,3429,3434],{},[630,3430,3431],{},[178,3432,3433],{},"auth",[630,3435,3436],{},"Submitter proves access with",[643,3438,3439,3448,3461,3476],{},[627,3440,3441,3445],{},[648,3442,3443],{},[178,3444,1152],{},[648,3446,3447],{},"Nothing",[627,3449,3450,3454],{},[648,3451,3452],{},[178,3453,1988],{},[648,3455,3456,3457,3460],{},"A signed-in user (cookie session or a token with the ",[178,3458,3459],{},"forms:submit"," scope)",[627,3462,3463,3467],{},[648,3464,3465],{},[178,3466,1997],{},[648,3468,3469,926,3472,3475],{},[178,3470,3471],{},"Authorization: Bearer \u003Ctoken>",[178,3473,3474],{},"x-form-token: \u003Ctoken>","; tokens are created per form in the admin and shown once",[627,3477,3478,3482],{},[648,3479,3480],{},[178,3481,2006],{},[648,3483,3484,3485,3488,3489,3492],{},"The shared password in the ",[178,3486,3487],{},"x-form-password"," header (",[178,3490,3491],{},"FORM_PASSWORD_HEADER"," on the client)",[250,3494,3495,3508,3515,3518],{},[253,3496,3497,3498,3501,3502,209,3505,243],{},"Tokens (",[178,3499,3500],{},"ffk_...",") are stored as SHA-256 hashes with a display prefix, ",[178,3503,3504],{},"lastUsedAt",[178,3506,3507],{},"revokedAt",[253,3509,3510,3511,3514],{},"The password is stored as a scrypt hash in ",[178,3512,3513],{},"form_access",". With no password set the form stays closed.",[253,3516,3517],{},"Wrong password attempts count against the rate limit per client and form.",[253,3519,3520,3522],{},[178,3521,2143],{}," only removes the public page; the API still serves the form.",[2159,3524,3526],{"id":3525},"rate-limiting","Rate limiting",[159,3528,3529,3530,3533,3534,3537,3538,213,3540,3542],{},"Submissions are counted per client IP and form in KV with a fixed window (",[178,3531,3532],{},"rateLimit"," per ",[178,3535,3536],{},"rateLimitWindowSeconds",").\nThe count is read then written, so it is not exact under concurrency, which is fine for casual abuse. Over the limit\nthe response is ",[178,3539,3389],{},[178,3541,3395],{},". Wrong password attempts use the same limit and window.",[2159,3544,3121],{"id":3545},"per-form-secrets",[159,3547,3548,3549,3552,3553,3556,3557,3560],{},"Secrets that belong to one form (today the captcha secret keys) live in the ",[178,3550,3551],{},"form_secrets"," table, ",[163,3554,3555],{},"encrypted on the\nserver"," with AES-256-GCM (a random 12-byte IV per write, scrypt-derived key, stored as ",[178,3558,3559],{},"{ ct, iv, tag }","). They are\nkept apart from the definition, so they never end up in definition versions, submission snapshots, deliveries,\nimports or the public API. Values are write-only.",[250,3562,3563,3575,3585],{},[253,3564,3565,3568,3569,3571,3572,3574],{},[163,3566,3567],{},"Key",": ",[178,3570,974],{},", else ",[178,3573,988],{},", else the session password, so it works out of the box. Set a\ndedicated key in production so that changing the session password does not affect it.",[253,3576,3577,3580,3581,3584],{},[163,3578,3579],{},"Rotation",": changing the key makes stored secrets unreadable. The admin API then reports ",[178,3582,3583],{},"unreadable: true"," (the\nbuilder shows a warning) and checks fall back to the configured key; entering the secrets again replaces them.",[253,3586,3587,3588,181,3591,181,3594,243],{},"Allowed keys: ",[178,3589,3590],{},"captcha.turnstile.secretKey",[178,3592,3593],{},"captcha.recaptcha.secretKey",[178,3595,3596],{},"captcha.hcaptcha.secretKey",[2159,3598,866],{"id":3599},"seeding-and-import",[159,3601,3602],{},"Nothing is inserted automatically. Two explicit ways to load definitions; both only insert slugs that do not exist yet\nand never overwrite existing forms:",[250,3604,3605,3611],{},[253,3606,3607,3610],{},[178,3608,3609],{},"seed: { enabled: true, forms: [...] }"," inserts at startup.",[253,3612,3613,3614,3617,3618,3621,3622,3625,3626,243],{},"The admin ",[163,3615,3616],{},"Import"," button (",[178,3619,3620],{},"POST \u002Fapi\u002Fforms\u002Fadmin\u002Fimport",") takes ",[178,3623,3624],{},"{ forms: [{ slug, name, definition }] }"," and\nreturns ",[178,3627,3628],{},"{ inserted, skipped }",[2159,3630,3632],{"id":3631},"admin-list-and-actions","Admin list and actions",[159,3634,3635,3636,3638,3639,213,3642,3645,3646,3649,3650,3652,3653,3656,3657,181,3660,181,3663,3666,3667,209,3670,3673,3674,3677,3678,3681],{},"The list (",[178,3637,694],{},") is a ",[178,3640,3641],{},"PageHeading",[163,3643,3644],{},"New form"," (a slideover) and ",[163,3647,3648],{},"Import JSON",", a search box and\nstatus filter, and a table whose rows open the editor. Each row's ",[178,3651,3236],{}," menu offers Open, Submissions, Copy link and\nDuplicate form, and Archive form (after a confirmation) in its own group. The same menu is built by\n",[178,3654,3655],{},"useFormActions().menu(form, { extra?, onRemoved? })",", which also exposes ",[178,3658,3659],{},"create",[178,3661,3662],{},"clone",[178,3664,3665],{},"remove"," (archives),\n",[178,3668,3669],{},"importJson",[178,3671,3672],{},"redeliver",", so a host page can offer the same actions. A submission's menu offers Open and Deliver\nagain. The old ",[178,3675,3676],{},"dashboard.account"," tile is gone: forms appears in the admin sidebar (",[178,3679,3680],{},"admin.nav",") only.",[2159,3683,3685],{"id":3684},"cloning","Cloning",[159,3687,3688,3691,3692,3695,3696,3699],{},[178,3689,3690],{},"POST \u002Fapi\u002Fforms\u002Fadmin\u002Fforms\u002F:id\u002Fclone"," copies a form's name and definition into a new draft (slug ",[178,3693,3694],{},"\u003Cslug>-copy",", then\n",[178,3697,3698],{},"-copy-2",", ...). Submissions, tokens, the password and secrets are not copied.",[2159,3701,77],{"id":3702},"authorization",[159,3704,3705,3706,3709,3710,3713,3714,3716,3717,3720,3721,1081,3724,3727,3728,3731,3732,209,3734,3737],{},"Admin routes require a user holding the ",[178,3707,3708],{},"forms:manage"," scope ",[163,3711,3712],{},"and"," the ",[178,3715,536],{}," hook allowing them,\n",[163,3718,3719],{},"denied by default",". Set ",[178,3722,3723],{},"ctx.allowed",[178,3725,3726],{},"ctx.userId","; never read the session from ",[178,3729,3730],{},"ctx.event",", which is empty for\nbearer requests. The ",[178,3733,3708],{},[178,3735,3736],{},"forms:pii"," scopes are only offered to users the policy lets in.",[2159,3739,3741],{"id":3740},"auth-scopes","Auth scopes",[621,3743,3744,3754],{},[624,3745,3746],{},[627,3747,3748,3751],{},[630,3749,3750],{},"Scope",[630,3752,3753],{},"Allows",[643,3755,3756,3767,3776],{},[627,3757,3758,3762],{},[648,3759,3760],{},[178,3761,3708],{},[648,3763,3764,3765],{},"Manage forms and submissions (staff), also gated by ",[178,3766,536],{},[627,3768,3769,3773],{},[648,3770,3771],{},[178,3772,3459],{},[648,3774,3775],{},"Submit forms as the user (and read forms that need a signed-in user)",[627,3777,3778,3782],{},[648,3779,3780],{},[178,3781,3736],{},[648,3783,3784,3785,506],{},"See submission answers and file names through MCP tools (also needs ",[178,3786,3708],{},[2159,3788,3790],{"id":3789},"mcp-tools","MCP tools",[159,3792,3793,3794,365],{},"With ",[178,3795,3796],{},"settings.mcp: true",[621,3798,3799,3810],{},[624,3800,3801],{},[627,3802,3803,3806,3808],{},[630,3804,3805],{},"Tool",[630,3807,3750],{},[630,3809,641],{},[643,3811,3812,3832,3855],{},[627,3813,3814,3825,3829],{},[648,3815,3816,181,3819,181,3822],{},[178,3817,3818],{},"list-forms",[178,3820,3821],{},"get-form",[178,3823,3824],{},"submit-form",[648,3826,3827],{},[178,3828,3459],{},[648,3830,3831],{},"Browse published forms and submit as the user",[627,3833,3834,3848,3852],{},[648,3835,3836,181,3839,181,3842,181,3845],{},[178,3837,3838],{},"list-all-forms",[178,3840,3841],{},"get-form-definition",[178,3843,3844],{},"create-form",[178,3846,3847],{},"update-form",[648,3849,3850],{},[178,3851,3708],{},[648,3853,3854],{},"Manage forms; delivery settings are never returned or changed",[627,3856,3857,3865,3869],{},[648,3858,3859,181,3862],{},[178,3860,3861],{},"list-submissions",[178,3863,3864],{},"get-submission",[648,3866,3867],{},[178,3868,3708],{},[648,3870,3871,3872,3874],{},"Submissions; answers, submitter and file names need ",[178,3873,3736],{}," too",[245,3876,3878],{"id":3877},"app","App",[2159,3880,3882],{"id":3881},"pages","Pages",[621,3884,3885,3897],{},[624,3886,3887],{},[627,3888,3889,3892,3895],{},[630,3890,3891],{},"Page",[630,3893,3894],{},"Default path",[630,3896,632],{},[643,3898,3899,3913,3927,3941,3955],{},[627,3900,3901,3904,3908],{},[648,3902,3903],{},"Public form",[648,3905,3906],{},[178,3907,673],{},[648,3909,3910],{},[178,3911,3912],{},"pages.form",[627,3914,3915,3918,3922],{},[648,3916,3917],{},"Admin list",[648,3919,3920],{},[178,3921,694],{},[648,3923,3924],{},[178,3925,3926],{},"pages.admin",[627,3928,3929,3932,3936],{},[648,3930,3931],{},"Admin editor",[648,3933,3934],{},[178,3935,721],{},[648,3937,3938],{},[178,3939,3940],{},"pages.adminForm",[627,3942,3943,3946,3950],{},[648,3944,3945],{},"Submissions",[648,3947,3948],{},[178,3949,744],{},[648,3951,3952],{},[178,3953,3954],{},"pages.adminSubmissions",[627,3956,3957,3960,3964],{},[648,3958,3959],{},"One submission",[648,3961,3962],{},[178,3963,770],{},[648,3965,3966],{},[178,3967,3968],{},"pages.adminSubmission",[159,3970,3971,3972,3974],{},"Any can be a custom path string. The admin paths follow the configured ",[175,3973,69],{"href":70}," base.",[2159,3976,3978],{"id":3977},"components","Components",[621,3980,3981,3994],{},[624,3982,3983],{},[627,3984,3985,3988,3991],{},[630,3986,3987],{},"Component",[630,3989,3990],{},"Props",[630,3992,3993],{},"Notes",[643,3995,3996,4033,4055,4078],{},[627,3997,3998,4003,4020],{},[648,3999,4000],{},[178,4001,4002],{},"\u003CFormRenderer>",[648,4004,4005,181,4008,181,4011,181,4014,181,4017],{},[178,4006,4007],{},"slug?",[178,4009,4010],{},"form?",[178,4012,4013],{},"password?",[178,4015,4016],{},"preview?",[178,4018,4019],{},"locale?",[648,4021,4022,4023,4026,4027,209,4030,243],{},"Renders a published form (by ",[178,4024,4025],{},"slug",") or a given definition. Emits ",[178,4028,4029],{},"submitted(id)",[178,4031,4032],{},"previewed(answers)",[627,4034,4035,4040,4052],{},[648,4036,4037],{},[178,4038,4039],{},"\u003CFormEmbed>",[648,4041,4042,181,4044,181,4047,181,4049],{},[178,4043,4025],{},[178,4045,4046],{},"title?",[178,4048,4019],{},[178,4050,4051],{},"class?",[648,4053,4054],{},"Embeds a published form, honoring its access settings. Registered globally.",[627,4056,4057,4062,4075],{},[648,4058,4059],{},[178,4060,4061],{},"\u003CFormPreview>",[648,4063,4064,181,4066,181,4069,181,4072],{},[178,4065,4025],{},[178,4067,4068],{},"name?",[178,4070,4071],{},"definition?",[178,4073,4074],{},"contentKey?",[648,4076,4077],{},"Admin preview.",[627,4079,4080,4085,4090],{},[648,4081,4082],{},[178,4083,4084],{},"\u003CFormSubmissionView>",[648,4086,4087],{},[178,4088,4089],{},"submission",[648,4091,4092],{},"Renders a submission against the definition it was answered with.",[2159,4094,4096],{"id":4095},"embedding-in-markdown","Embedding in Markdown",[159,4098,4099,4102,4103,4106,4107,4112,4113,4116],{},[178,4100,4101],{},"FormEmbed"," is registered ",[163,4104,4105],{},"globally",", so ",[175,4108,4111],{"href":4109,"rel":4110},"https:\u002F\u002Fcontent.nuxt.com",[467],"Nuxt Content"," (MDC) resolves it in any collection\nwithout a wrapper. Use the block syntax: the embed renders block elements, so inline ",[178,4114,4115],{},":form-embed{...}"," would place\nthem inside a paragraph.",[324,4118,4122],{"className":4119,"code":4120,"language":4121,"meta":329,"style":329},"language-md shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","::form-embed{slug=\"contact\"}\n::\n\n::form-embed{slug=\"contact\" title locale=\"da\" class=\"max-w-2xl my-8\"}\n::\n","md",[178,4123,4124,4129,4134,4138,4143],{"__ignoreMap":329},[333,4125,4126],{"class":335,"line":336},[333,4127,4128],{"class":350},"::form-embed{slug=\"contact\"}\n",[333,4130,4131],{"class":335,"line":358},[333,4132,4133],{"class":350},"::\n",[333,4135,4136],{"class":335,"line":371},[333,4137,1404],{"emptyLinePlaceholder":1403},[333,4139,4140],{"class":335,"line":381},[333,4141,4142],{"class":350},"::form-embed{slug=\"contact\" title locale=\"da\" class=\"max-w-2xl my-8\"}\n",[333,4144,4145],{"class":335,"line":441},[333,4146,4133],{"class":350},[621,4148,4149,4162],{},[624,4150,4151],{},[627,4152,4153,4156,4158,4160],{},[630,4154,4155],{},"Prop",[630,4157,635],{},[630,4159,638],{},[630,4161,641],{},[643,4163,4164,4179,4197,4213],{},[627,4165,4166,4170,4174,4176],{},[648,4167,4168],{},[178,4169,4025],{},[648,4171,4172],{},[178,4173,907],{},[648,4175,1152],{},[648,4177,4178],{},"Required. Slug of a published form.",[627,4180,4181,4186,4190,4194],{},[648,4182,4183],{},[178,4184,4185],{},"title",[648,4187,4188],{},[178,4189,825],{},[648,4191,4192],{},[178,4193,830],{},[648,4195,4196],{},"Show the form's name as a heading.",[627,4198,4199,4203,4207,4210],{},[648,4200,4201],{},[178,4202,3292],{},[648,4204,4205],{},[178,4206,907],{},[648,4208,4209],{},"app locale",[648,4211,4212],{},"Overrides the locale of the form's translated texts.",[627,4214,4215,4220,4224,4226],{},[648,4216,4217],{},[178,4218,4219],{},"class",[648,4221,4222],{},[178,4223,907],{},[648,4225,1152],{},[648,4227,4228,4229,2131],{},"Extra classes for the wrapper (it has ",[178,4230,4231],{},"not-prose",[159,4233,4234,4235,4238],{},"The embed uses ",[178,4236,4237],{},"GET \u002Fapi\u002Fforms\u002F:slug\u002Faccess"," and follows the access settings:",[621,4240,4241,4251],{},[624,4242,4243],{},[627,4244,4245,4248],{},[630,4246,4247],{},"Form state",[630,4249,4250],{},"Renders",[643,4252,4253,4261,4269,4283,4293],{},[627,4254,4255,4258],{},[648,4256,4257],{},"Open",[648,4259,4260],{},"The form, with a loading skeleton; success message or redirect handled by the renderer",[627,4262,4263,4266],{},[648,4264,4265],{},"Unknown or unpublished",[648,4267,4268],{},"A \"could not be found\" alert",[627,4270,4271,4276],{},[648,4272,4273],{},[178,4274,4275],{},"auth: 'user'",[648,4277,4278,4279,4282],{},"A sign-in prompt linking to the login page (with a ",[178,4280,4281],{},"redirect"," back)",[627,4284,4285,4290],{},[648,4286,4287],{},[178,4288,4289],{},"auth: 'password'",[648,4291,4292],{},"The password gate",[627,4294,4295,4301],{},[648,4296,4297,926,4299],{},[178,4298,2143],{},[178,4300,2139],{},[648,4302,4303],{},"Nothing (a console warning in development names the slug)",[2159,4305,4307],{"id":4306},"composables","Composables",[159,4309,4310,4311,243],{},"Auto-imported, also available from ",[178,4312,4313],{},"@frigear-nu\u002Fforms\u002Fcomposables",[324,4315,4317],{"className":326,"code":4316,"language":328,"meta":329,"style":329},"useForm(slug: MaybeRefOrGetter\u003Cstring>, password?: MaybeRefOrGetter\u003Cstring | undefined>) \u002F\u002F published definition\nuseFormAccess(slug: MaybeRefOrGetter\u003Cstring>) \u002F\u002F FormAccessInfoDto: access, signedIn, open, opensAt\nuseFormsLocale() \u002F useFormsLocales() \u002F\u002F current locale \u002F available locales\nuseFormsPaths() \u002F\u002F (name, params?) => resolved page path\nuseFormLink() \u002F\u002F { enabled, url(slug), copy(slug) }\nuseFormStepper(...) \u002F\u002F step navigation of the renderer\nFORM_PASSWORD_HEADER \u002F\u002F 'x-form-password'\n",[178,4318,4319,4359,4377,4395,4405,4415,4430],{"__ignoreMap":329},[333,4320,4321,4324,4327,4329,4331,4334,4337,4339,4342,4344,4347,4350,4353,4356],{"class":335,"line":336},[333,4322,4323],{"class":346},"useForm",[333,4325,4326],{"class":350},"(slug: MaybeRefOrGetter",[333,4328,1336],{"class":354},[333,4330,907],{"class":350},[333,4332,4333],{"class":354},">,",[333,4335,4336],{"class":350}," password",[333,4338,1178],{"class":354},[333,4340,4341],{"class":350}," MaybeRefOrGetter",[333,4343,1336],{"class":354},[333,4345,4346],{"class":350},"string ",[333,4348,4349],{"class":354},"|",[333,4351,4352],{"class":354}," undefined>",[333,4354,4355],{"class":350},") ",[333,4357,4358],{"class":485},"\u002F\u002F published definition\n",[333,4360,4361,4364,4366,4368,4370,4372,4374],{"class":335,"line":358},[333,4362,4363],{"class":346},"useFormAccess",[333,4365,4326],{"class":350},[333,4367,1336],{"class":354},[333,4369,907],{"class":350},[333,4371,1347],{"class":354},[333,4373,4355],{"class":350},[333,4375,4376],{"class":485},"\u002F\u002F FormAccessInfoDto: access, signedIn, open, opensAt\n",[333,4378,4379,4382,4385,4387,4390,4392],{"class":335,"line":371},[333,4380,4381],{"class":346},"useFormsLocale",[333,4383,4384],{"class":350},"() ",[333,4386,2066],{"class":354},[333,4388,4389],{"class":346}," useFormsLocales",[333,4391,4384],{"class":350},[333,4393,4394],{"class":485},"\u002F\u002F current locale \u002F available locales\n",[333,4396,4397,4400,4402],{"class":335,"line":381},[333,4398,4399],{"class":346},"useFormsPaths",[333,4401,4384],{"class":350},[333,4403,4404],{"class":485},"\u002F\u002F (name, params?) => resolved page path\n",[333,4406,4407,4410,4412],{"class":335,"line":441},[333,4408,4409],{"class":346},"useFormLink",[333,4411,4384],{"class":350},[333,4413,4414],{"class":485},"\u002F\u002F { enabled, url(slug), copy(slug) }\n",[333,4416,4417,4420,4422,4425,4427],{"class":335,"line":447},[333,4418,4419],{"class":346},"useFormStepper",[333,4421,351],{"class":350},[333,4423,4424],{"class":354},"...",[333,4426,4355],{"class":350},[333,4428,4429],{"class":485},"\u002F\u002F step navigation of the renderer\n",[333,4431,4432,4435],{"class":335,"line":453},[333,4433,4434],{"class":350},"FORM_PASSWORD_HEADER ",[333,4436,4437],{"class":485},"\u002F\u002F 'x-form-password'\n",[2159,4439,4441],{"id":4440},"utils","Utils",[159,4443,4444,4446],{},[178,4445,1084],{}," is pure and safe in the Vue app and in Nitro.",[621,4448,4449,4458],{},[624,4450,4451],{},[627,4452,4453,4456],{},[630,4454,4455],{},"Export",[630,4457,641],{},[643,4459,4460,4476,4492,4508,4524,4535,4554,4569],{},[627,4461,4462,4473],{},[648,4463,4464,181,4467,181,4470],{},[178,4465,4466],{},"defineForm",[178,4468,4469],{},"parseFormDefinition",[178,4471,4472],{},"formDefinitionSchema",[648,4474,4475],{},"Author and validate definitions",[627,4477,4478,4489],{},[648,4479,4480,181,4483,181,4486],{},[178,4481,4482],{},"buildFormSchema",[178,4484,4485],{},"buildFieldSchema",[178,4487,4488],{},"validatedFields",[648,4490,4491],{},"Compile a definition to zod",[627,4493,4494,4505],{},[648,4495,4496,181,4499,181,4502],{},[178,4497,4498],{},"evaluateCondition",[178,4500,4501],{},"resolveVisibility",[178,4503,4504],{},"isFieldVisible",[648,4506,4507],{},"Conditional visibility",[627,4509,4510,4521],{},[648,4511,4512,181,4515,181,4518],{},[178,4513,4514],{},"resolveAccess",[178,4516,4517],{},"defaultAccess",[178,4519,4520],{},"accessSchema",[648,4522,4523],{},"Effective access of a definition",[627,4525,4526,4532],{},[648,4527,4528,181,4530],{},[178,4529,2655],{},[178,4531,2659],{},[648,4533,4534],{},"Open period",[627,4536,4537,4551],{},[648,4538,4539,181,4541,181,4543,181,4545,181,4548],{},[178,4540,2918],{},[178,4542,2921],{},[178,4544,2924],{},[178,4546,4547],{},"unknownBodyVariables",[178,4549,4550],{},"availableVariables",[648,4552,4553],{},"Email rendering",[627,4555,4556,4566],{},[648,4557,4558,181,4560,181,4562,181,4564],{},[178,4559,2379],{},[178,4561,2382],{},[178,4563,2385],{},[178,4565,2388],{},[648,4567,4568],{},"Phone numbers",[627,4570,4571,4582],{},[648,4572,4573,181,4576,181,4579],{},[178,4574,4575],{},"resolveEmailDelivery",[178,4577,4578],{},"resolveCaptcha",[178,4580,4581],{},"renderMarkdown",[648,4583,4584],{},"Delivery recipients, captcha provider, static markdown",[159,4586,4587,4588,181,4591,181,4594,4597],{},"The builder helpers (",[178,4589,4590],{},"moveField",[178,4592,4593],{},"insertField",[178,4595,4596],{},"setAccess",", ...) are exported from the same path.",[245,4599,4600],{"id":522},"Hooks",[159,4602,4603,4604,243],{},"Nitro runtime hooks, registered from a server plugin with ",[178,4605,4606],{},"nitro.hooks.hook(name, handler)",[621,4608,4609,4622],{},[624,4610,4611],{},[627,4612,4613,4616,4619],{},[630,4614,4615],{},"Hook",[630,4617,4618],{},"When",[630,4620,4621],{},"Payload",[643,4623,4624,4643,4660,4682],{},[627,4625,4626,4630,4633],{},[648,4627,4628],{},[178,4629,536],{},[648,4631,4632],{},"A staff route is called",[648,4634,4635,4638,4639,4642],{},[178,4636,4637],{},"{ event, userId: number, allowed: boolean }","; set ",[178,4640,4641],{},"allowed = true"," to let the user in",[627,4644,4645,4649,4654],{},[648,4646,4647],{},[178,4648,293],{},[648,4650,4651,4652,506],{},"A valid submission was received (and stored unless ",[178,4653,289],{},[648,4655,4656,4659],{},[178,4657,4658],{},"SubmittedContext"," (below)",[627,4661,4662,4666,4669],{},[648,4663,4664],{},[178,4665,3205],{},[648,4667,4668],{},"A captcha token must be verified",[648,4670,4671,4638,4674,4677,4678,4681],{},[178,4672,4673],{},"{ event, provider, token, ip, formId?, secretKey?, secretSource?: 'form' | 'env' | 'unset', valid: boolean | undefined }",[178,4675,4676],{},"valid"," to decide, left ",[178,4679,4680],{},"undefined"," the provider is asked",[627,4683,4684,4689,4692],{},[648,4685,4686],{},[178,4687,4688],{},"forms:delivered",[648,4690,4691],{},"Delivery finished (only fires when a handler delivered or one failed)",[648,4693,4694],{},[178,4695,4696],{},"{ submissionId: string | null, formSlug, status: 'delivered' | 'failed', error? }",[324,4698,4700],{"className":326,"code":4699,"language":328,"meta":329,"style":329},"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",[178,4701,4702,4713,4723,4777,4799,4860,4870,4884,4900,4909,4921],{"__ignoreMap":329},[333,4703,4704,4706,4709,4711],{"class":335,"line":336},[333,4705,1095],{"class":509},[333,4707,4708],{"class":1098}," SubmittedContext",[333,4710,568],{"class":354},[333,4712,368],{"class":354},[333,4714,4715,4718,4720],{"class":335,"line":358},[333,4716,4717],{"class":361},"  event",[333,4719,365],{"class":354},[333,4721,4722],{"class":1098}," H3Event\n",[333,4724,4725,4728,4730,4732,4734,4736,4738,4740,4743,4745,4747,4749,4752,4754,4756,4758,4761,4763,4766,4768,4771,4773,4775],{"class":335,"line":371},[333,4726,4727],{"class":361},"  form",[333,4729,365],{"class":354},[333,4731,389],{"class":354},[333,4733,1418],{"class":361},[333,4735,365],{"class":354},[333,4737,1210],{"class":1098},[333,4739,401],{"class":354},[333,4741,4742],{"class":361}," slug",[333,4744,365],{"class":354},[333,4746,1210],{"class":1098},[333,4748,401],{"class":354},[333,4750,4751],{"class":361}," name",[333,4753,365],{"class":354},[333,4755,1210],{"class":1098},[333,4757,401],{"class":354},[333,4759,4760],{"class":361}," version",[333,4762,365],{"class":354},[333,4764,4765],{"class":1098}," number",[333,4767,401],{"class":354},[333,4769,4770],{"class":361}," definition",[333,4772,365],{"class":354},[333,4774,1099],{"class":1098},[333,4776,1788],{"class":354},[333,4778,4779,4782,4784,4786,4788,4790,4792,4794,4796],{"class":335,"line":381},[333,4780,4781],{"class":361},"  answers",[333,4783,365],{"class":354},[333,4785,1333],{"class":1098},[333,4787,1336],{"class":354},[333,4789,907],{"class":1098},[333,4791,401],{"class":354},[333,4793,1922],{"class":1098},[333,4795,1347],{"class":354},[333,4797,4798],{"class":485}," \u002F\u002F validated; file fields hold the file names\n",[333,4800,4801,4804,4806,4808,4811,4813,4815,4817,4820,4822,4824,4826,4829,4831,4833,4835,4838,4840,4842,4844,4847,4849,4851,4853,4856,4858],{"class":335,"line":441},[333,4802,4803],{"class":361},"  files",[333,4805,365],{"class":354},[333,4807,389],{"class":354},[333,4809,4810],{"class":361}," fieldKey",[333,4812,365],{"class":354},[333,4814,1210],{"class":1098},[333,4816,401],{"class":354},[333,4818,4819],{"class":361}," filename",[333,4821,365],{"class":354},[333,4823,1210],{"class":1098},[333,4825,401],{"class":354},[333,4827,4828],{"class":361}," contentType",[333,4830,365],{"class":354},[333,4832,1210],{"class":1098},[333,4834,401],{"class":354},[333,4836,4837],{"class":361}," size",[333,4839,365],{"class":354},[333,4841,4765],{"class":1098},[333,4843,401],{"class":354},[333,4845,4846],{"class":361}," pathname",[333,4848,365],{"class":354},[333,4850,1210],{"class":1098},[333,4852,1121],{"class":354},[333,4854,4855],{"class":1098}," null",[333,4857,1350],{"class":354},[333,4859,1170],{"class":350},[333,4861,4862,4865,4867],{"class":335,"line":447},[333,4863,4864],{"class":361},"  locale",[333,4866,365],{"class":354},[333,4868,4869],{"class":1098}," string\n",[333,4871,4872,4875,4877,4879,4881],{"class":335,"line":453},[333,4873,4874],{"class":361},"  userId",[333,4876,365],{"class":354},[333,4878,4765],{"class":1098},[333,4880,1121],{"class":354},[333,4882,4883],{"class":1098}," null\n",[333,4885,4886,4889,4891,4893,4895,4897],{"class":335,"line":1202},[333,4887,4888],{"class":361},"  submissionId",[333,4890,365],{"class":354},[333,4892,1210],{"class":1098},[333,4894,1121],{"class":354},[333,4896,4855],{"class":1098},[333,4898,4899],{"class":485}," \u002F\u002F null when storage is 'none'\n",[333,4901,4902,4905,4907],{"class":335,"line":1216},[333,4903,4904],{"class":361},"  stored",[333,4906,365],{"class":354},[333,4908,1661],{"class":1098},[333,4910,4911,4914,4916,4918],{"class":335,"line":1241},[333,4912,4913],{"class":361},"  delivered",[333,4915,365],{"class":354},[333,4917,1705],{"class":1098},[333,4919,4920],{"class":485}," \u002F\u002F set true once the handler delivered; throw to mark delivery failed\n",[333,4922,4923],{"class":335,"line":1247},[333,4924,1397],{"class":354},[324,4926,4928],{"className":326,"code":4927,"language":328,"meta":329,"style":329},"nitroApp.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",[178,4929,4930,4965,5027,5042],{"__ignoreMap":329},[333,4931,4932,4935,4937,4939,4941,4943,4945,4947,4949,4951,4953,4955,4957,4959,4961,4963],{"class":335,"line":336},[333,4933,4934],{"class":350},"nitroApp",[333,4936,243],{"class":354},[333,4938,522],{"class":350},[333,4940,243],{"class":354},[333,4942,527],{"class":346},[333,4944,351],{"class":350},[333,4946,532],{"class":354},[333,4948,293],{"class":535},[333,4950,532],{"class":354},[333,4952,401],{"class":354},[333,4954,543],{"class":509},[333,4956,546],{"class":354},[333,4958,549],{"class":502},[333,4960,506],{"class":354},[333,4962,510],{"class":509},[333,4964,368],{"class":354},[333,4966,4967,4970,4973,4975,4977,4980,4982,4984,4986,4989,4991,4993,4996,4998,5000,5003,5005,5008,5010,5013,5015,5017,5019,5021,5023,5025],{"class":335,"line":358},[333,4968,4969],{"class":339},"  await",[333,4971,4972],{"class":346}," fetch",[333,4974,351],{"class":361},[333,4976,532],{"class":354},[333,4978,4979],{"class":535},"https:\u002F\u002Fexample.com\u002Fhook",[333,4981,532],{"class":354},[333,4983,401],{"class":354},[333,4985,389],{"class":354},[333,4987,4988],{"class":361}," method",[333,4990,365],{"class":354},[333,4992,1113],{"class":354},[333,4994,4995],{"class":535},"POST",[333,4997,532],{"class":354},[333,4999,401],{"class":354},[333,5001,5002],{"class":361}," body",[333,5004,365],{"class":354},[333,5006,5007],{"class":350}," JSON",[333,5009,243],{"class":354},[333,5011,5012],{"class":346},"stringify",[333,5014,351],{"class":361},[333,5016,549],{"class":350},[333,5018,243],{"class":354},[333,5020,3288],{"class":350},[333,5022,4355],{"class":361},[333,5024,456],{"class":354},[333,5026,459],{"class":361},[333,5028,5029,5032,5034,5037,5039],{"class":335,"line":371},[333,5030,5031],{"class":350},"  ctx",[333,5033,243],{"class":354},[333,5035,5036],{"class":350},"delivered",[333,5038,568],{"class":354},[333,5040,5041],{"class":397}," true\n",[333,5043,5044,5046],{"class":335,"line":381},[333,5045,456],{"class":354},[333,5047,459],{"class":350},[250,5049,5050,5062],{},[253,5051,5052,5053,5055,5056,5059,5060,243],{},"The built-in email delivery listens to ",[178,5054,293],{}," and mails ",[178,5057,5058],{},"delivery.email"," through ",[178,5061,202],{},[253,5063,5064,5065,5067,5068,5071,5072,5075,5076,5078,5079,243],{},"For ",[178,5066,2111],{}," a failing listener sets ",[178,5069,5070],{},"deliveryStatus = 'failed'"," (with the error) and the visitor still gets\nsuccess; ",[163,5073,5074],{},"Deliver again"," in the admin re-runs the hooks. For ",[178,5077,289],{}," nothing else keeps the answers, so a\nfailure is returned as ",[178,5080,3196],{},[245,5082,5084],{"id":5083},"routes","Routes",[159,5086,5087,5090,5091,5094,5095,5097,5098,5100,5101,5103],{},[178,5088,5089],{},"\u002Fapi\u002Fforms\u002F...",". Static ",[178,5092,5093],{},"admin\u002F*"," segments win over ",[178,5096,666],{},". \"Staff\" means ",[178,5099,3708],{}," plus the\n",[178,5102,536],{}," policy; admin routes also accept bearer tokens with that scope.",[621,5105,5106,5120],{},[624,5107,5108],{},[627,5109,5110,5113,5116,5118],{},[630,5111,5112],{},"Method",[630,5114,5115],{},"Path",[630,5117,73],{},[630,5119,641],{},[643,5121,5122,5142,5159,5175,5191,5213,5228,5246,5261,5279,5294,5315,5331,5356,5381,5401,5417,5432,5448],{},[627,5123,5124,5129,5134,5137],{},[648,5125,5126],{},[178,5127,5128],{},"GET",[648,5130,5131],{},[178,5132,5133],{},"\u002F:slug",[648,5135,5136],{},"Form access",[648,5138,5139,5140],{},"Published definition without ",[178,5141,2688],{},[627,5143,5144,5148,5153,5156],{},[648,5145,5146],{},[178,5147,5128],{},[648,5149,5150],{},[178,5151,5152],{},"\u002F:slug\u002Faccess",[648,5154,5155],{},"None",[648,5157,5158],{},"What the page needs to choose between the form, a gate and \"not found\"",[627,5160,5161,5165,5170,5172],{},[648,5162,5163],{},[178,5164,4995],{},[648,5166,5167],{},[178,5168,5169],{},"\u002F:slug\u002Fsubmit",[648,5171,5136],{},[648,5173,5174],{},"Submit answers (rate limited)",[627,5176,5177,5181,5185,5188],{},[648,5178,5179],{},[178,5180,5128],{},[648,5182,5183],{},[178,5184,694],{},[648,5186,5187],{},"Staff",[648,5189,5190],{},"List forms with submission counts",[627,5192,5193,5197,5201,5203],{},[648,5194,5195],{},[178,5196,4995],{},[648,5198,5199],{},[178,5200,694],{},[648,5202,5187],{},[648,5204,5205,5206,888,5209,5212],{},"Create a form (",[178,5207,5208],{},"201",[178,5210,5211],{},"409"," for a taken slug)",[627,5214,5215,5219,5223,5225],{},[648,5216,5217],{},[178,5218,5128],{},[648,5220,5221],{},[178,5222,721],{},[648,5224,5187],{},[648,5226,5227],{},"One form",[627,5229,5230,5235,5239,5241],{},[648,5231,5232],{},[178,5233,5234],{},"PATCH",[648,5236,5237],{},[178,5238,721],{},[648,5240,5187],{},[648,5242,5243,5244],{},"Update; a changed definition bumps ",[178,5245,280],{},[627,5247,5248,5252,5256,5258],{},[648,5249,5250],{},[178,5251,317],{},[648,5253,5254],{},[178,5255,721],{},[648,5257,5187],{},[648,5259,5260],{},"Archive (never deletes)",[627,5262,5263,5267,5272,5274],{},[648,5264,5265],{},[178,5266,4995],{},[648,5268,5269],{},[178,5270,5271],{},"\u002Fadmin\u002Fforms\u002F:id\u002Fclone",[648,5273,5187],{},[648,5275,5276,5277,506],{},"Clone into a draft (",[178,5278,5208],{},[627,5280,5281,5285,5289,5291],{},[648,5282,5283],{},[178,5284,5128],{},[648,5286,5287],{},[178,5288,744],{},[648,5290,5187],{},[648,5292,5293],{},"Submissions of a form",[627,5295,5296,5302,5307,5309],{},[648,5297,5298,3403,5300],{},[178,5299,5128],{},[178,5301,4995],{},[648,5303,5304],{},[178,5305,5306],{},"\u002Fadmin\u002Fforms\u002F:id\u002Ftokens",[648,5308,5187],{},[648,5310,5311,5312,5314],{},"List tokens \u002F create one (",[178,5313,5208],{},"; the token is only in this response)",[627,5316,5317,5321,5326,5328],{},[648,5318,5319],{},[178,5320,317],{},[648,5322,5323],{},[178,5324,5325],{},"\u002Fadmin\u002Fforms\u002F:id\u002Ftokens\u002F:tokenId",[648,5327,5187],{},[648,5329,5330],{},"Revoke a token",[627,5332,5333,5342,5347,5349],{},[648,5334,5335,3403,5337,3403,5340],{},[178,5336,5128],{},[178,5338,5339],{},"PUT",[178,5341,317],{},[648,5343,5344],{},[178,5345,5346],{},"\u002Fadmin\u002Fforms\u002F:id\u002Fpassword",[648,5348,5187],{},[648,5350,5351,5352,5355],{},"Whether a password is set (",[178,5353,5354],{},"{ set }",") \u002F set (6-200 chars) \u002F remove",[627,5357,5358,5364,5369,5371],{},[648,5359,5360,3403,5362],{},[178,5361,5128],{},[178,5363,5339],{},[648,5365,5366],{},[178,5367,5368],{},"\u002Fadmin\u002Fforms\u002F:id\u002Fsecrets",[648,5370,5187],{},[648,5372,5373,5374,5377,5378],{},"Names and sources of secrets (",[178,5375,5376],{},"{ keys, captcha, unreadable }",") \u002F write one ",[178,5379,5380],{},"{ key, value }",[627,5382,5383,5387,5392,5394],{},[648,5384,5385],{},[178,5386,317],{},[648,5388,5389],{},[178,5390,5391],{},"\u002Fadmin\u002Fforms\u002F:id\u002Fsecrets\u002F:key",[648,5393,5187],{},[648,5395,5396,5397,5400],{},"Remove one secret (",[178,5398,5399],{},"400"," for an unknown key)",[627,5402,5403,5407,5412,5414],{},[648,5404,5405],{},[178,5406,4995],{},[648,5408,5409],{},[178,5410,5411],{},"\u002Fadmin\u002Fimport",[648,5413,5187],{},[648,5415,5416],{},"Import definitions",[627,5418,5419,5423,5428,5430],{},[648,5420,5421],{},[178,5422,5128],{},[648,5424,5425],{},[178,5426,5427],{},"\u002Fadmin\u002Fsubmissions\u002F:id",[648,5429,5187],{},[648,5431,3959],{},[627,5433,5434,5438,5443,5445],{},[648,5435,5436],{},[178,5437,5128],{},[648,5439,5440],{},[178,5441,5442],{},"\u002Fadmin\u002Fsubmissions\u002F:id\u002Ffiles\u002F:fileId",[648,5444,5187],{},[648,5446,5447],{},"Download an uploaded file",[627,5449,5450,5454,5459,5461],{},[648,5451,5452],{},[178,5453,4995],{},[648,5455,5456],{},[178,5457,5458],{},"\u002Fadmin\u002Fsubmissions\u002F:id\u002Fredeliver",[648,5460,5187],{},[648,5462,5463],{},"Run the delivery hooks again",[245,5465,606],{"id":5466},"database",[621,5468,5469,5478],{},[624,5470,5471],{},[627,5472,5473,5476],{},[630,5474,5475],{},"Table",[630,5477,641],{},[643,5479,5480,5508,5545,5555,5575,5587],{},[627,5481,5482,5486],{},[648,5483,5484],{},[178,5485,261],{},[648,5487,5488,181,5490,181,5493,546,5495,181,5497,181,5500,5503,5504,181,5506],{},[178,5489,4025],{},[178,5491,5492],{},"name",[178,5494,891],{},[178,5496,895],{},[178,5498,5499],{},"published",[178,5501,5502],{},"archived","), ",[178,5505,165],{},[178,5507,280],{},[627,5509,5510,5515],{},[648,5511,5512],{},[178,5513,5514],{},"form_submissions",[648,5516,5517,5518,181,5521,181,5524,181,5526,181,5528,546,5531,181,5533,181,5536,181,5538,5541,5542],{},"Answers, ",[178,5519,5520],{},"definitionSnapshot",[178,5522,5523],{},"formVersion",[178,5525,583],{},[178,5527,3292],{},[178,5529,5530],{},"deliveryStatus",[178,5532,1152],{},[178,5534,5535],{},"pending",[178,5537,5036],{},[178,5539,5540],{},"failed",") and ",[178,5543,5544],{},"deliveryError",[627,5546,5547,5552],{},[648,5548,5549],{},[178,5550,5551],{},"form_submission_files",[648,5553,5554],{},"Blob pathname, filename, content type and size per uploaded file",[627,5556,5557,5562],{},[648,5558,5559],{},[178,5560,5561],{},"form_access_tokens",[648,5563,5564,5565,181,5568,181,5571,181,5573],{},"Per-form API tokens: ",[178,5566,5567],{},"tokenHash",[178,5569,5570],{},"prefix",[178,5572,3504],{},[178,5574,3507],{},[627,5576,5577,5581],{},[648,5578,5579],{},[178,5580,3513],{},[648,5582,5583,5584],{},"One row per password-protected form: ",[178,5585,5586],{},"passwordHash",[627,5588,5589,5593],{},[648,5590,5591],{},[178,5592,3551],{},[648,5594,5595,5596,5599],{},"One row per form: ",[178,5597,5598],{},"secrets"," (encrypted JSON map of namespaced keys)",[159,5601,5602,5603,2131],{},"Files are only downloadable by staff. Generate and commit migrations for all six tables in every host app and fixture\n(see ",[175,5604,101],{"href":610},[245,5606,5608],{"id":5607},"translations","Translations",[250,5610,5611,5651,5701,5710],{},[253,5612,5613,5616,5617,5620,5621,5624,5625,2066,5628,5630,5631,5634,5635,5638,5639,5642,5643,5647,5648,243],{},[163,5614,5615],{},"Module chrome"," (buttons, stepper, admin) uses ",[178,5618,5619],{},"useModuleT('forms')"," with English fallbacks; the module contributes\n",[178,5622,5623],{},"forms.*"," messages (",[178,5626,5627],{},"da",[178,5629,2040],{},") through ",[178,5632,5633],{},"registerLocales"," (see ",[175,5636,101],{"href":5637},"\u002Fmodules\u002Fmodule-kit#translations-i18n",").\nOverride any of them in your app's ",[178,5640,5641],{},"i18n\u002Flocales\u002F\u003Ccode>.json"," (see\n",[175,5644,5646],{"href":5645},"\u002Fmodules\u002Fmodule-kit#overriding-module-strings-in-your-app","overriding module strings","), for example\n",[178,5649,5650],{},"{ \"forms\": { \"actions\": { \"submit\": \"Send inquiry\" } } }",[253,5652,5653,3568,5656,181,5659,181,5662,181,5665,181,5668,181,5671,181,5674,181,5677,181,5679,181,5681,187,5683,181,5686,181,5689,181,5691,181,5693,181,5696,181,5698,243],{},[163,5654,5655],{},"Key groups",[178,5657,5658],{},"actions",[178,5660,5661],{},"step",[178,5663,5664],{},"success",[178,5666,5667],{},"error",[178,5669,5670],{},"embed",[178,5672,5673],{},"preview",[178,5675,5676],{},"field",[178,5678,2062],{},[178,5680,891],{},[178,5682,2688],{},[178,5684,5685],{},"validation",[178,5687,5688],{},"admin",[178,5690,2599],{},[178,5692,2424],{},[178,5694,5695],{},"menu",[178,5697,1604],{},[178,5699,5700],{},"builder",[253,5702,5703,5706,5707,5709],{},[163,5704,5705],{},"Form content"," lives in the definition as ",[178,5708,2036],{}," texts.",[253,5711,5712,5715,5716,5719,5720,243],{},[163,5713,5714],{},"Validation messages"," of the compiler's own rules use ",[178,5717,5718],{},"forms.validation.*","; a field overrides them with\n",[178,5721,5722],{},"validation.message",[5724,5725,5726],"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .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}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":329,"searchDepth":358,"depth":358,"links":5728},[5729,5730,5731,5732,5739,5751,5758,5759,5760,5761],{"id":247,"depth":358,"text":248},{"id":321,"depth":358,"text":322},{"id":613,"depth":358,"text":614},{"id":165,"depth":358,"text":1074,"children":5733},[5734,5735,5736,5737,5738],{"id":2161,"depth":371,"text":2162},{"id":2394,"depth":371,"text":2395},{"id":2663,"depth":371,"text":2664},{"id":1604,"depth":371,"text":2928},{"id":3209,"depth":371,"text":3210},{"id":3266,"depth":358,"text":3267,"children":5740},[5741,5742,5743,5744,5745,5746,5747,5748,5749,5750],{"id":3270,"depth":371,"text":3271},{"id":2424,"depth":371,"text":3225},{"id":3525,"depth":371,"text":3526},{"id":3545,"depth":371,"text":3121},{"id":3599,"depth":371,"text":866},{"id":3631,"depth":371,"text":3632},{"id":3684,"depth":371,"text":3685},{"id":3702,"depth":371,"text":77},{"id":3740,"depth":371,"text":3741},{"id":3789,"depth":371,"text":3790},{"id":3877,"depth":358,"text":3878,"children":5752},[5753,5754,5755,5756,5757],{"id":3881,"depth":371,"text":3882},{"id":3977,"depth":371,"text":3978},{"id":4095,"depth":371,"text":4096},{"id":4306,"depth":371,"text":4307},{"id":4440,"depth":371,"text":4441},{"id":522,"depth":358,"text":4600},{"id":5083,"depth":358,"text":5084},{"id":5466,"depth":358,"text":606},{"id":5607,"depth":358,"text":5608},"Dynamic forms stored in the database - single page or stepped, conditional fields, file uploads, stored or email-only submissions.",null,{},{"title":89,"description":5762},"l_tRwS6AvVWh9VOw-qeEphocvxhmYf2hfUIZa4Y4IDk",[5768,5770],{"title":85,"path":86,"stem":87,"description":5769,"children":-1},"Database-backed events with ticket types, addons, capacity, sale windows, membership requirements, Stripe payments and QR check-in.",{"title":93,"path":94,"stem":95,"description":5771,"children":-1},"Modules contribute MCP tools that are only listed and callable within the scopes the caller holds, without leaking other people's personal data.",1792824489064]