[{"data":1,"prerenderedAt":1072},["ShallowReactive",2],{"content-\u002Fdocs\u002Fschemas\u002Fnested-objects":3},{"id":4,"title":5,"body":6,"description":1044,"extension":1045,"meta":1046,"metaRows":1047,"navigation":226,"path":1048,"seo":1049,"source":1047,"stem":1070,"__hash__":1071},"docs\u002Fdocs\u002Fschemas\u002Fnested-objects.md","Nested objects",{"type":7,"value":8,"toc":1034},"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,949,952,956,959,1002,1005,1009,1030],[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.resetField('profile') \u002F\u002F re-seed just the profile subtree\nform.history.undo() \u002F\u002F global to the whole form (no subtree variant)\n",[21,886,887,903,920,935],{"__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,926,928,930,932],{"class":71,"line":107},[69,923,272],{"class":86},[69,925,834],{"class":90},[69,927,122],{"class":86},[69,929,851],{"class":130},[69,931,283],{"class":86},[69,933,934],{"class":259},"\u002F\u002F re-seed just the profile subtree\n",[69,936,937,940,943,946],{"class":71,"line":137},[69,938,939],{"class":86},"form.history.",[69,941,942],{"class":90},"undo",[69,944,945],{"class":86},"() ",[69,947,948],{"class":259},"\u002F\u002F global to the whole form (no subtree variant)\n",[17,950,951],{},"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,953,955],{"id":954},"when-deeply-nested-objects-feel-wrong","When deeply nested objects feel wrong",[17,957,958],{},"If a schema reaches four or five levels deep and feels unwieldy, two patterns to consider:",[960,961,962,978],"ul",{},[963,964,965,969,970,973,974,977],"li",{},[966,967,968],"strong",{},"Flatten the schema."," ",[21,971,972],{},"address.line1"," could become ",[21,975,976],{},"addressLine1"," if the grouping was structural rather than semantic. The binding code stays the same shape.",[963,979,980,983,984,987,988,994,995,1001],{},[966,981,982],{},"Split into sub-forms."," Two ",[21,985,986],{},"useForm"," calls with separate keys, composed via ",[44,989,991],{"href":990},"\u002Fdocs\u002Fcross-cutting-state\u002Finject-form",[21,992,993],{},"injectForm"," or ",[44,996,998],{"href":997},"\u002Fdocs\u002Fmultistep\u002Fuse-wizard",[21,999,1000],{},"useWizard",". Per-form history and validation; one parent component coordinating.",[17,1003,1004],{},"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,1006,1008],{"id":1007},"where-to-next","Where to next",[960,1010,1011,1016,1023],{},[963,1012,1013,1015],{},[44,1014,47],{"href":46},": variable-length composition; the natural counterpart to nested objects.",[963,1017,1018,1022],{},[44,1019,1021],{"href":1020},"\u002Fdocs\u002Fschemas\u002Frecords","Records & maps",": when the nested keys are dynamic, not fixed at schema-write time.",[963,1024,1025,1029],{},[44,1026,1027],{"href":990},[21,1028,993],{},": when nested-object sub-trees outgrow one component and want to live as sub-forms.",[1031,1032,1033],"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":1035},[1036,1037,1038,1039,1040,1041,1042,1043],{"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":954,"depth":97,"text":955},{"id":1007,"depth":97,"text":1008},"[object Object]","md",{},null,"\u002Fdocs\u002Fschemas\u002Fnested-objects",{"title":5,"description":1050},{"z":1051},{"object({ a":1052},{"z":1053},{"object({ b":1054},{"z":1055,"metaRows":1057},{"string() }) }) composes through dot-path access":1056},"register('a.b'), errors.a.b, fields.a.b. Every nested object gets its own slim default at every level.",[1058,1061,1066,1068],{"label":1059,"value":1060},"Category","Schema feature",{"label":1062,"value":1063},"Composition",{"z":1064,"kind":21},{"object({ profile":1065},"z.object({...}) })",{"label":1067,"value":35,"kind":21},"Path access",{"label":1069,"value":31,"kind":21},"Errors","docs\u002Fschemas\u002Fnested-objects","lFgsuKiY9l-reAUtFO5BUnAICWKnS2b09keEZfzjjC0",1781745871298]