[{"data":1,"prerenderedAt":1321},["ShallowReactive",2],{"docs-nav:fr":3,"docs:\u002Ffr\u002Fdocs\u002Fclient\u002Fforms":189},[4],{"title":5,"path":6,"stem":7,"children":8,"page":52},"Fr","\u002Ffr","fr",[9],{"title":10,"path":11,"stem":12,"children":13},"Qu'est-ce que Fougere","\u002Ffr\u002Fdocs","fr\u002Fdocs\u002Findex",[14,15,19,23,27,31,53,78,123,148],{"title":10,"path":11,"stem":12},{"title":16,"path":17,"stem":18},"Démarrer","\u002Ffr\u002Fdocs\u002Fgetting-started","fr\u002Fdocs\u002F01.getting-started",{"title":20,"path":21,"stem":22},"Une app que vous avez déjà","\u002Ffr\u002Fdocs\u002Fexisting-app","fr\u002Fdocs\u002F02.existing-app",{"title":24,"path":25,"stem":26},"Apportez votre schéma","\u002Ffr\u002Fdocs\u002Fbring-your-schema","fr\u002Fdocs\u002F03.bring-your-schema",{"title":28,"path":29,"stem":30},"La CLI","\u002Ffr\u002Fdocs\u002Fcli","fr\u002Fdocs\u002F04.cli",{"title":32,"path":33,"stem":34,"children":35,"page":52},"Concepts","\u002Ffr\u002Fdocs\u002Fconcepts","fr\u002Fdocs\u002F2.concepts",[36,40,44,48],{"title":37,"path":38,"stem":39},"Philosophie","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fphilosophy","fr\u002Fdocs\u002F2.concepts\u002F1.philosophy",{"title":41,"path":42,"stem":43},"La Frond","\u002Ffr\u002Fdocs\u002Fconcepts\u002Ffrond","fr\u002Fdocs\u002F2.concepts\u002F2.frond",{"title":45,"path":46,"stem":47},"Le chemin le plus court","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fshortest-path","fr\u002Fdocs\u002F2.concepts\u002F3.shortest-path",{"title":49,"path":50,"stem":51},"Le socle","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fthe-base","fr\u002Fdocs\u002F2.concepts\u002F4.the-base",false,{"title":54,"path":55,"stem":56,"children":57,"page":52},"Schéma","\u002Ffr\u002Fdocs\u002Fschema","fr\u002Fdocs\u002F3.schema",[58,62,66,70,74],{"title":59,"path":60,"stem":61},"Entités","\u002Ffr\u002Fdocs\u002Fschema\u002Fentities","fr\u002Fdocs\u002F3.schema\u002F1.entities",{"title":63,"path":64,"stem":65},"Vues","\u002Ffr\u002Fdocs\u002Fschema\u002Fviews","fr\u002Fdocs\u002F3.schema\u002F2.views",{"title":67,"path":68,"stem":69},"La carte d'identité","\u002Ffr\u002Fdocs\u002Fschema\u002Fcard","fr\u002Fdocs\u002F3.schema\u002F3.card",{"title":71,"path":72,"stem":73},"Standard Schema","\u002Ffr\u002Fdocs\u002Fschema\u002Fstandard-schema","fr\u002Fdocs\u002F3.schema\u002F4.standard-schema",{"title":75,"path":76,"stem":77},"Comment un schéma bouge","\u002Ffr\u002Fdocs\u002Fschema\u002Fevolution","fr\u002Fdocs\u002F3.schema\u002F5.evolution",{"title":79,"path":80,"stem":81,"children":82,"page":52},"Métier","\u002Ffr\u002Fdocs\u002Fbusiness","fr\u002Fdocs\u002F4.business",[83,87,91,95,99,103,107,111,115,119],{"title":84,"path":85,"stem":86},"Handlers","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fhandlers","fr\u002Fdocs\u002F4.business\u002F1.handlers",{"title":88,"path":89,"stem":90},"Les ports","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fports","fr\u002Fdocs\u002F4.business\u002F10.ports",{"title":92,"path":93,"stem":94},"Presenters","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fpresenters","fr\u002Fdocs\u002F4.business\u002F2.presenters",{"title":96,"path":97,"stem":98},"Collectors","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fcollectors","fr\u002Fdocs\u002F4.business\u002F3.collectors",{"title":100,"path":101,"stem":102},"Erreurs","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ferrors","fr\u002Fdocs\u002F4.business\u002F4.errors",{"title":104,"path":105,"stem":106},"Seeds","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fseeds","fr\u002Fdocs\u002F4.business\u002F5.seeds",{"title":108,"path":109,"stem":110},"Les faits","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ffacts","fr\u002Fdocs\u002F4.business\u002F6.facts",{"title":112,"path":113,"stem":114},"Le port Storage","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fstorage","fr\u002Fdocs\u002F4.business\u002F7.storage",{"title":116,"path":117,"stem":118},"Des écritures qui tiennent ou tombent ensemble","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ftogether","fr\u002Fdocs\u002F4.business\u002F8.together",{"title":120,"path":121,"stem":122},"Les repositories","\u002Ffr\u002Fdocs\u002Fbusiness\u002Frepositories","fr\u002Fdocs\u002F4.business\u002F9.repositories",{"title":124,"path":125,"stem":126,"children":127,"page":52},"Client","\u002Ffr\u002Fdocs\u002Fclient","fr\u002Fdocs\u002F5.client",[128,132,136,140,144],{"title":129,"path":130,"stem":131},"Queries & commands","\u002Ffr\u002Fdocs\u002Fclient\u002Fqueries-commands","fr\u002Fdocs\u002F5.client\u002F1.queries-commands",{"title":133,"path":134,"stem":135},"Formulaires","\u002Ffr\u002Fdocs\u002Fclient\u002Fforms","fr\u002Fdocs\u002F5.client\u002F2.forms",{"title":137,"path":138,"stem":139},"Session","\u002Ffr\u002Fdocs\u002Fclient\u002Fsession","fr\u002Fdocs\u002F5.client\u002F3.session",{"title":141,"path":142,"stem":143},"invoke","\u002Ffr\u002Fdocs\u002Fclient\u002Finvoke","fr\u002Fdocs\u002F5.client\u002F4.invoke",{"title":145,"path":146,"stem":147},"Back-office","\u002Ffr\u002Fdocs\u002Fclient\u002Fadmin","fr\u002Fdocs\u002F5.client\u002F5.admin",{"title":149,"path":150,"stem":151,"children":152,"page":52},"Infrastructure","\u002Ffr\u002Fdocs\u002Finfra","fr\u002Fdocs\u002F6.infra",[153,157,161,165,169,173,177,181,185],{"title":154,"path":155,"stem":156},"Le gradient","\u002Ffr\u002Fdocs\u002Finfra\u002Fgradient","fr\u002Fdocs\u002F6.infra\u002F1.gradient",{"title":158,"path":159,"stem":160},"Surfaces — REST & GraphQL","\u002Ffr\u002Fdocs\u002Finfra\u002Fsurfaces","fr\u002Fdocs\u002F6.infra\u002F2.surfaces",{"title":162,"path":163,"stem":164},"Déploiement","\u002Ffr\u002Fdocs\u002Finfra\u002Fdeployment","fr\u002Fdocs\u002F6.infra\u002F3.deployment",{"title":166,"path":167,"stem":168},"Hôtes","\u002Ffr\u002Fdocs\u002Finfra\u002Fhosts","fr\u002Fdocs\u002F6.infra\u002F4.hosts",{"title":170,"path":171,"stem":172},"Les sources","\u002Ffr\u002Fdocs\u002Finfra\u002Fsources","fr\u002Fdocs\u002F6.infra\u002F5.sources",{"title":174,"path":175,"stem":176},"Le cycle de vie","\u002Ffr\u002Fdocs\u002Finfra\u002Flifecycle","fr\u002Fdocs\u002F6.infra\u002F6.lifecycle",{"title":178,"path":179,"stem":180},"L'identité entre Fronds","\u002Ffr\u002Fdocs\u002Finfra\u002Fidentity","fr\u002Fdocs\u002F6.infra\u002F7.identity",{"title":182,"path":183,"stem":184},"Observabilité","\u002Ffr\u002Fdocs\u002Finfra\u002Fobservability","fr\u002Fdocs\u002F6.infra\u002F8.observability",{"title":186,"path":187,"stem":188},"Tests","\u002Ffr\u002Fdocs\u002Finfra\u002Ftesting","fr\u002Fdocs\u002F6.infra\u002F9.testing",{"id":190,"title":133,"body":191,"description":1316,"extension":1317,"meta":1318,"navigation":282,"path":134,"seo":1319,"stem":135,"__hash__":1320},"docs_fr\u002Ffr\u002Fdocs\u002F5.client\u002F2.forms.md",{"type":192,"value":193,"toc":1310},"minimark",[194,198,206,674,679,736,739,890,893,1030,1034,1080,1087,1090,1175,1186,1190,1252,1256,1299,1306],[195,196,133],"h1",{"id":197},"formulaires",[199,200,201,205],"p",{},[202,203,204],"code",{},"useFormFor"," gère l'état, la validation, la soumission et les erreurs par champ. Il ne rend\naucun composant : la page choisit les champs et leur mise en page.",[207,208,213],"pre",{"className":209,"code":210,"language":211,"meta":212,"style":212},"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 en cas d'erreur de validation\n  if (created) navigateTo(`\u002Fblog\u002Fedit\u002F${created.id}`);\n}\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cform @submit.prevent=\"onSubmit\">\n    \u003CUFormField label=\"Titre\" :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!-- échec non-validation -->\n    \u003CUButton type=\"submit\" :loading=\"loading\" \u002F>\n  \u003C\u002Fform>\n\u003C\u002Ftemplate>\n","vue","",[202,214,215,251,277,284,357,362,380,406,452,458,468,473,483,506,541,577,587,621,655,665],{"__ignoreMap":212},[216,217,220,224,228,232,235,238,242,246,248],"span",{"class":218,"line":219},"line",1,[216,221,223],{"class":222},"sP7_E","\u003C",[216,225,227],{"class":226},"sQzsp","script",[216,229,231],{"class":230},"s9AJx"," setup",[216,233,234],{"class":230}," lang",[216,236,237],{"class":222},"=",[216,239,241],{"class":240},"sjJ54","\"",[216,243,245],{"class":244},"s_sjI","ts",[216,247,241],{"class":240},[216,249,250],{"class":222},">\n",[216,252,254,258,262,265,268,271,274],{"class":218,"line":253},2,[216,255,257],{"class":256},"sVHd0","import",[216,259,261],{"class":260},"su5hD"," Post ",[216,263,264],{"class":256},"from",[216,266,267],{"class":240}," '",[216,269,270],{"class":244},"@fronds\u002Fblog\u002Fentities\u002FPost",[216,272,273],{"class":240},"'",[216,275,276],{"class":222},";\n",[216,278,280],{"class":218,"line":279},3,[216,281,283],{"emptyLinePlaceholder":282},true,"\n",[216,285,287,291,294,298,301,304,306,309,311,314,316,319,321,324,327,331,335,338,342,345,349,352,355],{"class":218,"line":286},4,[216,288,290],{"class":289},"sbsja","const",[216,292,293],{"class":222}," {",[216,295,297],{"class":296},"s_hVV"," fieldsByName",[216,299,300],{"class":222},",",[216,302,303],{"class":296}," values",[216,305,300],{"class":222},[216,307,308],{"class":296}," errors",[216,310,300],{"class":222},[216,312,313],{"class":296}," submit",[216,315,300],{"class":222},[216,317,318],{"class":296}," loading",[216,320,300],{"class":222},[216,322,323],{"class":296}," error",[216,325,326],{"class":222}," }",[216,328,330],{"class":329},"smGrS"," =",[216,332,334],{"class":333},"sGLFI"," useFormFor",[216,336,337],{"class":222},"\u003C{",[216,339,341],{"class":340},"sucvu"," id",[216,343,344],{"class":329},":",[216,346,348],{"class":347},"sZMiF"," string",[216,350,351],{"class":222}," }>",[216,353,354],{"class":260},"(Post)",[216,356,276],{"class":222},[216,358,360],{"class":218,"line":359},5,[216,361,283],{"emptyLinePlaceholder":282},[216,363,365,368,371,374,377],{"class":218,"line":364},6,[216,366,367],{"class":289},"async",[216,369,370],{"class":289}," function",[216,372,373],{"class":333}," onSubmit",[216,375,376],{"class":222},"()",[216,378,379],{"class":222}," {\n",[216,381,383,386,389,391,394,396,399,402],{"class":218,"line":382},7,[216,384,385],{"class":289},"  const",[216,387,388],{"class":296}," created",[216,390,330],{"class":329},[216,392,393],{"class":256}," await",[216,395,313],{"class":333},[216,397,376],{"class":398},"skxfh",[216,400,401],{"class":222},";",[216,403,405],{"class":404},"sutJx","          \u002F\u002F null en cas d'erreur de validation\n",[216,407,409,412,415,418,421,424,427,430,433,436,438,441,444,447,450],{"class":218,"line":408},8,[216,410,411],{"class":256},"  if",[216,413,414],{"class":398}," (",[216,416,417],{"class":260},"created",[216,419,420],{"class":398},") ",[216,422,423],{"class":333},"navigateTo",[216,425,426],{"class":398},"(",[216,428,429],{"class":240},"`",[216,431,432],{"class":244},"\u002Fblog\u002Fedit\u002F",[216,434,435],{"class":240},"${",[216,437,417],{"class":260},[216,439,440],{"class":240},".",[216,442,443],{"class":260},"id",[216,445,446],{"class":240},"}`",[216,448,449],{"class":398},")",[216,451,276],{"class":222},[216,453,455],{"class":218,"line":454},9,[216,456,457],{"class":222},"}\n",[216,459,461,464,466],{"class":218,"line":460},10,[216,462,463],{"class":222},"\u003C\u002F",[216,465,227],{"class":226},[216,467,250],{"class":222},[216,469,471],{"class":218,"line":470},11,[216,472,283],{"emptyLinePlaceholder":282},[216,474,476,478,481],{"class":218,"line":475},12,[216,477,223],{"class":222},[216,479,480],{"class":226},"template",[216,482,250],{"class":222},[216,484,486,489,492,495,497,499,502,504],{"class":218,"line":485},13,[216,487,488],{"class":222},"  \u003C",[216,490,491],{"class":226},"form",[216,493,494],{"class":230}," @submit.prevent",[216,496,237],{"class":222},[216,498,241],{"class":240},[216,500,501],{"class":244},"onSubmit",[216,503,241],{"class":240},[216,505,250],{"class":222},[216,507,509,512,515,518,520,522,525,527,530,532,534,537,539],{"class":218,"line":508},14,[216,510,511],{"class":222},"    \u003C",[216,513,514],{"class":226},"UFormField",[216,516,517],{"class":230}," label",[216,519,237],{"class":222},[216,521,241],{"class":240},[216,523,524],{"class":244},"Titre",[216,526,241],{"class":240},[216,528,529],{"class":230}," :error",[216,531,237],{"class":222},[216,533,241],{"class":240},[216,535,536],{"class":244},"errors.title",[216,538,241],{"class":240},[216,540,250],{"class":222},[216,542,544,547,550,553,555,557,560,562,565,567,569,572,574],{"class":218,"line":543},15,[216,545,546],{"class":222},"      \u003C",[216,548,549],{"class":226},"UInput",[216,551,552],{"class":230}," v-model",[216,554,237],{"class":222},[216,556,241],{"class":240},[216,558,559],{"class":244},"values.title",[216,561,241],{"class":240},[216,563,564],{"class":230}," v-bind",[216,566,237],{"class":222},[216,568,241],{"class":240},[216,570,571],{"class":244},"fieldsByName.title?.attrs",[216,573,241],{"class":240},[216,575,576],{"class":222}," \u002F>\n",[216,578,580,583,585],{"class":218,"line":579},16,[216,581,582],{"class":222},"    \u003C\u002F",[216,584,514],{"class":226},[216,586,250],{"class":222},[216,588,590,592,594,597,599,601,604,606,609,612,614,616,618],{"class":218,"line":589},17,[216,591,511],{"class":222},[216,593,199],{"class":226},[216,595,596],{"class":230}," v-if",[216,598,237],{"class":222},[216,600,241],{"class":240},[216,602,603],{"class":244},"error",[216,605,241],{"class":240},[216,607,608],{"class":222},">",[216,610,611],{"class":260},"{{ error.message }}",[216,613,463],{"class":222},[216,615,199],{"class":226},[216,617,608],{"class":222},[216,619,620],{"class":404},"          \u003C!-- échec non-validation -->\n",[216,622,624,626,629,632,634,636,639,641,644,646,648,651,653],{"class":218,"line":623},18,[216,625,511],{"class":222},[216,627,628],{"class":226},"UButton",[216,630,631],{"class":230}," type",[216,633,237],{"class":222},[216,635,241],{"class":240},[216,637,638],{"class":244},"submit",[216,640,241],{"class":240},[216,642,643],{"class":230}," :loading",[216,645,237],{"class":222},[216,647,241],{"class":240},[216,649,650],{"class":244},"loading",[216,652,241],{"class":240},[216,654,576],{"class":222},[216,656,658,661,663],{"class":218,"line":657},19,[216,659,660],{"class":222},"  \u003C\u002F",[216,662,491],{"class":226},[216,664,250],{"class":222},[216,666,668,670,672],{"class":218,"line":667},20,[216,669,463],{"class":222},[216,671,480],{"class":226},[216,673,250],{"class":222},[675,676,678],"h2",{"id":677},"signature","Signature",[207,680,683],{"className":681,"code":682,"language":245,"meta":212,"style":212},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","useFormFor\u003CT>(EntityOuVue, options?)\n\u002F\u002F options: {\n\u002F\u002F   op?: string                        la command du submit — défaut 'create'\n\u002F\u002F   initial?: Record\u003Cstring, unknown>  mode édition : l'entité chargée\n\u002F\u002F   params?: Record\u003Cstring, string>    désignation de la cible — mode édition : { id }\n\u002F\u002F }\n",[202,684,685,711,716,721,726,731],{"__ignoreMap":212},[216,686,687,689,691,695,697,700,702,705,708],{"class":218,"line":219},[216,688,204],{"class":333},[216,690,223],{"class":222},[216,692,694],{"class":693},"sbgvK","T",[216,696,608],{"class":222},[216,698,699],{"class":260},"(EntityOuVue",[216,701,300],{"class":222},[216,703,704],{"class":260}," options",[216,706,707],{"class":329},"?",[216,709,710],{"class":260},")\n",[216,712,713],{"class":218,"line":253},[216,714,715],{"class":404},"\u002F\u002F options: {\n",[216,717,718],{"class":218,"line":279},[216,719,720],{"class":404},"\u002F\u002F   op?: string                        la command du submit — défaut 'create'\n",[216,722,723],{"class":218,"line":286},[216,724,725],{"class":404},"\u002F\u002F   initial?: Record\u003Cstring, unknown>  mode édition : l'entité chargée\n",[216,727,728],{"class":218,"line":359},[216,729,730],{"class":404},"\u002F\u002F   params?: Record\u003Cstring, string>    désignation de la cible — mode édition : { id }\n",[216,732,733],{"class":218,"line":364},[216,734,735],{"class":404},"\u002F\u002F }\n",[199,737,738],{},"Retour :",[740,741,742,758],"table",{},[743,744,745],"thead",{},[746,747,748,752,755],"tr",{},[749,750,751],"th",{},"Clé",[749,753,754],{},"Type",[749,756,757],{},"Notes",[759,760,761,781,796,815,829,843,856,875],"tbody",{},[746,762,763,769,774],{},[764,765,766],"td",{},[202,767,768],{},"fields",[764,770,771],{},[202,772,773],{},"FormField[]",[764,775,776,777,780],{},"dérivés des axes io — les champs ",[202,778,779],{},"readOnly"," sont exclus",[746,782,783,788,793],{},[764,784,785],{},[202,786,787],{},"fieldsByName",[764,789,790],{},[202,791,792],{},"Record\u003Cstring, FormField>",[764,794,795],{},"les mêmes champs, pour un formulaire posé à la main",[746,797,798,803,809],{},[764,799,800],{},[202,801,802],{},"values",[764,804,805,806],{},"record ",[202,807,808],{},"reactive",[764,810,811,814],{},[202,812,813],{},"initial"," en édition, le défaut déclaré du champ en création",[746,816,817,822,826],{},[764,818,819],{},[202,820,821],{},"errors",[764,823,805,824],{},[202,825,808],{},[764,827,828],{},"chemin de champ → message",[746,830,831,835,840],{},[764,832,833],{},[202,834,638],{},[764,836,837],{},[202,838,839],{},"() => Promise\u003CT | null>",[764,841,842],{},"voir le cycle",[746,844,845,849,854],{},[764,846,847],{},[202,848,650],{},[764,850,851],{},[202,852,853],{},"Ref\u003Cboolean>",[764,855],{},[746,857,858,862,867],{},[764,859,860],{},[202,861,603],{},[764,863,864],{},[202,865,866],{},"Ref\u003CFougereError | null>",[764,868,869,870,874],{},"échec ",[871,872,873],"strong",{},"non-validation"," (conflit, host mort)",[746,876,877,882,887],{},[764,878,879],{},[202,880,881],{},"valid",[764,883,884],{},[202,885,886],{},"ComputedRef\u003Cboolean>",[764,888,889],{},"aucune erreur de champ courante",[199,891,892],{},"Le mode édition se compose avec une query :",[207,894,896],{"className":681,"code":895,"language":245,"meta":212,"style":212},"const { data: post } = await useQuery\u003CPost>(Post, 'findById', { params: { id } });\nconst form = useFormFor(Post, { op: 'update', params: { id }, initial: post.value ?? undefined });\n",[202,897,898,963],{"__ignoreMap":212},[216,899,900,902,904,907,909,912,914,916,918,921,923,926,928,931,933,935,938,940,942,944,947,949,951,954,957,959,961],{"class":218,"line":219},[216,901,290],{"class":289},[216,903,293],{"class":222},[216,905,906],{"class":340}," data",[216,908,344],{"class":222},[216,910,911],{"class":296}," post",[216,913,326],{"class":222},[216,915,330],{"class":329},[216,917,393],{"class":256},[216,919,920],{"class":333}," useQuery",[216,922,223],{"class":222},[216,924,925],{"class":693},"Post",[216,927,608],{"class":222},[216,929,930],{"class":260},"(Post",[216,932,300],{"class":222},[216,934,267],{"class":240},[216,936,937],{"class":244},"findById",[216,939,273],{"class":240},[216,941,300],{"class":222},[216,943,293],{"class":222},[216,945,946],{"class":398}," params",[216,948,344],{"class":222},[216,950,293],{"class":222},[216,952,953],{"class":260}," id ",[216,955,956],{"class":222},"}",[216,958,326],{"class":222},[216,960,449],{"class":260},[216,962,276],{"class":222},[216,964,965,967,970,972,974,976,978,980,983,985,987,990,992,994,996,998,1000,1002,1005,1008,1010,1012,1014,1017,1020,1024,1026,1028],{"class":218,"line":253},[216,966,290],{"class":289},[216,968,969],{"class":296}," form",[216,971,330],{"class":329},[216,973,334],{"class":333},[216,975,930],{"class":260},[216,977,300],{"class":222},[216,979,293],{"class":222},[216,981,982],{"class":398}," op",[216,984,344],{"class":222},[216,986,267],{"class":240},[216,988,989],{"class":244},"update",[216,991,273],{"class":240},[216,993,300],{"class":222},[216,995,946],{"class":398},[216,997,344],{"class":222},[216,999,293],{"class":222},[216,1001,953],{"class":260},[216,1003,1004],{"class":222},"},",[216,1006,1007],{"class":398}," initial",[216,1009,344],{"class":222},[216,1011,911],{"class":260},[216,1013,440],{"class":222},[216,1015,1016],{"class":260},"value ",[216,1018,1019],{"class":329},"??",[216,1021,1023],{"class":1022},"s39Yj"," undefined",[216,1025,326],{"class":222},[216,1027,449],{"class":260},[216,1029,276],{"class":222},[675,1031,1033],{"id":1032},"le-navigateur-juge-en-premier-et-gratuitement","Le navigateur juge en premier, et gratuitement",[199,1035,1036,1039,1040,1043,1044,1043,1047,1043,1050,1043,1053,1043,1056,1043,1059,1062,1063,1066,1067,1069,1070,1043,1072,1075,1076,1079],{},[202,1037,1038],{},"field.attrs"," est la part de la déclaration qu'un navigateur applique déjà, sous les noms\nqu'il connaît : ",[202,1041,1042],{},"type",", ",[202,1045,1046],{},"required",[202,1048,1049],{},"minlength",[202,1051,1052],{},"maxlength",[202,1054,1055],{},"min",[202,1057,1058],{},"max",[202,1060,1061],{},"pattern",".\nRépandez-la et la page n'énonce aucune règle à elle — ",[202,1064,1065],{},"text({ min: 1, max: 200 })"," devient\n",[202,1068,1049],{},"\u002F",[202,1071,1052],{},[202,1073,1074],{},"email()"," devient ",[202,1077,1078],{},"type=\"email\"",", vérifié en direct pendant la\nsaisie, sans une ligne de JavaScript.",[199,1081,1082,1083,1086],{},"C'est une projection, pas une seconde règle : le juge lit la même forme. Un formulaire qui\nignore ",[202,1084,1085],{},"attrs"," obtient le même verdict, seulement plus tard — et un lecteur d'écran ne\nl'obtient jamais.",[199,1088,1089],{},"Trois attributs sont délibérément absents, chacun là où HTML dirait autre chose que la\ndéclaration :",[740,1091,1092,1105],{},[743,1093,1094],{},[746,1095,1096,1099,1102],{},[749,1097,1098],{},"Champ",[749,1100,1101],{},"Absent",[749,1103,1104],{},"Parce que",[759,1106,1107,1129,1151],{},[746,1108,1109,1114,1118],{},[764,1110,1111],{},[202,1112,1113],{},"date()",[764,1115,1116],{},[202,1117,1042],{},[764,1119,1120,1121,1124,1125,1128],{},"ni ",[202,1122,1123],{},"date"," ni ",[202,1126,1127],{},"datetime-local"," ne produit la chaîne RFC 3339 qu'attend le juge",[746,1130,1131,1136,1140],{},[764,1132,1133],{},[202,1134,1135],{},"bool()",[764,1137,1138],{},[202,1139,1046],{},[764,1141,1142,1143,1146,1147,1150],{},"sur une case à cocher, cela veut dire « doit être ",[871,1144,1145],{},"cochée"," » ; la forme dit que la valeur doit être fournie, et ",[202,1148,1149],{},"false"," en est une",[746,1152,1153,1160,1164],{},[764,1154,1155,1043,1158],{},[202,1156,1157],{},"oneOf(…)",[202,1159,1135],{},[764,1161,1162],{},[202,1163,1042],{},[764,1165,1166,1167,1170,1171,1174],{},"ce ne sont pas des ",[202,1168,1169],{},"\u003Cinput>"," — ",[202,1172,1173],{},"field.control"," dit quel widget, la page le rend",[199,1176,1177,1178,1181,1182,1185],{},"Ce que HTML ne sait pas dire du tout — une règle inter-champs, ",[202,1179,1180],{},"format: 'uuid'",", un\n",[202,1183,1184],{},"oneOf"," hors d'un select — est attrapé par la passe ci-dessous.",[675,1187,1189],{"id":1188},"le-cycle-du-submit","Le cycle du submit",[1191,1192,1193,1213,1223,1240],"ol",{},[1194,1195,1196,1170,1199,1202,1203,1205,1206,1209,1210,440],"li",{},[871,1197,1198],{},"Validation locale",[202,1200,1201],{},"Entity.validate(payload)"," s'exécute dans le navigateur avec\nles mêmes règles que le handler. Les erreurs sont ajoutées à ",[202,1204,821],{}," sans appel réseau\net ",[202,1207,1208],{},"submit()"," renvoie ",[202,1211,1212],{},"null",[1194,1214,1215,1218,1219,1222],{},[871,1216,1217],{},"Command"," — le payload est envoyé par ",[202,1220,1221],{},"useCommand(Entity, op)",". En cas de succès, les\nqueries actives de l'entité sont revalidées.",[1194,1224,1225,1228,1229,1232,1233,1235,1236,1239],{},[871,1226,1227],{},"Validation serveur"," — un ",[202,1230,1231],{},"VALIDATION_FAILED"," est ajouté à ",[202,1234,821],{}," selon le ",[202,1237,1238],{},"path",",\ndans le même format que les erreurs locales.",[1194,1241,1242,1243,1043,1246,1249,1250,440],{},"Les autres erreurs (",[202,1244,1245],{},"CONFLICT",[202,1247,1248],{},"SERVICE_UNAVAILABLE","…) sont placées dans ",[202,1251,603],{},[675,1253,1255],{"id":1254},"ce-que-le-formulaire-ne-fera-pas","Ce que le formulaire ne fera pas",[1257,1258,1259,1265,1273,1279],"ul",{},[1194,1260,1261,1264],{},[871,1262,1263],{},"Rendre des composants"," — les widgets et la mise en page restent dans l'application.",[1194,1266,1267,1272],{},[871,1268,1269,1270],{},"Montrer les champs ",[202,1271,779],{}," — ces champs sont exclus par la\nprojection io ; un statut s'affiche en badge depuis la donnée chargée, il ne s'édite pas.",[1194,1274,1275,1278],{},[871,1276,1277],{},"Définir les labels"," — ils restent dans votre i18n ; les métadonnées donnent des clés\nstables composées de l'entité et du nom du champ.",[1194,1280,1281,1284,1285,1287,1288,1290,1291,1294,1295,1298],{},[871,1282,1283],{},"Choisir une valeur supplémentaire."," ",[202,1286,802],{}," utilise ",[202,1289,813],{}," en édition et le défaut\ndéclaré du champ en création (",[202,1292,1293],{},"oneOf('public','private',{ default:'public' })"," ouvre le\nselect sur ",[202,1296,1297],{},"public","). Tout ce qui va au-delà de ces deux-là — un placeholder, une\nsuggestion calculée — est défini par la page.",[199,1300,1301,1302,1305],{},"Suite : ",[1303,1304,137],"a",{"href":138}," — partager l'identité avec les pages et les handlers.",[1307,1308,1309],"style",{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .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 .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 .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sucvu, html code.shiki .sucvu{--shiki-light:#E53935;--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":212,"searchDepth":253,"depth":253,"links":1311},[1312,1313,1314,1315],{"id":677,"depth":253,"text":678},{"id":1032,"depth":253,"text":1033},{"id":1188,"depth":253,"text":1189},{"id":1254,"depth":253,"text":1255},"useFormFor — état, validation, soumission et erreurs par champ.","md",{},{"title":133,"description":1316},"38EwcJFfNMItYPg60RzVX-3_iHLTPcQJVfNYNgVOidw",1788598419444]