[{"data":1,"prerenderedAt":1350},["ShallowReactive",2],{"content-\u002Fdocs\u002Fmultistep\u002Faggregates":3},{"id":4,"title":5,"body":6,"description":1330,"extension":1331,"meta":1332,"metaRows":1333,"navigation":96,"path":1345,"seo":1346,"source":1347,"stem":1348,"__hash__":1349},"docs\u002Fdocs\u002Fmultistep\u002Faggregates.md","Aggregates",{"type":7,"value":8,"toc":1318},"minimark",[9,13,32,35,43,49,287,537,547,558,607,614,627,700,714,721,730,853,863,866,1123,1130,1133,1190,1194,1197,1233,1249,1256,1278,1282,1314],[10,11,5],"h1",{"id":12},"aggregates",[14,15,16],"blockquote",{},[17,18,19,23,24,27,28,31],"p",{},[20,21,22],"code",{},"wizard.allValues"," and ",[20,25,26],{},"wizard.allErrors"," are records keyed by step key, ready for review screens and error-summary panels. ",[20,29,30],{},"wizard.forms"," is the typed record of every form in the compiled list. The three surfaces share one shape and one read pattern: indexable, drillable, and reactive end-to-end.",[33,34],"docs-meta-table",{},[36,37,39,42],"h2",{"id":38},"allvalues-for-review-screens",[20,40,41],{},"allValues"," for review screens",[17,44,45,46,48],{},"The final step of a wizard often shows everything the user entered, gated behind a confirm-and-submit button. ",[20,47,22],{}," is the cross-step read surface, keyed by step key:",[50,51,56],"pre",{"className":52,"code":53,"language":54,"meta":55,"style":55},"language-ts shiki shiki-themes github-light github-dark","import { useForm, useWizard } from 'attaform\u002Fzod'\nimport { z } from 'zod'\n\nconst accountSchema = z.object({ email: z.email(), name: z.string().min(1) })\nconst profileSchema = z.object({ city: z.string(), country: z.string() })\nconst reviewSchema = z.object({ tos: z.literal(true) })\n\nconst account = useForm({ schema: accountSchema, key: 'signup-account' })\nconst profile = useForm({ schema: profileSchema, key: 'signup-profile' })\nconst review = useForm({ schema: reviewSchema, key: 'signup-review' })\n\nconst wizard = useWizard({ steps: [account, profile, review] })\n","ts","",[20,57,58,78,91,98,145,172,199,204,226,246,266,271],{"__ignoreMap":55},[59,60,63,67,71,74],"span",{"class":61,"line":62},"line",1,[59,64,66],{"class":65},"szBVR","import",[59,68,70],{"class":69},"sVt8B"," { useForm, useWizard } ",[59,72,73],{"class":65},"from",[59,75,77],{"class":76},"sZZnC"," 'attaform\u002Fzod'\n",[59,79,81,83,86,88],{"class":61,"line":80},2,[59,82,66],{"class":65},[59,84,85],{"class":69}," { z } ",[59,87,73],{"class":65},[59,89,90],{"class":76}," 'zod'\n",[59,92,94],{"class":61,"line":93},3,[59,95,97],{"emptyLinePlaceholder":96},true,"\n",[59,99,101,104,108,111,114,118,121,124,127,130,133,136,139,142],{"class":61,"line":100},4,[59,102,103],{"class":65},"const",[59,105,107],{"class":106},"sj4cs"," accountSchema",[59,109,110],{"class":65}," =",[59,112,113],{"class":69}," z.",[59,115,117],{"class":116},"sScJk","object",[59,119,120],{"class":69},"({ email: z.",[59,122,123],{"class":116},"email",[59,125,126],{"class":69},"(), name: z.",[59,128,129],{"class":116},"string",[59,131,132],{"class":69},"().",[59,134,135],{"class":116},"min",[59,137,138],{"class":69},"(",[59,140,141],{"class":106},"1",[59,143,144],{"class":69},") })\n",[59,146,148,150,153,155,157,159,162,164,167,169],{"class":61,"line":147},5,[59,149,103],{"class":65},[59,151,152],{"class":106}," profileSchema",[59,154,110],{"class":65},[59,156,113],{"class":69},[59,158,117],{"class":116},[59,160,161],{"class":69},"({ city: z.",[59,163,129],{"class":116},[59,165,166],{"class":69},"(), country: z.",[59,168,129],{"class":116},[59,170,171],{"class":69},"() })\n",[59,173,175,177,180,182,184,186,189,192,194,197],{"class":61,"line":174},6,[59,176,103],{"class":65},[59,178,179],{"class":106}," reviewSchema",[59,181,110],{"class":65},[59,183,113],{"class":69},[59,185,117],{"class":116},[59,187,188],{"class":69},"({ tos: z.",[59,190,191],{"class":116},"literal",[59,193,138],{"class":69},[59,195,196],{"class":106},"true",[59,198,144],{"class":69},[59,200,202],{"class":61,"line":201},7,[59,203,97],{"emptyLinePlaceholder":96},[59,205,207,209,212,214,217,220,223],{"class":61,"line":206},8,[59,208,103],{"class":65},[59,210,211],{"class":106}," account",[59,213,110],{"class":65},[59,215,216],{"class":116}," useForm",[59,218,219],{"class":69},"({ schema: accountSchema, key: ",[59,221,222],{"class":76},"'signup-account'",[59,224,225],{"class":69}," })\n",[59,227,229,231,234,236,238,241,244],{"class":61,"line":228},9,[59,230,103],{"class":65},[59,232,233],{"class":106}," profile",[59,235,110],{"class":65},[59,237,216],{"class":116},[59,239,240],{"class":69},"({ schema: profileSchema, key: ",[59,242,243],{"class":76},"'signup-profile'",[59,245,225],{"class":69},[59,247,249,251,254,256,258,261,264],{"class":61,"line":248},10,[59,250,103],{"class":65},[59,252,253],{"class":106}," review",[59,255,110],{"class":65},[59,257,216],{"class":116},[59,259,260],{"class":69},"({ schema: reviewSchema, key: ",[59,262,263],{"class":76},"'signup-review'",[59,265,225],{"class":69},[59,267,269],{"class":61,"line":268},11,[59,270,97],{"emptyLinePlaceholder":96},[59,272,274,276,279,281,284],{"class":61,"line":273},12,[59,275,103],{"class":65},[59,277,278],{"class":106}," wizard",[59,280,110],{"class":65},[59,282,283],{"class":116}," useWizard",[59,285,286],{"class":69},"({ steps: [account, profile, review] })\n",[50,288,292],{"className":289,"code":290,"language":291,"meta":55,"style":55},"language-vue shiki shiki-themes github-light github-dark","\u003Ctemplate>\n  \u003Csection v-if=\"wizard.currentStep === 'signup-review'\">\n    \u003Ch2>Review\u003C\u002Fh2>\n    \u003Cdl>\n      \u003Cdt>Email\u003C\u002Fdt>\n      \u003Cdd>{{ wizard.allValues['signup-account'].email }}\u003C\u002Fdd>\n      \u003Cdt>Name\u003C\u002Fdt>\n      \u003Cdd>{{ wizard.allValues['signup-account'].name }}\u003C\u002Fdd>\n      \u003Cdt>City\u003C\u002Fdt>\n      \u003Cdd>{{ wizard.allValues['signup-profile'].city }}\u003C\u002Fdd>\n      \u003Cdt>Country\u003C\u002Fdt>\n      \u003Cdd>{{ wizard.allValues['signup-profile'].country }}\u003C\u002Fdd>\n    \u003C\u002Fdl>\n    \u003Clabel>\n      \u003Cinput v-register=\"review.register('tos')\" type=\"checkbox\" \u002F>\n      I agree\n    \u003C\u002Flabel>\n  \u003C\u002Fsection>\n\u003C\u002Ftemplate>\n","vue",[20,293,294,306,325,339,348,363,377,390,403,416,429,442,455,465,475,502,508,517,527],{"__ignoreMap":55},[59,295,296,299,303],{"class":61,"line":62},[59,297,298],{"class":69},"\u003C",[59,300,302],{"class":301},"s9eBZ","template",[59,304,305],{"class":69},">\n",[59,307,308,311,314,317,320,323],{"class":61,"line":80},[59,309,310],{"class":69},"  \u003C",[59,312,313],{"class":301},"section",[59,315,316],{"class":116}," v-if",[59,318,319],{"class":69},"=",[59,321,322],{"class":76},"\"wizard.currentStep === 'signup-review'\"",[59,324,305],{"class":69},[59,326,327,330,332,335,337],{"class":61,"line":93},[59,328,329],{"class":69},"    \u003C",[59,331,36],{"class":301},[59,333,334],{"class":69},">Review\u003C\u002F",[59,336,36],{"class":301},[59,338,305],{"class":69},[59,340,341,343,346],{"class":61,"line":100},[59,342,329],{"class":69},[59,344,345],{"class":301},"dl",[59,347,305],{"class":69},[59,349,350,353,356,359,361],{"class":61,"line":147},[59,351,352],{"class":69},"      \u003C",[59,354,355],{"class":301},"dt",[59,357,358],{"class":69},">Email\u003C\u002F",[59,360,355],{"class":301},[59,362,305],{"class":69},[59,364,365,367,370,373,375],{"class":61,"line":174},[59,366,352],{"class":69},[59,368,369],{"class":301},"dd",[59,371,372],{"class":69},">{{ wizard.allValues['signup-account'].email }}\u003C\u002F",[59,374,369],{"class":301},[59,376,305],{"class":69},[59,378,379,381,383,386,388],{"class":61,"line":201},[59,380,352],{"class":69},[59,382,355],{"class":301},[59,384,385],{"class":69},">Name\u003C\u002F",[59,387,355],{"class":301},[59,389,305],{"class":69},[59,391,392,394,396,399,401],{"class":61,"line":206},[59,393,352],{"class":69},[59,395,369],{"class":301},[59,397,398],{"class":69},">{{ wizard.allValues['signup-account'].name }}\u003C\u002F",[59,400,369],{"class":301},[59,402,305],{"class":69},[59,404,405,407,409,412,414],{"class":61,"line":228},[59,406,352],{"class":69},[59,408,355],{"class":301},[59,410,411],{"class":69},">City\u003C\u002F",[59,413,355],{"class":301},[59,415,305],{"class":69},[59,417,418,420,422,425,427],{"class":61,"line":248},[59,419,352],{"class":69},[59,421,369],{"class":301},[59,423,424],{"class":69},">{{ wizard.allValues['signup-profile'].city }}\u003C\u002F",[59,426,369],{"class":301},[59,428,305],{"class":69},[59,430,431,433,435,438,440],{"class":61,"line":268},[59,432,352],{"class":69},[59,434,355],{"class":301},[59,436,437],{"class":69},">Country\u003C\u002F",[59,439,355],{"class":301},[59,441,305],{"class":69},[59,443,444,446,448,451,453],{"class":61,"line":273},[59,445,352],{"class":69},[59,447,369],{"class":301},[59,449,450],{"class":69},">{{ wizard.allValues['signup-profile'].country }}\u003C\u002F",[59,452,369],{"class":301},[59,454,305],{"class":69},[59,456,458,461,463],{"class":61,"line":457},13,[59,459,460],{"class":69},"    \u003C\u002F",[59,462,345],{"class":301},[59,464,305],{"class":69},[59,466,468,470,473],{"class":61,"line":467},14,[59,469,329],{"class":69},[59,471,472],{"class":301},"label",[59,474,305],{"class":69},[59,476,478,480,483,486,488,491,494,496,499],{"class":61,"line":477},15,[59,479,352],{"class":69},[59,481,482],{"class":301},"input",[59,484,485],{"class":116}," v-register",[59,487,319],{"class":69},[59,489,490],{"class":76},"\"review.register('tos')\"",[59,492,493],{"class":116}," type",[59,495,319],{"class":69},[59,497,498],{"class":76},"\"checkbox\"",[59,500,501],{"class":69}," \u002F>\n",[59,503,505],{"class":61,"line":504},16,[59,506,507],{"class":69},"      I agree\n",[59,509,511,513,515],{"class":61,"line":510},17,[59,512,460],{"class":69},[59,514,472],{"class":301},[59,516,305],{"class":69},[59,518,520,523,525],{"class":61,"line":519},18,[59,521,522],{"class":69},"  \u003C\u002F",[59,524,313],{"class":301},[59,526,305],{"class":69},[59,528,530,533,535],{"class":61,"line":529},19,[59,531,532],{"class":69},"\u003C\u002F",[59,534,302],{"class":301},[59,536,305],{"class":69},[17,538,539,542,543,546],{},[20,540,541],{},"wizard.allValues['signup-account'].email"," proxies to the underlying form's ",[20,544,545],{},"values.email",". The proxy is reactive: edits on earlier steps reflect in the review screen without a round trip. Affordance positions contribute empty objects under their key, so iterating the record stays safe even when the path mixes collection and affordance steps.",[17,548,549,550,553,554,557],{},"For typed reads, hold onto each form ref and drill through it directly. ",[20,551,552],{},"wizard.allValues[key]"," is typed ",[20,555,556],{},"unknown"," (the wizard doesn't generically thread each form's schema through the aggregate), so:",[50,559,561],{"className":52,"code":560,"language":54,"meta":55,"style":55},"\u002F\u002F Typed: the schema follows the ref.\nconst accountEmail = account.values.email\n\n\u002F\u002F Loose-typed: useful in template prose, cast or narrow in script.\nconst aggregateEmail = wizard.allValues['signup-account']\n",[20,562,563,569,581,585,590],{"__ignoreMap":55},[59,564,565],{"class":61,"line":62},[59,566,568],{"class":567},"sJ8bj","\u002F\u002F Typed: the schema follows the ref.\n",[59,570,571,573,576,578],{"class":61,"line":80},[59,572,103],{"class":65},[59,574,575],{"class":106}," accountEmail",[59,577,110],{"class":65},[59,579,580],{"class":69}," account.values.email\n",[59,582,583],{"class":61,"line":93},[59,584,97],{"emptyLinePlaceholder":96},[59,586,587],{"class":61,"line":100},[59,588,589],{"class":567},"\u002F\u002F Loose-typed: useful in template prose, cast or narrow in script.\n",[59,591,592,594,597,599,602,604],{"class":61,"line":147},[59,593,103],{"class":65},[59,595,596],{"class":106}," aggregateEmail",[59,598,110],{"class":65},[59,600,601],{"class":69}," wizard.allValues[",[59,603,222],{"class":76},[59,605,606],{"class":69},"]\n",[36,608,610,613],{"id":609},"forms-for-typed-cross-step-access",[20,611,612],{},"forms"," for typed cross-step access",[17,615,616,618,619,622,623,626],{},[20,617,30],{}," is the typed record of every form in the compiled list. Statically-known form slots contribute their concrete form type to the record; runtime-resolved positions (function slots, ",[20,620,621],{},"lazy()"," slots) fall under the catch-all ",[20,624,625],{},"AnyForm"," signature.",[50,628,630],{"className":52,"code":629,"language":54,"meta":55,"style":55},"const wizard = useWizard({ steps: [account, profile, review] })\n\n\u002F\u002F account \u002F profile \u002F review keys typed to their concrete form refs:\nwizard.forms['signup-account'].values.email \u002F\u002F typed string\nwizard.forms['signup-profile'].fields.city.showErrors \u002F\u002F typed boolean\n\n\u002F\u002F Function-slot positions: AnyForm fallback.\nwizard.forms['runtime-resolved-key'].values \u002F\u002F typed unknown\n",[20,631,632,644,648,653,666,678,682,687],{"__ignoreMap":55},[59,633,634,636,638,640,642],{"class":61,"line":62},[59,635,103],{"class":65},[59,637,278],{"class":106},[59,639,110],{"class":65},[59,641,283],{"class":116},[59,643,286],{"class":69},[59,645,646],{"class":61,"line":80},[59,647,97],{"emptyLinePlaceholder":96},[59,649,650],{"class":61,"line":93},[59,651,652],{"class":567},"\u002F\u002F account \u002F profile \u002F review keys typed to their concrete form refs:\n",[59,654,655,658,660,663],{"class":61,"line":100},[59,656,657],{"class":69},"wizard.forms[",[59,659,222],{"class":76},[59,661,662],{"class":69},"].values.email ",[59,664,665],{"class":567},"\u002F\u002F typed string\n",[59,667,668,670,672,675],{"class":61,"line":147},[59,669,657],{"class":69},[59,671,243],{"class":76},[59,673,674],{"class":69},"].fields.city.showErrors ",[59,676,677],{"class":567},"\u002F\u002F typed boolean\n",[59,679,680],{"class":61,"line":174},[59,681,97],{"emptyLinePlaceholder":96},[59,683,684],{"class":61,"line":201},[59,685,686],{"class":567},"\u002F\u002F Function-slot positions: AnyForm fallback.\n",[59,688,689,691,694,697],{"class":61,"line":206},[59,690,657],{"class":69},[59,692,693],{"class":76},"'runtime-resolved-key'",[59,695,696],{"class":69},"].values ",[59,698,699],{"class":567},"\u002F\u002F typed unknown\n",[17,701,702,703,705,706,709,710,713],{},"The ",[20,704,612],{}," record is the right surface for cross-component reads. A floating-finish-button component reaches ",[20,707,708],{},"wizard.forms[key]"," to inspect any step's state, and the form handle that comes back is identity-equal to the original ",[20,711,712],{},"useForm"," ref. Mutations on one are observable on the other.",[36,715,717,720],{"id":716},"allerrors-for-wizard-wide-summaries",[20,718,719],{},"allErrors"," for wizard-wide summaries",[17,722,723,725,726,729],{},[20,724,26],{}," is a record keyed by step key. Each value is the flat list of ",[20,727,728],{},"AggregateError"," entries that step has produced:",[50,731,733],{"className":52,"code":732,"language":54,"meta":55,"style":55},"type AggregateError = {\n  readonly formKey: FormKey\n  readonly path: ReadonlyArray\u003Cstring | number>\n  readonly message: string\n  readonly code?: string\n}\n\ntype AllErrors = Readonly\u003CRecord\u003CFormKey, readonly AggregateError[]>>\n",[20,734,735,748,763,787,799,811,816,820],{"__ignoreMap":55},[59,736,737,740,743,745],{"class":61,"line":62},[59,738,739],{"class":65},"type",[59,741,742],{"class":116}," AggregateError",[59,744,110],{"class":65},[59,746,747],{"class":69}," {\n",[59,749,750,753,757,760],{"class":61,"line":80},[59,751,752],{"class":65},"  readonly",[59,754,756],{"class":755},"s4XuR"," formKey",[59,758,759],{"class":65},":",[59,761,762],{"class":116}," FormKey\n",[59,764,765,767,770,772,775,777,779,782,785],{"class":61,"line":93},[59,766,752],{"class":65},[59,768,769],{"class":755}," path",[59,771,759],{"class":65},[59,773,774],{"class":116}," ReadonlyArray",[59,776,298],{"class":69},[59,778,129],{"class":106},[59,780,781],{"class":65}," |",[59,783,784],{"class":106}," number",[59,786,305],{"class":69},[59,788,789,791,794,796],{"class":61,"line":100},[59,790,752],{"class":65},[59,792,793],{"class":755}," message",[59,795,759],{"class":65},[59,797,798],{"class":106}," string\n",[59,800,801,803,806,809],{"class":61,"line":147},[59,802,752],{"class":65},[59,804,805],{"class":755}," code",[59,807,808],{"class":65},"?:",[59,810,798],{"class":106},[59,812,813],{"class":61,"line":174},[59,814,815],{"class":69},"}\n",[59,817,818],{"class":61,"line":201},[59,819,97],{"emptyLinePlaceholder":96},[59,821,822,824,827,829,832,834,837,839,842,845,848,850],{"class":61,"line":206},[59,823,739],{"class":65},[59,825,826],{"class":116}," AllErrors",[59,828,110],{"class":65},[59,830,831],{"class":116}," Readonly",[59,833,298],{"class":69},[59,835,836],{"class":116},"Record",[59,838,298],{"class":69},[59,840,841],{"class":116},"FormKey",[59,843,844],{"class":69},", ",[59,846,847],{"class":65},"readonly",[59,849,742],{"class":116},[59,851,852],{"class":69},"[]>>\n",[17,854,855,856,23,859,862],{},"Each entry carries ",[20,857,858],{},"formKey",[20,860,861],{},"path"," so a wizard-wide summary panel can route a click back to the offending field. Empty steps and unresolved steps contribute empty arrays under their key, keeping the record uniform.",[17,864,865],{},"For a wizard-wide summary, flatten the record into one array and render the union:",[50,867,869],{"className":289,"code":868,"language":291,"meta":55,"style":55},"\u003Cscript setup lang=\"ts\">\n  import { computed } from 'vue'\n\n  const wizard = useWizard({ steps: [account, profile, review] })\n\n  const flatErrors = computed(() => Object.values(wizard.allErrors).flat())\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Caside v-if=\"flatErrors.length > 0\" class=\"error-summary\">\n    \u003Ch3>Fix {{ flatErrors.length }} issue(s) before continuing\u003C\u002Fh3>\n    \u003Cul>\n      \u003Cli v-for=\"err in flatErrors\" :key=\"`${err.formKey}-${err.path.join('.')}`\">\n        \u003Cbutton type=\"button\" @click=\"wizard.goTo(err.formKey)\">\n          {{ err.message }} ({{ err.formKey }} · {{ err.path.join('.') }})\n        \u003C\u002Fbutton>\n      \u003C\u002Fli>\n    \u003C\u002Ful>\n  \u003C\u002Faside>\n\u003C\u002Ftemplate>\n",[20,870,871,891,904,908,921,925,958,966,970,978,1002,1016,1025,1050,1075,1080,1089,1098,1106,1114],{"__ignoreMap":55},[59,872,873,875,878,881,884,886,889],{"class":61,"line":62},[59,874,298],{"class":69},[59,876,877],{"class":301},"script",[59,879,880],{"class":116}," setup",[59,882,883],{"class":116}," lang",[59,885,319],{"class":69},[59,887,888],{"class":76},"\"ts\"",[59,890,305],{"class":69},[59,892,893,896,899,901],{"class":61,"line":80},[59,894,895],{"class":65},"  import",[59,897,898],{"class":69}," { computed } ",[59,900,73],{"class":65},[59,902,903],{"class":76}," 'vue'\n",[59,905,906],{"class":61,"line":93},[59,907,97],{"emptyLinePlaceholder":96},[59,909,910,913,915,917,919],{"class":61,"line":100},[59,911,912],{"class":65},"  const",[59,914,278],{"class":106},[59,916,110],{"class":65},[59,918,283],{"class":116},[59,920,286],{"class":69},[59,922,923],{"class":61,"line":147},[59,924,97],{"emptyLinePlaceholder":96},[59,926,927,929,932,934,937,940,943,946,949,952,955],{"class":61,"line":174},[59,928,912],{"class":65},[59,930,931],{"class":106}," flatErrors",[59,933,110],{"class":65},[59,935,936],{"class":116}," computed",[59,938,939],{"class":69},"(() ",[59,941,942],{"class":65},"=>",[59,944,945],{"class":69}," Object.",[59,947,948],{"class":116},"values",[59,950,951],{"class":69},"(wizard.allErrors).",[59,953,954],{"class":116},"flat",[59,956,957],{"class":69},"())\n",[59,959,960,962,964],{"class":61,"line":201},[59,961,532],{"class":69},[59,963,877],{"class":301},[59,965,305],{"class":69},[59,967,968],{"class":61,"line":206},[59,969,97],{"emptyLinePlaceholder":96},[59,971,972,974,976],{"class":61,"line":228},[59,973,298],{"class":69},[59,975,302],{"class":301},[59,977,305],{"class":69},[59,979,980,982,985,987,989,992,995,997,1000],{"class":61,"line":248},[59,981,310],{"class":69},[59,983,984],{"class":301},"aside",[59,986,316],{"class":116},[59,988,319],{"class":69},[59,990,991],{"class":76},"\"flatErrors.length > 0\"",[59,993,994],{"class":116}," class",[59,996,319],{"class":69},[59,998,999],{"class":76},"\"error-summary\"",[59,1001,305],{"class":69},[59,1003,1004,1006,1009,1012,1014],{"class":61,"line":268},[59,1005,329],{"class":69},[59,1007,1008],{"class":301},"h3",[59,1010,1011],{"class":69},">Fix {{ flatErrors.length }} issue(s) before continuing\u003C\u002F",[59,1013,1008],{"class":301},[59,1015,305],{"class":69},[59,1017,1018,1020,1023],{"class":61,"line":273},[59,1019,329],{"class":69},[59,1021,1022],{"class":301},"ul",[59,1024,305],{"class":69},[59,1026,1027,1029,1032,1035,1037,1040,1043,1045,1048],{"class":61,"line":457},[59,1028,352],{"class":69},[59,1030,1031],{"class":301},"li",[59,1033,1034],{"class":116}," v-for",[59,1036,319],{"class":69},[59,1038,1039],{"class":76},"\"err in flatErrors\"",[59,1041,1042],{"class":116}," :key",[59,1044,319],{"class":69},[59,1046,1047],{"class":76},"\"`${err.formKey}-${err.path.join('.')}`\"",[59,1049,305],{"class":69},[59,1051,1052,1055,1058,1060,1062,1065,1068,1070,1073],{"class":61,"line":467},[59,1053,1054],{"class":69},"        \u003C",[59,1056,1057],{"class":301},"button",[59,1059,493],{"class":116},[59,1061,319],{"class":69},[59,1063,1064],{"class":76},"\"button\"",[59,1066,1067],{"class":116}," @click",[59,1069,319],{"class":69},[59,1071,1072],{"class":76},"\"wizard.goTo(err.formKey)\"",[59,1074,305],{"class":69},[59,1076,1077],{"class":61,"line":477},[59,1078,1079],{"class":69},"          {{ err.message }} ({{ err.formKey }} · {{ err.path.join('.') }})\n",[59,1081,1082,1085,1087],{"class":61,"line":504},[59,1083,1084],{"class":69},"        \u003C\u002F",[59,1086,1057],{"class":301},[59,1088,305],{"class":69},[59,1090,1091,1094,1096],{"class":61,"line":510},[59,1092,1093],{"class":69},"      \u003C\u002F",[59,1095,1031],{"class":301},[59,1097,305],{"class":69},[59,1099,1100,1102,1104],{"class":61,"line":519},[59,1101,460],{"class":69},[59,1103,1022],{"class":301},[59,1105,305],{"class":69},[59,1107,1108,1110,1112],{"class":61,"line":529},[59,1109,522],{"class":69},[59,1111,984],{"class":301},[59,1113,305],{"class":69},[59,1115,1117,1119,1121],{"class":61,"line":1116},20,[59,1118,532],{"class":69},[59,1120,302],{"class":301},[59,1122,305],{"class":69},[17,1124,1125,1126,1129],{},"A click on any summary row jumps the wizard to the step that produced the error. The consumer wires the focus \u002F scroll behavior from there (see ",[20,1127,1128],{},"wizard.activeForm.focusField()"," on the form handle).",[17,1131,1132],{},"For a per-step summary, index into the record directly:",[50,1134,1136],{"className":289,"code":1135,"language":291,"meta":55,"style":55},"\u003Ctemplate>\n  \u003Caside v-if=\"(wizard.allErrors['signup-profile']?.length ?? 0) > 0\">\n    \u003Ch3>Profile step has {{ wizard.allErrors['signup-profile'].length }} issue(s)\u003C\u002Fh3>\n  \u003C\u002Faside>\n\u003C\u002Ftemplate>\n",[20,1137,1138,1146,1161,1174,1182],{"__ignoreMap":55},[59,1139,1140,1142,1144],{"class":61,"line":62},[59,1141,298],{"class":69},[59,1143,302],{"class":301},[59,1145,305],{"class":69},[59,1147,1148,1150,1152,1154,1156,1159],{"class":61,"line":80},[59,1149,310],{"class":69},[59,1151,984],{"class":301},[59,1153,316],{"class":116},[59,1155,319],{"class":69},[59,1157,1158],{"class":76},"\"(wizard.allErrors['signup-profile']?.length ?? 0) > 0\"",[59,1160,305],{"class":69},[59,1162,1163,1165,1167,1170,1172],{"class":61,"line":93},[59,1164,329],{"class":69},[59,1166,1008],{"class":301},[59,1168,1169],{"class":69},">Profile step has {{ wizard.allErrors['signup-profile'].length }} issue(s)\u003C\u002F",[59,1171,1008],{"class":301},[59,1173,305],{"class":69},[59,1175,1176,1178,1180],{"class":61,"line":100},[59,1177,522],{"class":69},[59,1179,984],{"class":301},[59,1181,305],{"class":69},[59,1183,1184,1186,1188],{"class":61,"line":147},[59,1185,532],{"class":69},[59,1187,302],{"class":301},[59,1189,305],{"class":69},[36,1191,1193],{"id":1192},"what-contributes-to-the-aggregates","What contributes to the aggregates",[17,1195,1196],{},"Each surface walks the compiled step list:",[1022,1198,1199,1208,1224],{},[1031,1200,1201,1204,1205,1207],{},[20,1202,1203],{},"allValues[key]"," is the form's live ",[20,1206,948],{}," proxy. Edits land immediately.",[1031,1209,1210,1213,1214,1217,1218,1220,1221,1223],{},[20,1211,1212],{},"allErrors[key]"," is the form's ",[20,1215,1216],{},"meta.errors",", rebuilt as ",[20,1219,728],{}," entries with ",[20,1222,858],{}," stamped on. A form whose defaults are still resolving contributes an empty array.",[1031,1225,1226,1229,1230,1232],{},[20,1227,1228],{},"forms[key]"," is the form handle itself, identity-equal to the original ",[20,1231,712],{}," ref.",[17,1234,1235,1236,1239,1240,1242,1243,1248],{},"Submitting the wizard via ",[20,1237,1238],{},"wizard.handleSubmit"," is what populates ",[20,1241,719],{}," with validation results. See ",[1244,1245,1247],"a",{"href":1246},"\u002Fdocs\u002Fmultistep\u002Fhandle-submit","handleSubmit"," for the submission lifecycle that drives the aggregate.",[36,1250,1252,1255],{"id":1251},"wizardsubmissionattempts-vs-per-form-attempts",[20,1253,1254],{},"wizard.submissionAttempts"," vs per-form attempts",[17,1257,1258,1259,1262,1263,1265,1266,1268,1269,1271,1272,1274,1275,1277],{},"Each form keeps its own ",[20,1260,1261],{},"meta.submissionAttempts",", incremented by ",[20,1264,1238],{}," whenever that form is in the validation set (intermediate steps validate only the active form; final-step submits validate every form). The wizard-level ",[20,1267,1254],{}," increments once per ",[20,1270,1247],{}," invocation, regardless of how many forms were involved. For \"did the user click Finish?\" reach for ",[20,1273,1254],{},"; for \"has the user tried this step?\" reach for the form's own ",[20,1276,1261],{},".",[36,1279,1281],{"id":1280},"where-to-next","Where to next",[1022,1283,1284,1296,1307],{},[1031,1285,1286,1292,1293,1277],{},[1244,1287,1289],{"href":1288},"\u002Fdocs\u002Fmultistep\u002Fuse-wizard",[20,1290,1291],{},"useWizard"," for navigation and ",[20,1294,1295],{},"activeForm",[1031,1297,1298,1302,1303,1306],{},[1244,1299,1301],{"href":1300},"\u002Fdocs\u002Fmultistep\u002Fstatuses","Statuses"," for the per-step ",[20,1304,1305],{},"FormStatus"," rollup that feeds rails and progress.",[1031,1308,1309,1311,1312,1277],{},[1244,1310,1247],{"href":1246}," for the submission pipeline that populates ",[20,1313,719],{},[1315,1316,1317],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}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 .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":55,"searchDepth":80,"depth":80,"links":1319},[1320,1322,1324,1326,1327,1329],{"id":38,"depth":80,"text":1321},"allValues for review screens",{"id":609,"depth":80,"text":1323},"forms for typed cross-step access",{"id":716,"depth":80,"text":1325},"allErrors for wizard-wide summaries",{"id":1192,"depth":80,"text":1193},{"id":1251,"depth":80,"text":1328},"wizard.submissionAttempts vs per-form attempts",{"id":1280,"depth":80,"text":1281},"wizard.allValues, wizard.allErrors, and wizard.forms expose cross-step state ready for review screens, summary panels, and final-submit aggregation. Each surface is a record keyed by step key, drillable straight into the underlying form.","md",{},[1334,1337,1339,1342],{"label":1335,"value":1336},"Category","Reactive surface",{"label":1338,"value":552,"kind":20},"Values",{"label":1340,"value":1341,"kind":20},"Errors","wizard.allErrors[key]: AggregateError[]",{"label":1343,"value":1344,"kind":20},"Forms","wizard.forms[key]: typed form handle","\u002Fdocs\u002Fmultistep\u002Faggregates",{"title":5,"description":1330},null,"docs\u002Fmultistep\u002Faggregates","D76cwc-0luQ-fX5tBSP1h_9FS_5tB5UKYXPh04-oc7w",1780949761816]