[{"data":1,"prerenderedAt":1244},["ShallowReactive",2],{"content-\u002Fdocs\u002Fmultistep\u002Fstatuses":3},{"id":4,"title":5,"body":6,"description":1223,"extension":1224,"meta":1225,"metaRows":1226,"navigation":187,"path":1239,"seo":1240,"source":1241,"stem":1242,"__hash__":1243},"docs\u002Fdocs\u002Fmultistep\u002Fstatuses.md","Statuses",{"type":7,"value":8,"toc":1213},"minimark",[9,13,36,39,47,136,142,146,151,388,391,395,406,624,633,639,652,655,770,773,815,818,864,867,896,899,903,915,1027,1030,1169,1173,1209],[10,11,5],"h1",{"id":12},"statuses",[14,15,16],"blockquote",{},[17,18,19,23,24,27,28,31,32,35],"p",{},[20,21,22],"code",{},"wizard.statuses"," is a per-step ",[20,25,26],{},"FormStatus"," rollup that mirrors each form's ",[20,29,30],{},"meta",". Read it drillably for templates, call it for a snapshot, or seed it up-front with ",[20,33,34],{},"defaultStatuses"," for resume flows that need to render filled rails before per-form data lands.",[37,38],"docs-meta-table",{},[40,41,43,44,46],"h2",{"id":42},"the-formstatus-shape","The ",[20,45,26],{}," shape",[48,49,54],"pre",{"className":50,"code":51,"language":52,"meta":53,"style":53},"language-ts shiki shiki-themes github-light github-dark","type FormStatus = {\n  readonly valid: boolean\n  readonly dirty: boolean\n  readonly submitted: boolean\n  readonly errorCount: number\n}\n","ts","",[20,55,56,76,93,105,117,130],{"__ignoreMap":53},[57,58,61,65,69,72],"span",{"class":59,"line":60},"line",1,[57,62,64],{"class":63},"szBVR","type",[57,66,68],{"class":67},"sScJk"," FormStatus",[57,70,71],{"class":63}," =",[57,73,75],{"class":74},"sVt8B"," {\n",[57,77,79,82,86,89],{"class":59,"line":78},2,[57,80,81],{"class":63},"  readonly",[57,83,85],{"class":84},"s4XuR"," valid",[57,87,88],{"class":63},":",[57,90,92],{"class":91},"sj4cs"," boolean\n",[57,94,96,98,101,103],{"class":59,"line":95},3,[57,97,81],{"class":63},[57,99,100],{"class":84}," dirty",[57,102,88],{"class":63},[57,104,92],{"class":91},[57,106,108,110,113,115],{"class":59,"line":107},4,[57,109,81],{"class":63},[57,111,112],{"class":84}," submitted",[57,114,88],{"class":63},[57,116,92],{"class":91},[57,118,120,122,125,127],{"class":59,"line":119},5,[57,121,81],{"class":63},[57,123,124],{"class":84}," errorCount",[57,126,88],{"class":63},[57,128,129],{"class":91}," number\n",[57,131,133],{"class":59,"line":132},6,[57,134,135],{"class":74},"}\n",[17,137,138,139,141],{},"Each field tracks the per-step form's ",[20,140,30],{},". A step's status flips when its meta does. The four scalars are deliberately small. They're what step indicators, navigation gates, and submit summaries reach for.",[40,143,145],{"id":144},"reading-patterns","Reading patterns",[17,147,148,150],{},[20,149,22],{}," is both a drillable record and a callable accessor. Same data, three call shapes:",[48,152,154],{"className":50,"code":153,"language":52,"meta":53,"style":53},"import { useForm, useWizard } from 'attaform\u002Fzod'\nimport { z } from 'zod'\n\nconst accountSchema = z.object({ email: z.email() })\nconst profileSchema = z.object({ name: z.string().min(1) })\n\nconst account = useForm({ schema: accountSchema, key: 'signup-account' })\nconst profile = useForm({ schema: profileSchema, key: 'signup-profile' })\n\nconst wizard = useWizard({ steps: [account, profile] })\n\nwizard.statuses \u002F\u002F drillable record\nwizard.statuses() \u002F\u002F { 'signup-account': FormStatus, 'signup-profile': FormStatus }\nwizard.statuses('signup-account') \u002F\u002F FormStatus for one step\nwizard.statuses['signup-account'] \u002F\u002F FormStatus for one step (drillable)\nwizard.statuses['signup-account'].valid \u002F\u002F boolean\n",[20,155,156,171,183,189,214,248,252,274,294,299,315,320,330,344,361,375],{"__ignoreMap":53},[57,157,158,161,164,167],{"class":59,"line":60},[57,159,160],{"class":63},"import",[57,162,163],{"class":74}," { useForm, useWizard } ",[57,165,166],{"class":63},"from",[57,168,170],{"class":169},"sZZnC"," 'attaform\u002Fzod'\n",[57,172,173,175,178,180],{"class":59,"line":78},[57,174,160],{"class":63},[57,176,177],{"class":74}," { z } ",[57,179,166],{"class":63},[57,181,182],{"class":169}," 'zod'\n",[57,184,185],{"class":59,"line":95},[57,186,188],{"emptyLinePlaceholder":187},true,"\n",[57,190,191,194,197,199,202,205,208,211],{"class":59,"line":107},[57,192,193],{"class":63},"const",[57,195,196],{"class":91}," accountSchema",[57,198,71],{"class":63},[57,200,201],{"class":74}," z.",[57,203,204],{"class":67},"object",[57,206,207],{"class":74},"({ email: z.",[57,209,210],{"class":67},"email",[57,212,213],{"class":74},"() })\n",[57,215,216,218,221,223,225,227,230,233,236,239,242,245],{"class":59,"line":119},[57,217,193],{"class":63},[57,219,220],{"class":91}," profileSchema",[57,222,71],{"class":63},[57,224,201],{"class":74},[57,226,204],{"class":67},[57,228,229],{"class":74},"({ name: z.",[57,231,232],{"class":67},"string",[57,234,235],{"class":74},"().",[57,237,238],{"class":67},"min",[57,240,241],{"class":74},"(",[57,243,244],{"class":91},"1",[57,246,247],{"class":74},") })\n",[57,249,250],{"class":59,"line":132},[57,251,188],{"emptyLinePlaceholder":187},[57,253,255,257,260,262,265,268,271],{"class":59,"line":254},7,[57,256,193],{"class":63},[57,258,259],{"class":91}," account",[57,261,71],{"class":63},[57,263,264],{"class":67}," useForm",[57,266,267],{"class":74},"({ schema: accountSchema, key: ",[57,269,270],{"class":169},"'signup-account'",[57,272,273],{"class":74}," })\n",[57,275,277,279,282,284,286,289,292],{"class":59,"line":276},8,[57,278,193],{"class":63},[57,280,281],{"class":91}," profile",[57,283,71],{"class":63},[57,285,264],{"class":67},[57,287,288],{"class":74},"({ schema: profileSchema, key: ",[57,290,291],{"class":169},"'signup-profile'",[57,293,273],{"class":74},[57,295,297],{"class":59,"line":296},9,[57,298,188],{"emptyLinePlaceholder":187},[57,300,302,304,307,309,312],{"class":59,"line":301},10,[57,303,193],{"class":63},[57,305,306],{"class":91}," wizard",[57,308,71],{"class":63},[57,310,311],{"class":67}," useWizard",[57,313,314],{"class":74},"({ steps: [account, profile] })\n",[57,316,318],{"class":59,"line":317},11,[57,319,188],{"emptyLinePlaceholder":187},[57,321,323,326],{"class":59,"line":322},12,[57,324,325],{"class":74},"wizard.statuses ",[57,327,329],{"class":328},"sJ8bj","\u002F\u002F drillable record\n",[57,331,333,336,338,341],{"class":59,"line":332},13,[57,334,335],{"class":74},"wizard.",[57,337,12],{"class":67},[57,339,340],{"class":74},"() ",[57,342,343],{"class":328},"\u002F\u002F { 'signup-account': FormStatus, 'signup-profile': FormStatus }\n",[57,345,347,349,351,353,355,358],{"class":59,"line":346},14,[57,348,335],{"class":74},[57,350,12],{"class":67},[57,352,241],{"class":74},[57,354,270],{"class":169},[57,356,357],{"class":74},") ",[57,359,360],{"class":328},"\u002F\u002F FormStatus for one step\n",[57,362,364,367,369,372],{"class":59,"line":363},15,[57,365,366],{"class":74},"wizard.statuses[",[57,368,270],{"class":169},[57,370,371],{"class":74},"] ",[57,373,374],{"class":328},"\u002F\u002F FormStatus for one step (drillable)\n",[57,376,378,380,382,385],{"class":59,"line":377},16,[57,379,366],{"class":74},[57,381,270],{"class":169},[57,383,384],{"class":74},"].valid ",[57,386,387],{"class":328},"\u002F\u002F boolean\n",[17,389,390],{},"The drillable form is the template-friendly read; the callable form is convenient in script for one-off reads or destructured snapshots.",[40,392,394],{"id":393},"status-rails","Status rails",[17,396,397,398,401,402,405],{},"The classic use case is a step indicator: one dot per form, painted with its current state. ",[20,399,400],{},"wizard.steps"," walks the compiled positions; ",[20,403,404],{},"wizard.statuses[step.key]"," reads each one's status:",[48,407,411],{"className":408,"code":409,"language":410,"meta":53,"style":53},"language-vue shiki shiki-themes github-light github-dark","\u003Cscript setup lang=\"ts\">\n  import { useForm, useWizard } from 'attaform\u002Fzod'\n\n  const wizard = useWizard({ steps: [account, profile, review] })\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Col class=\"wizard-rail\">\n    \u003Cli v-for=\"step in wizard.steps\" :key=\"step.key\">\n      \u003Cspan\n        class=\"dot\"\n        :class=\"{\n          done: wizard.statuses[step.key].valid,\n          dirty: wizard.statuses[step.key].dirty,\n          current: wizard.currentStep === step.key,\n        }\"\n      \u002F>\n      {{ step.key }}\n    \u003C\u002Fli>\n  \u003C\u002Fol>\n\u003C\u002Ftemplate>\n","vue",[20,412,413,437,448,452,466,475,479,488,506,532,540,550,560,565,570,575,580,589,595,605,615],{"__ignoreMap":53},[57,414,415,418,422,425,428,431,434],{"class":59,"line":60},[57,416,417],{"class":74},"\u003C",[57,419,421],{"class":420},"s9eBZ","script",[57,423,424],{"class":67}," setup",[57,426,427],{"class":67}," lang",[57,429,430],{"class":74},"=",[57,432,433],{"class":169},"\"ts\"",[57,435,436],{"class":74},">\n",[57,438,439,442,444,446],{"class":59,"line":78},[57,440,441],{"class":63},"  import",[57,443,163],{"class":74},[57,445,166],{"class":63},[57,447,170],{"class":169},[57,449,450],{"class":59,"line":95},[57,451,188],{"emptyLinePlaceholder":187},[57,453,454,457,459,461,463],{"class":59,"line":107},[57,455,456],{"class":63},"  const",[57,458,306],{"class":91},[57,460,71],{"class":63},[57,462,311],{"class":67},[57,464,465],{"class":74},"({ steps: [account, profile, review] })\n",[57,467,468,471,473],{"class":59,"line":119},[57,469,470],{"class":74},"\u003C\u002F",[57,472,421],{"class":420},[57,474,436],{"class":74},[57,476,477],{"class":59,"line":132},[57,478,188],{"emptyLinePlaceholder":187},[57,480,481,483,486],{"class":59,"line":254},[57,482,417],{"class":74},[57,484,485],{"class":420},"template",[57,487,436],{"class":74},[57,489,490,493,496,499,501,504],{"class":59,"line":276},[57,491,492],{"class":74},"  \u003C",[57,494,495],{"class":420},"ol",[57,497,498],{"class":67}," class",[57,500,430],{"class":74},[57,502,503],{"class":169},"\"wizard-rail\"",[57,505,436],{"class":74},[57,507,508,511,514,517,519,522,525,527,530],{"class":59,"line":296},[57,509,510],{"class":74},"    \u003C",[57,512,513],{"class":420},"li",[57,515,516],{"class":67}," v-for",[57,518,430],{"class":74},[57,520,521],{"class":169},"\"step in wizard.steps\"",[57,523,524],{"class":67}," :key",[57,526,430],{"class":74},[57,528,529],{"class":169},"\"step.key\"",[57,531,436],{"class":74},[57,533,534,537],{"class":59,"line":301},[57,535,536],{"class":74},"      \u003C",[57,538,539],{"class":420},"span\n",[57,541,542,545,547],{"class":59,"line":317},[57,543,544],{"class":67},"        class",[57,546,430],{"class":74},[57,548,549],{"class":169},"\"dot\"\n",[57,551,552,555,557],{"class":59,"line":322},[57,553,554],{"class":67},"        :class",[57,556,430],{"class":74},[57,558,559],{"class":169},"\"{\n",[57,561,562],{"class":59,"line":332},[57,563,564],{"class":169},"          done: wizard.statuses[step.key].valid,\n",[57,566,567],{"class":59,"line":346},[57,568,569],{"class":169},"          dirty: wizard.statuses[step.key].dirty,\n",[57,571,572],{"class":59,"line":363},[57,573,574],{"class":169},"          current: wizard.currentStep === step.key,\n",[57,576,577],{"class":59,"line":377},[57,578,579],{"class":169},"        }\"\n",[57,581,583,587],{"class":59,"line":582},17,[57,584,586],{"class":585},"s7hpK","      \u002F",[57,588,436],{"class":74},[57,590,592],{"class":59,"line":591},18,[57,593,594],{"class":74},"      {{ step.key }}\n",[57,596,598,601,603],{"class":59,"line":597},19,[57,599,600],{"class":74},"    \u003C\u002F",[57,602,513],{"class":420},[57,604,436],{"class":74},[57,606,608,611,613],{"class":59,"line":607},20,[57,609,610],{"class":74},"  \u003C\u002F",[57,612,495],{"class":420},[57,614,436],{"class":74},[57,616,618,620,622],{"class":59,"line":617},21,[57,619,470],{"class":74},[57,621,485],{"class":420},[57,623,436],{"class":74},[17,625,626,627,632],{},"Affordance steps (bare-string slots) carry an always-valid status, so the rail can paint every position without special-casing them. See ",[628,629,631],"a",{"href":630},"\u002Fdocs\u002Fmultistep\u002Fstep-slots","Step slots"," for the affordance-slot story.",[40,634,636,637],{"id":635},"seeding-with-defaultstatuses","Seeding with ",[20,638,34],{},[17,640,641,642,644,645,647,648,651],{},"Resume flows (e-commerce checkouts reopened mid-purchase, partially-completed onboarding, draft restore) often need to render filled rails before any per-form data has loaded. The ",[20,643,34],{}," option seeds ",[20,646,22],{}," up-front. Three shapes mirror the ",[20,649,650],{},"defaultValues"," trichotomy.",[17,653,654],{},"A plain object for compile-time-known seeds:",[48,656,658],{"className":50,"code":657,"language":52,"meta":53,"style":53},"const wizard = useWizard({\n  steps: [account, profile, review],\n  defaultStatuses: {\n    'signup-account': { valid: true, dirty: false, submitted: true, errorCount: 0 },\n    'signup-profile': { valid: false, dirty: true, submitted: false, errorCount: 1 },\n    'signup-review': { valid: false, dirty: false, submitted: false, errorCount: 0 },\n  },\n})\n",[20,659,660,673,678,683,714,737,760,765],{"__ignoreMap":53},[57,661,662,664,666,668,670],{"class":59,"line":60},[57,663,193],{"class":63},[57,665,306],{"class":91},[57,667,71],{"class":63},[57,669,311],{"class":67},[57,671,672],{"class":74},"({\n",[57,674,675],{"class":59,"line":78},[57,676,677],{"class":74},"  steps: [account, profile, review],\n",[57,679,680],{"class":59,"line":95},[57,681,682],{"class":74},"  defaultStatuses: {\n",[57,684,685,688,691,694,697,700,703,705,708,711],{"class":59,"line":107},[57,686,687],{"class":169},"    'signup-account'",[57,689,690],{"class":74},": { valid: ",[57,692,693],{"class":91},"true",[57,695,696],{"class":74},", dirty: ",[57,698,699],{"class":91},"false",[57,701,702],{"class":74},", submitted: ",[57,704,693],{"class":91},[57,706,707],{"class":74},", errorCount: ",[57,709,710],{"class":91},"0",[57,712,713],{"class":74}," },\n",[57,715,716,719,721,723,725,727,729,731,733,735],{"class":59,"line":119},[57,717,718],{"class":169},"    'signup-profile'",[57,720,690],{"class":74},[57,722,699],{"class":91},[57,724,696],{"class":74},[57,726,693],{"class":91},[57,728,702],{"class":74},[57,730,699],{"class":91},[57,732,707],{"class":74},[57,734,244],{"class":91},[57,736,713],{"class":74},[57,738,739,742,744,746,748,750,752,754,756,758],{"class":59,"line":132},[57,740,741],{"class":169},"    'signup-review'",[57,743,690],{"class":74},[57,745,699],{"class":91},[57,747,696],{"class":74},[57,749,699],{"class":91},[57,751,702],{"class":74},[57,753,699],{"class":91},[57,755,707],{"class":74},[57,757,710],{"class":91},[57,759,713],{"class":74},[57,761,762],{"class":59,"line":254},[57,763,764],{"class":74},"  },\n",[57,766,767],{"class":59,"line":276},[57,768,769],{"class":74},"})\n",[17,771,772],{},"A sync factory for seeds derived from synchronous state (a draft snapshot in a Pinia store, a URL parameter, a cookie):",[48,774,776],{"className":50,"code":775,"language":52,"meta":53,"style":53},"const wizard = useWizard({\n  steps: [account, profile, review],\n  defaultStatuses: () => buildStatusesFromDraft(draftStore.snapshot),\n})\n",[20,777,778,790,794,811],{"__ignoreMap":53},[57,779,780,782,784,786,788],{"class":59,"line":60},[57,781,193],{"class":63},[57,783,306],{"class":91},[57,785,71],{"class":63},[57,787,311],{"class":67},[57,789,672],{"class":74},[57,791,792],{"class":59,"line":78},[57,793,677],{"class":74},[57,795,796,799,802,805,808],{"class":59,"line":95},[57,797,798],{"class":67},"  defaultStatuses",[57,800,801],{"class":74},": () ",[57,803,804],{"class":63},"=>",[57,806,807],{"class":67}," buildStatusesFromDraft",[57,809,810],{"class":74},"(draftStore.snapshot),\n",[57,812,813],{"class":59,"line":107},[57,814,769],{"class":74},[17,816,817],{},"An async factory for seeds that need a server round-trip (saved flow state, a server-rendered status payload):",[48,819,821],{"className":50,"code":820,"language":52,"meta":53,"style":53},"const wizard = useWizard({\n  steps: [account, profile, review],\n  defaultStatuses: async () => fetchSavedFlowStatuses(userId),\n})\n",[20,822,823,835,839,860],{"__ignoreMap":53},[57,824,825,827,829,831,833],{"class":59,"line":60},[57,826,193],{"class":63},[57,828,306],{"class":91},[57,830,71],{"class":63},[57,832,311],{"class":67},[57,834,672],{"class":74},[57,836,837],{"class":59,"line":78},[57,838,677],{"class":74},[57,840,841,843,846,849,852,854,857],{"class":59,"line":95},[57,842,798],{"class":67},[57,844,845],{"class":74},": ",[57,847,848],{"class":63},"async",[57,850,851],{"class":74}," () ",[57,853,804],{"class":63},[57,855,856],{"class":67}," fetchSavedFlowStatuses",[57,858,859],{"class":74},"(userId),\n",[57,861,862],{"class":59,"line":107},[57,863,769],{"class":74},[17,865,866],{},"The seed fills in until the real form data lands. Resolution priority per step:",[495,868,869,880,883,889],{},[513,870,871,872,875,876,879],{},"The step's form has ",[20,873,874],{},"defaultsResolved === true"," (its async \u002F sync defaults have settled). Status derives from ",[20,877,878],{},"form.meta",".",[513,881,882],{},"The step is an affordance (noop form). The built-in always-valid status renders.",[513,884,885,886,888],{},"The step has a seed entry from ",[20,887,34],{},". The seed value renders.",[513,890,891,892,895],{},"Otherwise, a pending status renders (",[20,893,894],{},"valid: false, dirty: false, submitted: false, errorCount: 0",").",[17,897,898],{},"Unknown keys in the seed object dev-warn at construction; the wizard ignores them. Known keys still apply, so a partial seed is fine.",[40,900,902],{"id":901},"reacting-to-status-changes","Reacting to status changes",[17,904,905,907,908,911,912,914],{},[20,906,22],{}," is reactive, so Vue's ",[20,909,910],{},"watch"," is the right tool for one-off side effects (analytics, autosave, a celebration toast when the last step flips valid). The status proxy plugs into Vue's reactivity the same way ",[20,913,878],{}," does:",[48,916,918],{"className":50,"code":917,"language":52,"meta":53,"style":53},"import { watch } from 'vue'\nimport { useForm, useWizard } from 'attaform\u002Fzod'\n\nconst wizard = useWizard({ steps: [account, profile, review] })\n\nwatch(\n  () => wizard.statuses['signup-profile'].valid,\n  (isValid) => {\n    if (isValid) analytics.track('profile_complete', { user: userId })\n  }\n)\n",[20,919,920,932,942,946,958,962,969,984,998,1017,1022],{"__ignoreMap":53},[57,921,922,924,927,929],{"class":59,"line":60},[57,923,160],{"class":63},[57,925,926],{"class":74}," { watch } ",[57,928,166],{"class":63},[57,930,931],{"class":169}," 'vue'\n",[57,933,934,936,938,940],{"class":59,"line":78},[57,935,160],{"class":63},[57,937,163],{"class":74},[57,939,166],{"class":63},[57,941,170],{"class":169},[57,943,944],{"class":59,"line":95},[57,945,188],{"emptyLinePlaceholder":187},[57,947,948,950,952,954,956],{"class":59,"line":107},[57,949,193],{"class":63},[57,951,306],{"class":91},[57,953,71],{"class":63},[57,955,311],{"class":67},[57,957,465],{"class":74},[57,959,960],{"class":59,"line":119},[57,961,188],{"emptyLinePlaceholder":187},[57,963,964,966],{"class":59,"line":132},[57,965,910],{"class":67},[57,967,968],{"class":74},"(\n",[57,970,971,974,976,979,981],{"class":59,"line":254},[57,972,973],{"class":74},"  () ",[57,975,804],{"class":63},[57,977,978],{"class":74}," wizard.statuses[",[57,980,291],{"class":169},[57,982,983],{"class":74},"].valid,\n",[57,985,986,989,992,994,996],{"class":59,"line":276},[57,987,988],{"class":74},"  (",[57,990,991],{"class":84},"isValid",[57,993,357],{"class":74},[57,995,804],{"class":63},[57,997,75],{"class":74},[57,999,1000,1003,1006,1009,1011,1014],{"class":59,"line":296},[57,1001,1002],{"class":63},"    if",[57,1004,1005],{"class":74}," (isValid) analytics.",[57,1007,1008],{"class":67},"track",[57,1010,241],{"class":74},[57,1012,1013],{"class":169},"'profile_complete'",[57,1015,1016],{"class":74},", { user: userId })\n",[57,1018,1019],{"class":59,"line":301},[57,1020,1021],{"class":74},"  }\n",[57,1023,1024],{"class":59,"line":317},[57,1025,1026],{"class":74},")\n",[17,1028,1029],{},"For a whole-wizard sweep, watch the callable form and diff against the previous snapshot:",[48,1031,1033],{"className":50,"code":1032,"language":52,"meta":53,"style":53},"watch(\n  () => wizard.statuses(),\n  (next, prev) => {\n    for (const [key, status] of Object.entries(next)) {\n      if (status.valid && !prev[key]?.valid) {\n        analytics.track('step_valid', { key })\n      }\n    }\n  },\n  { deep: true }\n)\n",[20,1034,1035,1041,1055,1074,1109,1126,1141,1146,1151,1155,1165],{"__ignoreMap":53},[57,1036,1037,1039],{"class":59,"line":60},[57,1038,910],{"class":67},[57,1040,968],{"class":74},[57,1042,1043,1045,1047,1050,1052],{"class":59,"line":78},[57,1044,973],{"class":74},[57,1046,804],{"class":63},[57,1048,1049],{"class":74}," wizard.",[57,1051,12],{"class":67},[57,1053,1054],{"class":74},"(),\n",[57,1056,1057,1059,1062,1065,1068,1070,1072],{"class":59,"line":95},[57,1058,988],{"class":74},[57,1060,1061],{"class":84},"next",[57,1063,1064],{"class":74},", ",[57,1066,1067],{"class":84},"prev",[57,1069,357],{"class":74},[57,1071,804],{"class":63},[57,1073,75],{"class":74},[57,1075,1076,1079,1082,1084,1087,1090,1092,1095,1097,1100,1103,1106],{"class":59,"line":107},[57,1077,1078],{"class":63},"    for",[57,1080,1081],{"class":74}," (",[57,1083,193],{"class":63},[57,1085,1086],{"class":74}," [",[57,1088,1089],{"class":91},"key",[57,1091,1064],{"class":74},[57,1093,1094],{"class":91},"status",[57,1096,371],{"class":74},[57,1098,1099],{"class":63},"of",[57,1101,1102],{"class":74}," Object.",[57,1104,1105],{"class":67},"entries",[57,1107,1108],{"class":74},"(next)) {\n",[57,1110,1111,1114,1117,1120,1123],{"class":59,"line":119},[57,1112,1113],{"class":63},"      if",[57,1115,1116],{"class":74}," (status.valid ",[57,1118,1119],{"class":63},"&&",[57,1121,1122],{"class":63}," !",[57,1124,1125],{"class":74},"prev[key]?.valid) {\n",[57,1127,1128,1131,1133,1135,1138],{"class":59,"line":132},[57,1129,1130],{"class":74},"        analytics.",[57,1132,1008],{"class":67},[57,1134,241],{"class":74},[57,1136,1137],{"class":169},"'step_valid'",[57,1139,1140],{"class":74},", { key })\n",[57,1142,1143],{"class":59,"line":254},[57,1144,1145],{"class":74},"      }\n",[57,1147,1148],{"class":59,"line":276},[57,1149,1150],{"class":74},"    }\n",[57,1152,1153],{"class":59,"line":296},[57,1154,764],{"class":74},[57,1156,1157,1160,1162],{"class":59,"line":301},[57,1158,1159],{"class":74},"  { deep: ",[57,1161,693],{"class":91},[57,1163,1164],{"class":74}," }\n",[57,1166,1167],{"class":59,"line":317},[57,1168,1026],{"class":74},[40,1170,1172],{"id":1171},"where-to-next","Where to next",[1174,1175,1176,1185,1199],"ul",{},[513,1177,1178,1184],{},[628,1179,1181],{"href":1180},"\u002Fdocs\u002Fmultistep\u002Fuse-wizard",[20,1182,1183],{},"useWizard"," for the construction signature and the wizard's full reactive surface.",[513,1186,1187,1191,1192,1195,1196,879],{},[628,1188,1190],{"href":1189},"\u002Fdocs\u002Fmultistep\u002Faggregates","Aggregates"," for ",[20,1193,1194],{},"wizard.allValues"," and ",[20,1197,1198],{},"wizard.allErrors",[513,1200,1201,1205,1206,879],{},[628,1202,1204],{"href":1203},"\u002Fdocs\u002Fmultistep\u002Fhandle-submit","handleSubmit"," for the submission pipeline that flips per-form ",[20,1207,1208],{},"submitted",[1210,1211,1212],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .s7hpK, html code.shiki .s7hpK{--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}",{"title":53,"searchDepth":78,"depth":78,"links":1214},[1215,1217,1218,1219,1221,1222],{"id":42,"depth":78,"text":1216},"The FormStatus shape",{"id":144,"depth":78,"text":145},{"id":393,"depth":78,"text":394},{"id":635,"depth":78,"text":1220},"Seeding with defaultStatuses",{"id":901,"depth":78,"text":902},{"id":1171,"depth":78,"text":1172},"wizard.statuses surfaces a per-step FormStatus rollup (valid, dirty, submitted, errorCount) ready for progress rails, navigation gates, and submit summaries. Read it drillably, call it for a snapshot, or seed it up-front with defaultStatuses for resumable flows.","md",{},[1227,1230,1233,1236],{"label":1228,"value":1229},"Category","Reactive surface",{"label":1231,"value":1232,"kind":20},"Shape","{ valid, dirty, submitted, errorCount }",{"label":1234,"value":1235},"Read patterns","drillable · callable · called with a key",{"label":1237,"value":1238,"kind":20},"Seeding","defaultStatuses (object, sync factory, async factory)","\u002Fdocs\u002Fmultistep\u002Fstatuses",{"title":5,"description":1223},null,"docs\u002Fmultistep\u002Fstatuses","78gpY_OhbRA_hdX3UMhKGmS3fRjXCb4al_KFBk41NUA",1780949761679]