[{"data":1,"prerenderedAt":1090},["ShallowReactive",2],{"content-\u002Fdocs\u002Fschemas\u002Fnested-objects":3},{"id":4,"title":5,"body":6,"description":1062,"extension":1063,"meta":1064,"metaRows":1065,"navigation":226,"path":1066,"seo":1067,"source":1065,"stem":1088,"__hash__":1089},"docs\u002Fdocs\u002Fschemas\u002Fnested-objects.md","Nested objects",{"type":7,"value":8,"toc":1052},"minimark",[9,13,37,40,54,59,244,247,295,299,314,502,509,513,636,661,671,675,682,816,826,830,836,872,875,879,882,967,970,974,977,1020,1023,1027,1048],[10,11,5],"h1",{"id":12},"nested-objects",[14,15,16],"blockquote",{},[17,18,19,20,24,25,28,29,32,33,36],"p",{},"Schemas compose by nesting: one ",[21,22,23],"code",{},"z.object"," inside another. The proxy descends through dot-paths so ",[21,26,27],{},"form.values.profile.name",", ",[21,30,31],{},"form.errors.profile.name",", and ",[21,34,35],{},"register('profile.name')"," all work the way you'd expect.",[38,39],"docs-meta-table",{},[17,41,42,43,48,49,53],{},"This page is code-only; every other demo in the docs already nests objects. The shape, the proxy, and the path semantics are best understood through the snippets below; reach for a real demo on ",[44,45,47],"a",{"href":46},"\u002Fdocs\u002Fschemas\u002Farrays-and-tuples","Arrays & tuples"," (which composes arrays of nested objects) or ",[44,50,52],{"href":51},"\u002Fdocs\u002Fschemas\u002Fdiscriminated-unions","Discriminated unions"," (which nests variant objects inside the outer union) when you want to see it live.",[55,56,58],"h2",{"id":57},"the-shape","The shape",[60,61,66],"pre",{"className":62,"code":63,"language":64,"meta":65,"style":65},"language-ts shiki shiki-themes github-light github-dark","const schema = z.object({\n  profile: z.object({\n    name: z.string().min(1, 'Name is required'),\n    bio: z.string().optional(),\n  }),\n  address: z.object({\n    line1: z.string().min(1, 'Street is required'),\n    city: z.string(),\n    postalCode: z.string(),\n  }),\n})\n\nconst form = useForm({ schema })\n","ts","",[21,67,68,95,105,135,151,157,167,190,200,210,215,221,228],{"__ignoreMap":65},[69,70,73,77,81,84,88,92],"span",{"class":71,"line":72},"line",1,[69,74,76],{"class":75},"szBVR","const",[69,78,80],{"class":79},"sj4cs"," schema",[69,82,83],{"class":75}," =",[69,85,87],{"class":86},"sVt8B"," z.",[69,89,91],{"class":90},"sScJk","object",[69,93,94],{"class":86},"({\n",[69,96,98,101,103],{"class":71,"line":97},2,[69,99,100],{"class":86},"  profile: z.",[69,102,91],{"class":90},[69,104,94],{"class":86},[69,106,108,111,114,117,120,123,126,128,132],{"class":71,"line":107},3,[69,109,110],{"class":86},"    name: z.",[69,112,113],{"class":90},"string",[69,115,116],{"class":86},"().",[69,118,119],{"class":90},"min",[69,121,122],{"class":86},"(",[69,124,125],{"class":79},"1",[69,127,28],{"class":86},[69,129,131],{"class":130},"sZZnC","'Name is required'",[69,133,134],{"class":86},"),\n",[69,136,138,141,143,145,148],{"class":71,"line":137},4,[69,139,140],{"class":86},"    bio: z.",[69,142,113],{"class":90},[69,144,116],{"class":86},[69,146,147],{"class":90},"optional",[69,149,150],{"class":86},"(),\n",[69,152,154],{"class":71,"line":153},5,[69,155,156],{"class":86},"  }),\n",[69,158,160,163,165],{"class":71,"line":159},6,[69,161,162],{"class":86},"  address: z.",[69,164,91],{"class":90},[69,166,94],{"class":86},[69,168,170,173,175,177,179,181,183,185,188],{"class":71,"line":169},7,[69,171,172],{"class":86},"    line1: z.",[69,174,113],{"class":90},[69,176,116],{"class":86},[69,178,119],{"class":90},[69,180,122],{"class":86},[69,182,125],{"class":79},[69,184,28],{"class":86},[69,186,187],{"class":130},"'Street is required'",[69,189,134],{"class":86},[69,191,193,196,198],{"class":71,"line":192},8,[69,194,195],{"class":86},"    city: z.",[69,197,113],{"class":90},[69,199,150],{"class":86},[69,201,203,206,208],{"class":71,"line":202},9,[69,204,205],{"class":86},"    postalCode: z.",[69,207,113],{"class":90},[69,209,150],{"class":86},[69,211,213],{"class":71,"line":212},10,[69,214,156],{"class":86},[69,216,218],{"class":71,"line":217},11,[69,219,220],{"class":86},"})\n",[69,222,224],{"class":71,"line":223},12,[69,225,227],{"emptyLinePlaceholder":226},true,"\n",[69,229,231,233,236,238,241],{"class":71,"line":230},13,[69,232,76],{"class":75},[69,234,235],{"class":79}," form",[69,237,83],{"class":75},[69,239,240],{"class":90}," useForm",[69,242,243],{"class":86},"({ schema })\n",[17,245,246],{},"Each leaf gets its own path:",[60,248,250],{"className":62,"code":249,"language":64,"meta":65,"style":65},"form.values.profile.name \u002F\u002F string\nform.values.address.city \u002F\u002F string\nform.register('profile.name') \u002F\u002F path autocomplete narrows the union\nform.errors.address.postalCode \u002F\u002F readonly ValidationError[]\n",[21,251,252,261,268,287],{"__ignoreMap":65},[69,253,254,257],{"class":71,"line":72},[69,255,256],{"class":86},"form.values.profile.name ",[69,258,260],{"class":259},"sJ8bj","\u002F\u002F string\n",[69,262,263,266],{"class":71,"line":97},[69,264,265],{"class":86},"form.values.address.city ",[69,267,260],{"class":259},[69,269,270,273,276,278,281,284],{"class":71,"line":107},[69,271,272],{"class":86},"form.",[69,274,275],{"class":90},"register",[69,277,122],{"class":86},[69,279,280],{"class":130},"'profile.name'",[69,282,283],{"class":86},") ",[69,285,286],{"class":259},"\u002F\u002F path autocomplete narrows the union\n",[69,288,289,292],{"class":71,"line":137},[69,290,291],{"class":86},"form.errors.address.postalCode ",[69,293,294],{"class":259},"\u002F\u002F readonly ValidationError[]\n",[55,296,298],{"id":297},"the-proxy-descends-transparently","The proxy descends transparently",[17,300,301,28,304,32,307,310,311,313],{},[21,302,303],{},"form.values",[21,305,306],{},"form.errors",[21,308,309],{},"form.fields"," are all proxies; ",[21,312,27],{}," resolves through one descend per dot segment. The reactivity tracks at the path level, not the leaf level: re-running templates only fires for paths whose values changed.",[60,315,319],{"className":316,"code":317,"language":318,"meta":65,"style":65},"language-vue shiki shiki-themes github-light github-dark","\u003Ctemplate>\n  \u003Cfieldset>\n    \u003Clegend>Profile\u003C\u002Flegend>\n    \u003Clabel>\n      Name\n      \u003Cinput v-register=\"form.register('profile.name')\" \u002F>\n      \u003Cem v-if=\"form.fields.profile.name.showErrors\">\n        {{ form.fields.profile.name.firstError?.message }}\n      \u003C\u002Fem>\n    \u003C\u002Flabel>\n    \u003Clabel>\n      Bio\n      \u003Ctextarea v-register=\"form.register('profile.bio')\" rows=\"3\" \u002F>\n    \u003C\u002Flabel>\n  \u003C\u002Ffieldset>\n\u003C\u002Ftemplate>\n","vue",[21,320,321,333,343,358,367,372,392,409,414,423,432,440,445,473,482,492],{"__ignoreMap":65},[69,322,323,326,330],{"class":71,"line":72},[69,324,325],{"class":86},"\u003C",[69,327,329],{"class":328},"s9eBZ","template",[69,331,332],{"class":86},">\n",[69,334,335,338,341],{"class":71,"line":97},[69,336,337],{"class":86},"  \u003C",[69,339,340],{"class":328},"fieldset",[69,342,332],{"class":86},[69,344,345,348,351,354,356],{"class":71,"line":107},[69,346,347],{"class":86},"    \u003C",[69,349,350],{"class":328},"legend",[69,352,353],{"class":86},">Profile\u003C\u002F",[69,355,350],{"class":328},[69,357,332],{"class":86},[69,359,360,362,365],{"class":71,"line":137},[69,361,347],{"class":86},[69,363,364],{"class":328},"label",[69,366,332],{"class":86},[69,368,369],{"class":71,"line":153},[69,370,371],{"class":86},"      Name\n",[69,373,374,377,380,383,386,389],{"class":71,"line":159},[69,375,376],{"class":86},"      \u003C",[69,378,379],{"class":328},"input",[69,381,382],{"class":90}," v-register",[69,384,385],{"class":86},"=",[69,387,388],{"class":130},"\"form.register('profile.name')\"",[69,390,391],{"class":86}," \u002F>\n",[69,393,394,396,399,402,404,407],{"class":71,"line":169},[69,395,376],{"class":86},[69,397,398],{"class":328},"em",[69,400,401],{"class":90}," v-if",[69,403,385],{"class":86},[69,405,406],{"class":130},"\"form.fields.profile.name.showErrors\"",[69,408,332],{"class":86},[69,410,411],{"class":71,"line":192},[69,412,413],{"class":86},"        {{ form.fields.profile.name.firstError?.message }}\n",[69,415,416,419,421],{"class":71,"line":202},[69,417,418],{"class":86},"      \u003C\u002F",[69,420,398],{"class":328},[69,422,332],{"class":86},[69,424,425,428,430],{"class":71,"line":212},[69,426,427],{"class":86},"    \u003C\u002F",[69,429,364],{"class":328},[69,431,332],{"class":86},[69,433,434,436,438],{"class":71,"line":217},[69,435,347],{"class":86},[69,437,364],{"class":328},[69,439,332],{"class":86},[69,441,442],{"class":71,"line":223},[69,443,444],{"class":86},"      Bio\n",[69,446,447,449,452,454,456,459,462,464,467,471],{"class":71,"line":230},[69,448,376],{"class":86},[69,450,451],{"class":328},"textarea",[69,453,382],{"class":90},[69,455,385],{"class":86},[69,457,458],{"class":130},"\"form.register('profile.bio')\"",[69,460,461],{"class":90}," rows",[69,463,385],{"class":86},[69,465,466],{"class":130},"\"3\"",[69,468,470],{"class":469},"s7hpK"," \u002F",[69,472,332],{"class":86},[69,474,476,478,480],{"class":71,"line":475},14,[69,477,427],{"class":86},[69,479,364],{"class":328},[69,481,332],{"class":86},[69,483,485,488,490],{"class":71,"line":484},15,[69,486,487],{"class":86},"  \u003C\u002F",[69,489,340],{"class":328},[69,491,332],{"class":86},[69,493,495,498,500],{"class":71,"line":494},16,[69,496,497],{"class":86},"\u003C\u002F",[69,499,329],{"class":328},[69,501,332],{"class":86},[17,503,504,505,508],{},"The pattern scales to arbitrary depth. ",[21,506,507],{},"register('a.b.c.d.e')"," works; the type inference walks the schema's shape one segment at a time and narrows along the way.",[55,510,512],{"id":511},"object-level-vs-leaf-level-errors","Object-level vs. leaf-level errors",[60,514,516],{"className":62,"code":515,"language":64,"meta":65,"style":65},"const schema = z\n  .object({\n    password: z.string().min(8),\n    confirm: z.string(),\n  })\n  .refine((data) => data.password === data.confirm, {\n    message: 'Passwords must match',\n    path: ['confirm'],\n  })\nconst form = useForm({ schema })\n",[21,517,518,529,538,556,565,570,598,609,620,624],{"__ignoreMap":65},[69,519,520,522,524,526],{"class":71,"line":72},[69,521,76],{"class":75},[69,523,80],{"class":79},[69,525,83],{"class":75},[69,527,528],{"class":86}," z\n",[69,530,531,534,536],{"class":71,"line":97},[69,532,533],{"class":86},"  .",[69,535,91],{"class":90},[69,537,94],{"class":86},[69,539,540,543,545,547,549,551,554],{"class":71,"line":107},[69,541,542],{"class":86},"    password: z.",[69,544,113],{"class":90},[69,546,116],{"class":86},[69,548,119],{"class":90},[69,550,122],{"class":86},[69,552,553],{"class":79},"8",[69,555,134],{"class":86},[69,557,558,561,563],{"class":71,"line":137},[69,559,560],{"class":86},"    confirm: z.",[69,562,113],{"class":90},[69,564,150],{"class":86},[69,566,567],{"class":71,"line":153},[69,568,569],{"class":86},"  })\n",[69,571,572,574,577,580,584,586,589,592,595],{"class":71,"line":159},[69,573,533],{"class":86},[69,575,576],{"class":90},"refine",[69,578,579],{"class":86},"((",[69,581,583],{"class":582},"s4XuR","data",[69,585,283],{"class":86},[69,587,588],{"class":75},"=>",[69,590,591],{"class":86}," data.password ",[69,593,594],{"class":75},"===",[69,596,597],{"class":86}," data.confirm, {\n",[69,599,600,603,606],{"class":71,"line":169},[69,601,602],{"class":86},"    message: ",[69,604,605],{"class":130},"'Passwords must match'",[69,607,608],{"class":86},",\n",[69,610,611,614,617],{"class":71,"line":192},[69,612,613],{"class":86},"    path: [",[69,615,616],{"class":130},"'confirm'",[69,618,619],{"class":86},"],\n",[69,621,622],{"class":71,"line":202},[69,623,569],{"class":86},[69,625,626,628,630,632,634],{"class":71,"line":212},[69,627,76],{"class":75},[69,629,235],{"class":79},[69,631,83],{"class":75},[69,633,240],{"class":90},[69,635,243],{"class":86},[17,637,638,639,642,643,646,647,649,650,653,654,656,657,660],{},"A ",[21,640,641],{},".refine"," on the outer object attaches its error to whatever ",[21,644,645],{},"path"," you specify. With no ",[21,648,645],{},", the error lands on the object root, accessible at ",[21,651,652],{},"form.errors.\u003Cobject-path>"," directly. With a ",[21,655,645],{},", it lands on the named leaf, usually preferable for inline display, since the field component reads from ",[21,658,659],{},"form.errors.confirm"," either way.",[17,662,663,664,666,667,670],{},"For cross-field validations (password confirmation, address-postal-code matching, conditional-required dependencies), the ",[21,665,641],{}," + ",[21,668,669],{},"path: ['leafName']"," pattern is the canonical move.",[55,672,674],{"id":673},"per-nested-defaults","Per-nested defaults",[17,676,677,678,681],{},"Each nested object can have its own ",[21,679,680],{},".default()",":",[60,683,685],{"className":62,"code":684,"language":64,"meta":65,"style":65},"const schema = z.object({\n  ui: z\n    .object({\n      theme: z.string().default('light'),\n      density: z.string().default('comfortable'),\n    })\n    .default({ theme: 'light', density: 'comfortable' }),\n})\n\nconst form = useForm({ schema })\n\nform.values.ui.theme \u002F\u002F 'light' (inner default applied)\nform.values.ui.density \u002F\u002F 'comfortable'\n",[21,686,687,701,706,715,734,752,757,776,780,784,796,800,808],{"__ignoreMap":65},[69,688,689,691,693,695,697,699],{"class":71,"line":72},[69,690,76],{"class":75},[69,692,80],{"class":79},[69,694,83],{"class":75},[69,696,87],{"class":86},[69,698,91],{"class":90},[69,700,94],{"class":86},[69,702,703],{"class":71,"line":97},[69,704,705],{"class":86},"  ui: z\n",[69,707,708,711,713],{"class":71,"line":107},[69,709,710],{"class":86},"    .",[69,712,91],{"class":90},[69,714,94],{"class":86},[69,716,717,720,722,724,727,729,732],{"class":71,"line":137},[69,718,719],{"class":86},"      theme: z.",[69,721,113],{"class":90},[69,723,116],{"class":86},[69,725,726],{"class":90},"default",[69,728,122],{"class":86},[69,730,731],{"class":130},"'light'",[69,733,134],{"class":86},[69,735,736,739,741,743,745,747,750],{"class":71,"line":153},[69,737,738],{"class":86},"      density: z.",[69,740,113],{"class":90},[69,742,116],{"class":86},[69,744,726],{"class":90},[69,746,122],{"class":86},[69,748,749],{"class":130},"'comfortable'",[69,751,134],{"class":86},[69,753,754],{"class":71,"line":159},[69,755,756],{"class":86},"    })\n",[69,758,759,761,763,766,768,771,773],{"class":71,"line":169},[69,760,710],{"class":86},[69,762,726],{"class":90},[69,764,765],{"class":86},"({ theme: ",[69,767,731],{"class":130},[69,769,770],{"class":86},", density: ",[69,772,749],{"class":130},[69,774,775],{"class":86}," }),\n",[69,777,778],{"class":71,"line":192},[69,779,220],{"class":86},[69,781,782],{"class":71,"line":202},[69,783,227],{"emptyLinePlaceholder":226},[69,785,786,788,790,792,794],{"class":71,"line":212},[69,787,76],{"class":75},[69,789,235],{"class":79},[69,791,83],{"class":75},[69,793,240],{"class":90},[69,795,243],{"class":86},[69,797,798],{"class":71,"line":217},[69,799,227],{"emptyLinePlaceholder":226},[69,801,802,805],{"class":71,"line":223},[69,803,804],{"class":86},"form.values.ui.theme ",[69,806,807],{"class":259},"\u002F\u002F 'light' (inner default applied)\n",[69,809,810,813],{"class":71,"line":230},[69,811,812],{"class":86},"form.values.ui.density ",[69,814,815],{"class":259},"\u002F\u002F 'comfortable'\n",[17,817,818,819,822,823,825],{},"The outer ",[21,820,821],{},".default({...})"," is the fallback when the whole object is missing; the inner ",[21,824,680],{}," calls fire per-leaf if the outer default is absent. In practice, defaulting at the leaves is enough; the runtime's slim-default synthesis handles missing objects.",[55,827,829],{"id":828},"resetting-a-subtree","Resetting a subtree",[17,831,832,835],{},[21,833,834],{},"resetField"," walks the path and re-seeds the subtree from the schema:",[60,837,839],{"className":62,"code":838,"language":64,"meta":65,"style":65},"form.resetField('profile') \u002F\u002F re-seed profile.name + profile.bio from schema\nform.resetField('profile.name') \u002F\u002F re-seed just one leaf\n",[21,840,841,857],{"__ignoreMap":65},[69,842,843,845,847,849,852,854],{"class":71,"line":72},[69,844,272],{"class":86},[69,846,834],{"class":90},[69,848,122],{"class":86},[69,850,851],{"class":130},"'profile'",[69,853,283],{"class":86},[69,855,856],{"class":259},"\u002F\u002F re-seed profile.name + profile.bio from schema\n",[69,858,859,861,863,865,867,869],{"class":71,"line":97},[69,860,272],{"class":86},[69,862,834],{"class":90},[69,864,122],{"class":86},[69,866,280],{"class":130},[69,868,283],{"class":86},[69,870,871],{"class":259},"\u002F\u002F re-seed just one leaf\n",[17,873,874],{},"The cleared subtree's field state (touched, focused, etc.) reverts to the post-mount baseline; cross-subtree state (sibling paths) stays where it is.",[55,876,878],{"id":877},"subtree-scoped-operations","Subtree-scoped operations",[17,880,881],{},"Most operations accept a path argument that scopes them to a subtree:",[60,883,885],{"className":62,"code":884,"language":64,"meta":65,"style":65},"form.validate('profile') \u002F\u002F validate just profile.* leaves\nform.validateAsync('address') \u002F\u002F async-validate the address subtree\nform.persist('profile') \u002F\u002F write just the profile subtree to storage\nform.clearPersistedDraft('profile.bio') \u002F\u002F wipe one persisted leaf\nform.history.undo() \u002F\u002F global to the whole form (no subtree variant)\n",[21,886,887,903,920,936,953],{"__ignoreMap":65},[69,888,889,891,894,896,898,900],{"class":71,"line":72},[69,890,272],{"class":86},[69,892,893],{"class":90},"validate",[69,895,122],{"class":86},[69,897,851],{"class":130},[69,899,283],{"class":86},[69,901,902],{"class":259},"\u002F\u002F validate just profile.* leaves\n",[69,904,905,907,910,912,915,917],{"class":71,"line":97},[69,906,272],{"class":86},[69,908,909],{"class":90},"validateAsync",[69,911,122],{"class":86},[69,913,914],{"class":130},"'address'",[69,916,283],{"class":86},[69,918,919],{"class":259},"\u002F\u002F async-validate the address subtree\n",[69,921,922,924,927,929,931,933],{"class":71,"line":107},[69,923,272],{"class":86},[69,925,926],{"class":90},"persist",[69,928,122],{"class":86},[69,930,851],{"class":130},[69,932,283],{"class":86},[69,934,935],{"class":259},"\u002F\u002F write just the profile subtree to storage\n",[69,937,938,940,943,945,948,950],{"class":71,"line":137},[69,939,272],{"class":86},[69,941,942],{"class":90},"clearPersistedDraft",[69,944,122],{"class":86},[69,946,947],{"class":130},"'profile.bio'",[69,949,283],{"class":86},[69,951,952],{"class":259},"\u002F\u002F wipe one persisted leaf\n",[69,954,955,958,961,964],{"class":71,"line":153},[69,956,957],{"class":86},"form.history.",[69,959,960],{"class":90},"undo",[69,962,963],{"class":86},"() ",[69,965,966],{"class":259},"\u002F\u002F global to the whole form (no subtree variant)\n",[17,968,969],{},"Subtree-scoping keeps \"Save section\" \u002F \"Validate this step\" wizard patterns cheap: no full-form re-traversal when you only care about one branch.",[55,971,973],{"id":972},"when-deeply-nested-objects-feel-wrong","When deeply nested objects feel wrong",[17,975,976],{},"If a schema reaches four or five levels deep and feels unwieldy, two patterns to consider:",[978,979,980,996],"ul",{},[981,982,983,987,988,991,992,995],"li",{},[984,985,986],"strong",{},"Flatten the schema."," ",[21,989,990],{},"address.line1"," could become ",[21,993,994],{},"addressLine1"," if the grouping was structural rather than semantic. The binding code stays the same shape.",[981,997,998,1001,1002,1005,1006,1012,1013,1019],{},[984,999,1000],{},"Split into sub-forms."," Two ",[21,1003,1004],{},"useForm"," calls with separate keys, composed via ",[44,1007,1009],{"href":1008},"\u002Fdocs\u002Fcross-cutting-state\u002Finject-form",[21,1010,1011],{},"injectForm"," or ",[44,1014,1016],{"href":1015},"\u002Fdocs\u002Fmultistep\u002Fuse-wizard",[21,1017,1018],{},"useWizard",". Per-form persistence, history, and validation; one parent component coordinating.",[17,1021,1022],{},"Both are escape hatches; the proxy doesn't have a depth limit, and the type inference holds at every level. But deeply-nested schemas often signal a structural-vs.-semantic mismatch worth a second look.",[55,1024,1026],{"id":1025},"where-to-next","Where to next",[978,1028,1029,1034,1041],{},[981,1030,1031,1033],{},[44,1032,47],{"href":46},": variable-length composition; the natural counterpart to nested objects.",[981,1035,1036,1040],{},[44,1037,1039],{"href":1038},"\u002Fdocs\u002Fschemas\u002Frecords","Records & maps",": when the nested keys are dynamic, not fixed at schema-write time.",[981,1042,1043,1047],{},[44,1044,1045],{"href":1008},[21,1046,1011],{},": when nested-object sub-trees outgrow one component and want to live as sub-forms.",[1049,1050,1051],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}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 .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}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":65,"searchDepth":97,"depth":97,"links":1053},[1054,1055,1056,1057,1058,1059,1060,1061],{"id":57,"depth":97,"text":58},{"id":297,"depth":97,"text":298},{"id":511,"depth":97,"text":512},{"id":673,"depth":97,"text":674},{"id":828,"depth":97,"text":829},{"id":877,"depth":97,"text":878},{"id":972,"depth":97,"text":973},{"id":1025,"depth":97,"text":1026},"[object Object]","md",{},null,"\u002Fdocs\u002Fschemas\u002Fnested-objects",{"title":5,"description":1068},{"z":1069},{"object({ a":1070},{"z":1071},{"object({ b":1072},{"z":1073,"metaRows":1075},{"string() }) }) composes through dot-path access":1074},"register('a.b'), errors.a.b, fields.a.b. Every nested object gets its own slim default at every level.",[1076,1079,1084,1086],{"label":1077,"value":1078},"Category","Schema feature",{"label":1080,"value":1081},"Composition",{"z":1082,"kind":21},{"object({ profile":1083},"z.object({...}) })",{"label":1085,"value":35,"kind":21},"Path access",{"label":1087,"value":31,"kind":21},"Errors","docs\u002Fschemas\u002Fnested-objects","ttlpHSuzNWRvpHweOckXGS3x416ugdbHfTDExLN9z4c",1780949757939]