[{"data":1,"prerenderedAt":1319},["ShallowReactive",2],{"docs-nav:en":3,"docs:\u002Fdocs\u002Fclient\u002Fforms":186},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","\u002Fdocs","docs",[9,12,16,20,24,28,50,75,120,145],{"title":10,"path":6,"stem":11},"What is Fougere","docs\u002Findex",{"title":13,"path":14,"stem":15},"Getting started","\u002Fdocs\u002Fgetting-started","docs\u002F01.getting-started",{"title":17,"path":18,"stem":19},"An app you already have","\u002Fdocs\u002Fexisting-app","docs\u002F02.existing-app",{"title":21,"path":22,"stem":23},"Bring your schema","\u002Fdocs\u002Fbring-your-schema","docs\u002F03.bring-your-schema",{"title":25,"path":26,"stem":27},"The CLI","\u002Fdocs\u002Fcli","docs\u002F04.cli",{"title":29,"path":30,"stem":31,"children":32,"page":49},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F2.concepts",[33,37,41,45],{"title":34,"path":35,"stem":36},"Philosophy","\u002Fdocs\u002Fconcepts\u002Fphilosophy","docs\u002F2.concepts\u002F1.philosophy",{"title":38,"path":39,"stem":40},"The Frond","\u002Fdocs\u002Fconcepts\u002Ffrond","docs\u002F2.concepts\u002F2.frond",{"title":42,"path":43,"stem":44},"The shortest path","\u002Fdocs\u002Fconcepts\u002Fshortest-path","docs\u002F2.concepts\u002F3.shortest-path",{"title":46,"path":47,"stem":48},"The base","\u002Fdocs\u002Fconcepts\u002Fthe-base","docs\u002F2.concepts\u002F4.the-base",false,{"title":51,"path":52,"stem":53,"children":54,"page":49},"Schema","\u002Fdocs\u002Fschema","docs\u002F3.schema",[55,59,63,67,71],{"title":56,"path":57,"stem":58},"Entities","\u002Fdocs\u002Fschema\u002Fentities","docs\u002F3.schema\u002F1.entities",{"title":60,"path":61,"stem":62},"Views","\u002Fdocs\u002Fschema\u002Fviews","docs\u002F3.schema\u002F2.views",{"title":64,"path":65,"stem":66},"The identity card","\u002Fdocs\u002Fschema\u002Fcard","docs\u002F3.schema\u002F3.card",{"title":68,"path":69,"stem":70},"Standard Schema","\u002Fdocs\u002Fschema\u002Fstandard-schema","docs\u002F3.schema\u002F4.standard-schema",{"title":72,"path":73,"stem":74},"How a schema moves","\u002Fdocs\u002Fschema\u002Fevolution","docs\u002F3.schema\u002F5.evolution",{"title":76,"path":77,"stem":78,"children":79,"page":49},"Business","\u002Fdocs\u002Fbusiness","docs\u002F4.business",[80,84,88,92,96,100,104,108,112,116],{"title":81,"path":82,"stem":83},"Handlers","\u002Fdocs\u002Fbusiness\u002Fhandlers","docs\u002F4.business\u002F1.handlers",{"title":85,"path":86,"stem":87},"Ports","\u002Fdocs\u002Fbusiness\u002Fports","docs\u002F4.business\u002F10.ports",{"title":89,"path":90,"stem":91},"Presenters","\u002Fdocs\u002Fbusiness\u002Fpresenters","docs\u002F4.business\u002F2.presenters",{"title":93,"path":94,"stem":95},"Collectors","\u002Fdocs\u002Fbusiness\u002Fcollectors","docs\u002F4.business\u002F3.collectors",{"title":97,"path":98,"stem":99},"Errors","\u002Fdocs\u002Fbusiness\u002Ferrors","docs\u002F4.business\u002F4.errors",{"title":101,"path":102,"stem":103},"Seeds","\u002Fdocs\u002Fbusiness\u002Fseeds","docs\u002F4.business\u002F5.seeds",{"title":105,"path":106,"stem":107},"Facts","\u002Fdocs\u002Fbusiness\u002Ffacts","docs\u002F4.business\u002F6.facts",{"title":109,"path":110,"stem":111},"Storage","\u002Fdocs\u002Fbusiness\u002Fstorage","docs\u002F4.business\u002F7.storage",{"title":113,"path":114,"stem":115},"Writes that stand or fall as one","\u002Fdocs\u002Fbusiness\u002Ftogether","docs\u002F4.business\u002F8.together",{"title":117,"path":118,"stem":119},"Repositories","\u002Fdocs\u002Fbusiness\u002Frepositories","docs\u002F4.business\u002F9.repositories",{"title":121,"path":122,"stem":123,"children":124,"page":49},"Client","\u002Fdocs\u002Fclient","docs\u002F5.client",[125,129,133,137,141],{"title":126,"path":127,"stem":128},"Queries & commands","\u002Fdocs\u002Fclient\u002Fqueries-commands","docs\u002F5.client\u002F1.queries-commands",{"title":130,"path":131,"stem":132},"Forms","\u002Fdocs\u002Fclient\u002Fforms","docs\u002F5.client\u002F2.forms",{"title":134,"path":135,"stem":136},"Session","\u002Fdocs\u002Fclient\u002Fsession","docs\u002F5.client\u002F3.session",{"title":138,"path":139,"stem":140},"invoke","\u002Fdocs\u002Fclient\u002Finvoke","docs\u002F5.client\u002F4.invoke",{"title":142,"path":143,"stem":144},"Back-office","\u002Fdocs\u002Fclient\u002Fadmin","docs\u002F5.client\u002F5.admin",{"title":146,"path":147,"stem":148,"children":149,"page":49},"Infrastructure","\u002Fdocs\u002Finfra","docs\u002F6.infra",[150,154,158,162,166,170,174,178,182],{"title":151,"path":152,"stem":153},"The gradient","\u002Fdocs\u002Finfra\u002Fgradient","docs\u002F6.infra\u002F1.gradient",{"title":155,"path":156,"stem":157},"Surfaces — REST & GraphQL","\u002Fdocs\u002Finfra\u002Fsurfaces","docs\u002F6.infra\u002F2.surfaces",{"title":159,"path":160,"stem":161},"Deployment","\u002Fdocs\u002Finfra\u002Fdeployment","docs\u002F6.infra\u002F3.deployment",{"title":163,"path":164,"stem":165},"Hosts","\u002Fdocs\u002Finfra\u002Fhosts","docs\u002F6.infra\u002F4.hosts",{"title":167,"path":168,"stem":169},"Sources","\u002Fdocs\u002Finfra\u002Fsources","docs\u002F6.infra\u002F5.sources",{"title":171,"path":172,"stem":173},"Lifecycle","\u002Fdocs\u002Finfra\u002Flifecycle","docs\u002F6.infra\u002F6.lifecycle",{"title":175,"path":176,"stem":177},"Identity across Fronds","\u002Fdocs\u002Finfra\u002Fidentity","docs\u002F6.infra\u002F7.identity",{"title":179,"path":180,"stem":181},"Observability","\u002Fdocs\u002Finfra\u002Fobservability","docs\u002F6.infra\u002F8.observability",{"title":183,"path":184,"stem":185},"Testing","\u002Fdocs\u002Finfra\u002Ftesting","docs\u002F6.infra\u002F9.testing",{"id":187,"title":130,"body":188,"description":1314,"extension":1315,"meta":1316,"navigation":279,"path":131,"seo":1317,"stem":132,"__hash__":1318},"docs_en\u002Fdocs\u002F5.client\u002F2.forms.md",{"type":189,"value":190,"toc":1308},"minimark",[191,195,203,671,676,733,736,886,889,1026,1030,1076,1083,1086,1171,1182,1186,1249,1253,1297,1304],[192,193,130],"h1",{"id":194},"forms",[196,197,198,202],"p",{},[199,200,201],"code",{},"useFormFor"," manages state, validation, submission, and per-field errors. It renders no\ncomponents: the page chooses the fields and their layout.",[204,205,210],"pre",{"className":206,"code":207,"language":208,"meta":209,"style":209},"language-vue shiki shiki-themes material-theme-lighter github-light github-dark","\u003Cscript setup lang=\"ts\">\nimport Post from '@fronds\u002Fblog\u002Fentities\u002FPost';\n\nconst { fieldsByName, values, errors, submit, loading, error } = useFormFor\u003C{ id: string }>(Post);\n\nasync function onSubmit() {\n  const created = await submit();          \u002F\u002F null on validation error\n  if (created) navigateTo(`\u002Fblog\u002Fedit\u002F${created.id}`);\n}\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cform @submit.prevent=\"onSubmit\">\n    \u003CUFormField label=\"Title\" :error=\"errors.title\">\n      \u003CUInput v-model=\"values.title\" v-bind=\"fieldsByName.title?.attrs\" \u002F>\n    \u003C\u002FUFormField>\n    \u003Cp v-if=\"error\">{{ error.message }}\u003C\u002Fp>          \u003C!-- non-validation failure -->\n    \u003CUButton type=\"submit\" :loading=\"loading\" \u002F>\n  \u003C\u002Fform>\n\u003C\u002Ftemplate>\n","vue","",[199,211,212,248,274,281,354,359,377,403,449,455,465,470,480,503,538,574,584,618,652,662],{"__ignoreMap":209},[213,214,217,221,225,229,232,235,239,243,245],"span",{"class":215,"line":216},"line",1,[213,218,220],{"class":219},"sP7_E","\u003C",[213,222,224],{"class":223},"sQzsp","script",[213,226,228],{"class":227},"s9AJx"," setup",[213,230,231],{"class":227}," lang",[213,233,234],{"class":219},"=",[213,236,238],{"class":237},"sjJ54","\"",[213,240,242],{"class":241},"s_sjI","ts",[213,244,238],{"class":237},[213,246,247],{"class":219},">\n",[213,249,251,255,259,262,265,268,271],{"class":215,"line":250},2,[213,252,254],{"class":253},"sVHd0","import",[213,256,258],{"class":257},"su5hD"," Post ",[213,260,261],{"class":253},"from",[213,263,264],{"class":237}," '",[213,266,267],{"class":241},"@fronds\u002Fblog\u002Fentities\u002FPost",[213,269,270],{"class":237},"'",[213,272,273],{"class":219},";\n",[213,275,277],{"class":215,"line":276},3,[213,278,280],{"emptyLinePlaceholder":279},true,"\n",[213,282,284,288,291,295,298,301,303,306,308,311,313,316,318,321,324,328,332,335,339,342,346,349,352],{"class":215,"line":283},4,[213,285,287],{"class":286},"sbsja","const",[213,289,290],{"class":219}," {",[213,292,294],{"class":293},"s_hVV"," fieldsByName",[213,296,297],{"class":219},",",[213,299,300],{"class":293}," values",[213,302,297],{"class":219},[213,304,305],{"class":293}," errors",[213,307,297],{"class":219},[213,309,310],{"class":293}," submit",[213,312,297],{"class":219},[213,314,315],{"class":293}," loading",[213,317,297],{"class":219},[213,319,320],{"class":293}," error",[213,322,323],{"class":219}," }",[213,325,327],{"class":326},"smGrS"," =",[213,329,331],{"class":330},"sGLFI"," useFormFor",[213,333,334],{"class":219},"\u003C{",[213,336,338],{"class":337},"sucvu"," id",[213,340,341],{"class":326},":",[213,343,345],{"class":344},"sZMiF"," string",[213,347,348],{"class":219}," }>",[213,350,351],{"class":257},"(Post)",[213,353,273],{"class":219},[213,355,357],{"class":215,"line":356},5,[213,358,280],{"emptyLinePlaceholder":279},[213,360,362,365,368,371,374],{"class":215,"line":361},6,[213,363,364],{"class":286},"async",[213,366,367],{"class":286}," function",[213,369,370],{"class":330}," onSubmit",[213,372,373],{"class":219},"()",[213,375,376],{"class":219}," {\n",[213,378,380,383,386,388,391,393,396,399],{"class":215,"line":379},7,[213,381,382],{"class":286},"  const",[213,384,385],{"class":293}," created",[213,387,327],{"class":326},[213,389,390],{"class":253}," await",[213,392,310],{"class":330},[213,394,373],{"class":395},"skxfh",[213,397,398],{"class":219},";",[213,400,402],{"class":401},"sutJx","          \u002F\u002F null on validation error\n",[213,404,406,409,412,415,418,421,424,427,430,433,435,438,441,444,447],{"class":215,"line":405},8,[213,407,408],{"class":253},"  if",[213,410,411],{"class":395}," (",[213,413,414],{"class":257},"created",[213,416,417],{"class":395},") ",[213,419,420],{"class":330},"navigateTo",[213,422,423],{"class":395},"(",[213,425,426],{"class":237},"`",[213,428,429],{"class":241},"\u002Fblog\u002Fedit\u002F",[213,431,432],{"class":237},"${",[213,434,414],{"class":257},[213,436,437],{"class":237},".",[213,439,440],{"class":257},"id",[213,442,443],{"class":237},"}`",[213,445,446],{"class":395},")",[213,448,273],{"class":219},[213,450,452],{"class":215,"line":451},9,[213,453,454],{"class":219},"}\n",[213,456,458,461,463],{"class":215,"line":457},10,[213,459,460],{"class":219},"\u003C\u002F",[213,462,224],{"class":223},[213,464,247],{"class":219},[213,466,468],{"class":215,"line":467},11,[213,469,280],{"emptyLinePlaceholder":279},[213,471,473,475,478],{"class":215,"line":472},12,[213,474,220],{"class":219},[213,476,477],{"class":223},"template",[213,479,247],{"class":219},[213,481,483,486,489,492,494,496,499,501],{"class":215,"line":482},13,[213,484,485],{"class":219},"  \u003C",[213,487,488],{"class":223},"form",[213,490,491],{"class":227}," @submit.prevent",[213,493,234],{"class":219},[213,495,238],{"class":237},[213,497,498],{"class":241},"onSubmit",[213,500,238],{"class":237},[213,502,247],{"class":219},[213,504,506,509,512,515,517,519,522,524,527,529,531,534,536],{"class":215,"line":505},14,[213,507,508],{"class":219},"    \u003C",[213,510,511],{"class":223},"UFormField",[213,513,514],{"class":227}," label",[213,516,234],{"class":219},[213,518,238],{"class":237},[213,520,521],{"class":241},"Title",[213,523,238],{"class":237},[213,525,526],{"class":227}," :error",[213,528,234],{"class":219},[213,530,238],{"class":237},[213,532,533],{"class":241},"errors.title",[213,535,238],{"class":237},[213,537,247],{"class":219},[213,539,541,544,547,550,552,554,557,559,562,564,566,569,571],{"class":215,"line":540},15,[213,542,543],{"class":219},"      \u003C",[213,545,546],{"class":223},"UInput",[213,548,549],{"class":227}," v-model",[213,551,234],{"class":219},[213,553,238],{"class":237},[213,555,556],{"class":241},"values.title",[213,558,238],{"class":237},[213,560,561],{"class":227}," v-bind",[213,563,234],{"class":219},[213,565,238],{"class":237},[213,567,568],{"class":241},"fieldsByName.title?.attrs",[213,570,238],{"class":237},[213,572,573],{"class":219}," \u002F>\n",[213,575,577,580,582],{"class":215,"line":576},16,[213,578,579],{"class":219},"    \u003C\u002F",[213,581,511],{"class":223},[213,583,247],{"class":219},[213,585,587,589,591,594,596,598,601,603,606,609,611,613,615],{"class":215,"line":586},17,[213,588,508],{"class":219},[213,590,196],{"class":223},[213,592,593],{"class":227}," v-if",[213,595,234],{"class":219},[213,597,238],{"class":237},[213,599,600],{"class":241},"error",[213,602,238],{"class":237},[213,604,605],{"class":219},">",[213,607,608],{"class":257},"{{ error.message }}",[213,610,460],{"class":219},[213,612,196],{"class":223},[213,614,605],{"class":219},[213,616,617],{"class":401},"          \u003C!-- non-validation failure -->\n",[213,619,621,623,626,629,631,633,636,638,641,643,645,648,650],{"class":215,"line":620},18,[213,622,508],{"class":219},[213,624,625],{"class":223},"UButton",[213,627,628],{"class":227}," type",[213,630,234],{"class":219},[213,632,238],{"class":237},[213,634,635],{"class":241},"submit",[213,637,238],{"class":237},[213,639,640],{"class":227}," :loading",[213,642,234],{"class":219},[213,644,238],{"class":237},[213,646,647],{"class":241},"loading",[213,649,238],{"class":237},[213,651,573],{"class":219},[213,653,655,658,660],{"class":215,"line":654},19,[213,656,657],{"class":219},"  \u003C\u002F",[213,659,488],{"class":223},[213,661,247],{"class":219},[213,663,665,667,669],{"class":215,"line":664},20,[213,666,460],{"class":219},[213,668,477],{"class":223},[213,670,247],{"class":219},[672,673,675],"h2",{"id":674},"signature","Signature",[204,677,680],{"className":678,"code":679,"language":242,"meta":209,"style":209},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","useFormFor\u003CT>(EntityOrView, options?)\n\u002F\u002F options: {\n\u002F\u002F   op?: string                        command the submit rides — default 'create'\n\u002F\u002F   initial?: Record\u003Cstring, unknown>  edit mode: the loaded entity\n\u002F\u002F   params?: Record\u003Cstring, string>    designation of the target — edit mode: { id }\n\u002F\u002F }\n",[199,681,682,708,713,718,723,728],{"__ignoreMap":209},[213,683,684,686,688,692,694,697,699,702,705],{"class":215,"line":216},[213,685,201],{"class":330},[213,687,220],{"class":219},[213,689,691],{"class":690},"sbgvK","T",[213,693,605],{"class":219},[213,695,696],{"class":257},"(EntityOrView",[213,698,297],{"class":219},[213,700,701],{"class":257}," options",[213,703,704],{"class":326},"?",[213,706,707],{"class":257},")\n",[213,709,710],{"class":215,"line":250},[213,711,712],{"class":401},"\u002F\u002F options: {\n",[213,714,715],{"class":215,"line":276},[213,716,717],{"class":401},"\u002F\u002F   op?: string                        command the submit rides — default 'create'\n",[213,719,720],{"class":215,"line":283},[213,721,722],{"class":401},"\u002F\u002F   initial?: Record\u003Cstring, unknown>  edit mode: the loaded entity\n",[213,724,725],{"class":215,"line":356},[213,726,727],{"class":401},"\u002F\u002F   params?: Record\u003Cstring, string>    designation of the target — edit mode: { id }\n",[213,729,730],{"class":215,"line":361},[213,731,732],{"class":401},"\u002F\u002F }\n",[196,734,735],{},"Returns:",[737,738,739,755],"table",{},[740,741,742],"thead",{},[743,744,745,749,752],"tr",{},[746,747,748],"th",{},"Key",[746,750,751],{},"Type",[746,753,754],{},"Notes",[756,757,758,778,793,812,826,840,853,871],"tbody",{},[743,759,760,766,771],{},[761,762,763],"td",{},[199,764,765],{},"fields",[761,767,768],{},[199,769,770],{},"FormField[]",[761,772,773,774,777],{},"derived from the io axes — ",[199,775,776],{},"readOnly"," fields are excluded",[743,779,780,785,790],{},[761,781,782],{},[199,783,784],{},"fieldsByName",[761,786,787],{},[199,788,789],{},"Record\u003Cstring, FormField>",[761,791,792],{},"the same fields, for a form laid out by hand",[743,794,795,800,806],{},[761,796,797],{},[199,798,799],{},"values",[761,801,802,805],{},[199,803,804],{},"reactive"," record",[761,807,808,811],{},[199,809,810],{},"initial"," when editing, the field's declared default when creating",[743,813,814,819,823],{},[761,815,816],{},[199,817,818],{},"errors",[761,820,821,805],{},[199,822,804],{},[761,824,825],{},"field path → message",[743,827,828,832,837],{},[761,829,830],{},[199,831,635],{},[761,833,834],{},[199,835,836],{},"() => Promise\u003CT | null>",[761,838,839],{},"see cycle below",[743,841,842,846,851],{},[761,843,844],{},[199,845,647],{},[761,847,848],{},[199,849,850],{},"Ref\u003Cboolean>",[761,852],{},[743,854,855,859,864],{},[761,856,857],{},[199,858,600],{},[761,860,861],{},[199,862,863],{},"Ref\u003CFougereError | null>",[761,865,866,870],{},[867,868,869],"strong",{},"non-validation"," failure (conflict, dead host)",[743,872,873,878,883],{},[761,874,875],{},[199,876,877],{},"valid",[761,879,880],{},[199,881,882],{},"ComputedRef\u003Cboolean>",[761,884,885],{},"no current field errors",[196,887,888],{},"Edit mode composes with a query:",[204,890,892],{"className":678,"code":891,"language":242,"meta":209,"style":209},"const { data: post } = await useQuery\u003CPost>(Post, 'findById', { params: { id } });\nconst form = useFormFor(Post, { op: 'update', params: { id }, initial: post.value ?? undefined });\n",[199,893,894,959],{"__ignoreMap":209},[213,895,896,898,900,903,905,908,910,912,914,917,919,922,924,927,929,931,934,936,938,940,943,945,947,950,953,955,957],{"class":215,"line":216},[213,897,287],{"class":286},[213,899,290],{"class":219},[213,901,902],{"class":337}," data",[213,904,341],{"class":219},[213,906,907],{"class":293}," post",[213,909,323],{"class":219},[213,911,327],{"class":326},[213,913,390],{"class":253},[213,915,916],{"class":330}," useQuery",[213,918,220],{"class":219},[213,920,921],{"class":690},"Post",[213,923,605],{"class":219},[213,925,926],{"class":257},"(Post",[213,928,297],{"class":219},[213,930,264],{"class":237},[213,932,933],{"class":241},"findById",[213,935,270],{"class":237},[213,937,297],{"class":219},[213,939,290],{"class":219},[213,941,942],{"class":395}," params",[213,944,341],{"class":219},[213,946,290],{"class":219},[213,948,949],{"class":257}," id ",[213,951,952],{"class":219},"}",[213,954,323],{"class":219},[213,956,446],{"class":257},[213,958,273],{"class":219},[213,960,961,963,966,968,970,972,974,976,979,981,983,986,988,990,992,994,996,998,1001,1004,1006,1008,1010,1013,1016,1020,1022,1024],{"class":215,"line":250},[213,962,287],{"class":286},[213,964,965],{"class":293}," form",[213,967,327],{"class":326},[213,969,331],{"class":330},[213,971,926],{"class":257},[213,973,297],{"class":219},[213,975,290],{"class":219},[213,977,978],{"class":395}," op",[213,980,341],{"class":219},[213,982,264],{"class":237},[213,984,985],{"class":241},"update",[213,987,270],{"class":237},[213,989,297],{"class":219},[213,991,942],{"class":395},[213,993,341],{"class":219},[213,995,290],{"class":219},[213,997,949],{"class":257},[213,999,1000],{"class":219},"},",[213,1002,1003],{"class":395}," initial",[213,1005,341],{"class":219},[213,1007,907],{"class":257},[213,1009,437],{"class":219},[213,1011,1012],{"class":257},"value ",[213,1014,1015],{"class":326},"??",[213,1017,1019],{"class":1018},"s39Yj"," undefined",[213,1021,323],{"class":219},[213,1023,446],{"class":257},[213,1025,273],{"class":219},[672,1027,1029],{"id":1028},"the-browser-judges-first-and-for-free","The browser judges first, and for free",[196,1031,1032,1035,1036,1039,1040,1039,1043,1039,1046,1039,1049,1039,1052,1039,1055,1058,1059,1062,1063,1065,1066,1039,1068,1071,1072,1075],{},[199,1033,1034],{},"field.attrs"," is the part of the declaration a browser already enforces, under the names\nit knows: ",[199,1037,1038],{},"type",", ",[199,1041,1042],{},"required",[199,1044,1045],{},"minlength",[199,1047,1048],{},"maxlength",[199,1050,1051],{},"min",[199,1053,1054],{},"max",[199,1056,1057],{},"pattern",". Spread it\nand the page states no rule of its own — ",[199,1060,1061],{},"text({ min: 1, max: 200 })"," becomes\n",[199,1064,1045],{},"\u002F",[199,1067,1048],{},[199,1069,1070],{},"email()"," becomes ",[199,1073,1074],{},"type=\"email\"",", checked live as one types, with\nno JavaScript at all.",[196,1077,1078,1079,1082],{},"This is a projection, not a second rule: the judge reads the same shape. A form that\nignores ",[199,1080,1081],{},"attrs"," gets the same verdict, only later — and a screen reader never gets it.",[196,1084,1085],{},"Three attributes are deliberately absent, each where HTML would mean something the\ndeclaration does not say:",[737,1087,1088,1101],{},[740,1089,1090],{},[743,1091,1092,1095,1098],{},[746,1093,1094],{},"Field",[746,1096,1097],{},"Absent",[746,1099,1100],{},"Because",[756,1102,1103,1125,1147],{},[743,1104,1105,1110,1114],{},[761,1106,1107],{},[199,1108,1109],{},"date()",[761,1111,1112],{},[199,1113,1038],{},[761,1115,1116,1117,1120,1121,1124],{},"neither ",[199,1118,1119],{},"date"," nor ",[199,1122,1123],{},"datetime-local"," produces the RFC 3339 string the judge expects",[743,1126,1127,1132,1136],{},[761,1128,1129],{},[199,1130,1131],{},"bool()",[761,1133,1134],{},[199,1135,1042],{},[761,1137,1138,1139,1142,1143,1146],{},"on a checkbox it means \"must be ",[867,1140,1141],{},"checked","\"; the shape says the value must be supplied, and ",[199,1144,1145],{},"false"," is one",[743,1148,1149,1156,1160],{},[761,1150,1151,1039,1154],{},[199,1152,1153],{},"oneOf(…)",[199,1155,1131],{},[761,1157,1158],{},[199,1159,1038],{},[761,1161,1162,1163,1166,1167,1170],{},"these are not ",[199,1164,1165],{},"\u003Cinput>","s — ",[199,1168,1169],{},"field.control"," says which widget, the page renders it",[196,1172,1173,1174,1177,1178,1181],{},"What HTML cannot say at all — a cross-field rule, ",[199,1175,1176],{},"format: 'uuid'",", a ",[199,1179,1180],{},"oneOf"," outside a\nselect — is caught by the pass below.",[672,1183,1185],{"id":1184},"the-submit-cycle","The submit cycle",[1187,1188,1189,1210,1220,1237],"ol",{},[1190,1191,1192,1195,1196,1199,1200,1202,1203,1206,1207,437],"li",{},[867,1193,1194],{},"Local validation"," — ",[199,1197,1198],{},"Entity.validate(payload)"," runs in the browser with the same\nrules as the handler. Errors are added to ",[199,1201,818],{}," without a network call, and\n",[199,1204,1205],{},"submit()"," returns ",[199,1208,1209],{},"null",[1190,1211,1212,1215,1216,1219],{},[867,1213,1214],{},"Command"," — the payload is sent through ",[199,1217,1218],{},"useCommand(Entity, op)",". On success, active\nqueries for the entity are revalidated.",[1190,1221,1222,1225,1226,1229,1230,1232,1233,1236],{},[867,1223,1224],{},"Server validation"," — a returned ",[199,1227,1228],{},"VALIDATION_FAILED"," is added to ",[199,1231,818],{}," by ",[199,1234,1235],{},"path",",\nusing the same format as local errors.",[1190,1238,1239,1240,1039,1243,1246,1247,437],{},"Other errors (",[199,1241,1242],{},"CONFLICT",[199,1244,1245],{},"SERVICE_UNAVAILABLE","…) are placed in ",[199,1248,600],{},[672,1250,1252],{"id":1251},"what-the-form-will-not-do","What the form will not do",[1254,1255,1256,1262,1271,1277],"ul",{},[1190,1257,1258,1261],{},[867,1259,1260],{},"Render components"," — widgets and layout remain in the application.",[1190,1263,1264,1270],{},[867,1265,1266,1267,1269],{},"Show ",[199,1268,776],{}," fields"," — these fields are excluded by the io projection; a\nstatus is displayed as a badge from the loaded data, not editable as an input.",[1190,1272,1273,1276],{},[867,1274,1275],{},"Define labels"," — they remain in your i18n; the metadata provides stable keys composed\nof the entity and field name.",[1190,1278,1279,1282,1283,1285,1286,1288,1289,1292,1293,1296],{},[867,1280,1281],{},"Choose an additional value."," ",[199,1284,799],{}," uses ",[199,1287,810],{}," when editing and the field's\ndeclared default when creating (",[199,1290,1291],{},"oneOf('public','private',{ default:'public' })"," opens\nthe select on ",[199,1294,1295],{},"public","). Anything beyond those two — a placeholder, a computed\nsuggestion — is defined by the page.",[196,1298,1299,1300,1303],{},"Next: ",[1301,1302,134],"a",{"href":135}," — sharing identity with pages and handlers.",[1305,1306,1307],"style",{},"html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}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 .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sucvu, html code.shiki .sucvu{--shiki-light:#E53935;--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .s9AJx, html code.shiki .s9AJx{--shiki-light:#9C3EDA;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":209,"searchDepth":250,"depth":250,"links":1309},[1310,1311,1312,1313],{"id":674,"depth":250,"text":675},{"id":1028,"depth":250,"text":1029},{"id":1184,"depth":250,"text":1185},{"id":1251,"depth":250,"text":1252},"useFormFor — state, validation, submission, and per-field errors.","md",{},{"title":130,"description":1314},"ZTOHQBWaB5CTT1TgOtbAKrpkxDY8qWXTxwWdobX8zE0",1788560230801]