[{"data":1,"prerenderedAt":721},["ShallowReactive",2],{"navigation_docs_en":3,"-en-guide-nuxt-content":88,"-en-guide-nuxt-content-surround":716},[4,18,51],{"title":5,"path":6,"stem":7,"children":8,"page":17},"Getting Started","\u002Fen\u002Fgetting-started","en\u002F1.getting-started",[9,13],{"title":10,"path":11,"stem":12},"Introduction","\u002Fen\u002Fgetting-started\u002Fintroduction","en\u002F1.getting-started\u002F1.introduction",{"title":14,"path":15,"stem":16},"Installation & Setup","\u002Fen\u002Fgetting-started\u002Finstallation","en\u002F1.getting-started\u002F2.installation",false,{"title":19,"path":20,"stem":21,"children":22,"page":17},"Guide","\u002Fen\u002Fguide","en\u002F2.guide",[23,27,31,35,39,43,47],{"title":24,"path":25,"stem":26},"Contextual Editing","\u002Fen\u002Fguide\u002Fcontextual-editing","en\u002F2.guide\u002F1.contextual-editing",{"title":28,"path":29,"stem":30},"Preview Mode","\u002Fen\u002Fguide\u002Fpreview-mode","en\u002F2.guide\u002F2.preview-mode",{"title":32,"path":33,"stem":34},"Tina Cloud & Editing Modes","\u002Fen\u002Fguide\u002Ftina-cloud","en\u002F2.guide\u002F3.tina-cloud",{"title":36,"path":37,"stem":38},"Nuxt Content Compatibility","\u002Fen\u002Fguide\u002Fnuxt-content","en\u002F2.guide\u002F4.nuxt-content",{"title":40,"path":41,"stem":42},"Media","\u002Fen\u002Fguide\u002Fmedia","en\u002F2.guide\u002F5.media",{"title":44,"path":45,"stem":46},"Advanced Rich-Text","\u002Fen\u002Fguide\u002Frich-text-advanced","en\u002F2.guide\u002F6.rich-text-advanced",{"title":48,"path":49,"stem":50},"Deployment","\u002Fen\u002Fguide\u002Fdeployment","en\u002F2.guide\u002F7.deployment",{"title":52,"path":53,"stem":54,"children":55,"page":17},"Api","\u002Fen\u002Fapi","en\u002F3.api",[56,60,64,68,72,76,80,84],{"title":57,"path":58,"stem":59},"useTina()","\u002Fen\u002Fapi\u002Fuse-tina","en\u002F3.api\u002F1.use-tina",{"title":61,"path":62,"stem":63},"useTinaBridge()","\u002Fen\u002Fapi\u002Fuse-tina-bridge","en\u002F3.api\u002F2.use-tina-bridge",{"title":65,"path":66,"stem":67},"useTinaPreview()","\u002Fen\u002Fapi\u002Fuse-tina-preview","en\u002F3.api\u002F3.use-tina-preview",{"title":69,"path":70,"stem":71},"\u003CTinaProvider>","\u002Fen\u002Fapi\u002Ftina-provider","en\u002F3.api\u002F4.tina-provider",{"title":73,"path":74,"stem":75},"\u003CTinaMarkdown>","\u002Fen\u002Fapi\u002Ftina-markdown","en\u002F3.api\u002F5.tina-markdown",{"title":77,"path":78,"stem":79},"\u003CTinaMermaid>","\u002Fen\u002Fapi\u002Ftina-mermaid","en\u002F3.api\u002F6.tina-mermaid",{"title":81,"path":82,"stem":83},"Module Configuration","\u002Fen\u002Fapi\u002Fconfiguration","en\u002F3.api\u002F7.configuration",{"title":85,"path":86,"stem":87},"Field Types","\u002Fen\u002Fapi\u002Ffield-types","en\u002F3.api\u002F8.field-types",{"id":89,"title":36,"body":90,"description":710,"extension":711,"links":712,"meta":713,"navigation":324,"path":37,"seo":714,"stem":38,"__hash__":715},"docs_en\u002Fen\u002F2.guide\u002F4.nuxt-content.md",{"type":91,"value":92,"toc":704},"minimark",[93,117,132,157,162,169,212,218,228,535,541,545,622,625,693,697,700],[94,95,96,100,101,105,106,105,109,112,113,116],"p",{},[97,98,99],"strong",{},"You don't need Nuxt Content at all."," ",[102,103,104],"code",{},"useTina",", ",[102,107,108],{},"TinaMarkdown",[102,110,111],{},"TinaProvider",", and the visual editing bridge all read directly from Tina's own generated GraphQL client and have zero dependency on ",[102,114,115],{},"@nuxt\u002Fcontent",". It isn't installed by this module, and nothing breaks without it.",[94,118,119,120,124,125,128,129,131],{},"Everything below is for people who ",[121,122,123],"em",{},"also"," want to query the same content through Nuxt Content (search, listings, ",[102,126,127],{},"queryCollection()",") alongside Tina's editing. ",[102,130,115],{}," is not a dependency of this module; install it yourself:",[133,134,139],"pre",{"className":135,"code":136,"language":137,"meta":138,"style":138},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npm install @nuxt\u002Fcontent\n","bash","",[102,140,141],{"__ignoreMap":138},[142,143,146,150,154],"span",{"class":144,"line":145},"line",1,[142,147,149],{"class":148},"sBMFI","npm",[142,151,153],{"class":152},"sfazB"," install",[142,155,156],{"class":152}," @nuxt\u002Fcontent\n",[158,159,161],"h2",{"id":160},"the-two-systems-dont-talk-to-each-other-automatically","The two systems don't talk to each other automatically",[94,163,164,165,168],{},"You keep writing fields once, in ",[102,166,167],{},"tina\u002Fconfig.ts",", and point both configs at the same files by hand:",[170,171,172,206],"ul",{},[173,174,175,178,179,182,183,186,187,190,191,194,195,198,199,201,202,205],"li",{},[97,176,177],{},"Folder path",": Tina's collection ",[102,180,181],{},"path"," (e.g. ",[102,184,185],{},"content\u002Fpages",") is relative to the project root and includes ",[102,188,189],{},"content\u002F",". Nuxt Content's ",[102,192,193],{},"source"," glob (e.g. ",[102,196,197],{},"pages\u002F*.md",") is relative to its own content directory (",[102,200,189],{}," by default) and does ",[97,203,204],{},"not"," repeat that prefix. Get this wrong and the two systems silently point at different files.",[173,207,208,211],{},[97,209,210],{},"Schema",": instead of hand-writing the frontmatter shape twice (once as Tina fields, once as a Zod schema), derive Nuxt Content's schema from the Tina fields you already wrote.",[158,213,215],{"id":214},"tinafieldstozodshape",[102,216,217],{},"tinaFieldsToZodShape()",[94,219,220,221,224,225,227],{},"Exported from ",[102,222,223],{},"nuxt-tina\u002Futils",". It's a one-way, build-time helper: Tina fields → Zod shape: not a runtime sync. There's no helper for the reverse direction, so ",[102,226,167],{}," stays the one place field definitions belong.",[133,229,233],{"className":230,"code":231,"language":232,"meta":138,"style":138},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F content.config.ts\nimport { defineCollection, defineContentConfig, z } from '@nuxt\u002Fcontent'\nimport { tinaFieldsToZodShape } from 'nuxt-tina\u002Futils'\nimport tinaConfig from '.\u002Ftina\u002Fconfig'\n\nconst postFields = tinaConfig.schema.collections.find(c => c.name === 'post')!.fields\n\nexport default defineContentConfig({\n  collections: {\n    posts: defineCollection({\n      type: 'page',\n      source: 'posts\u002F*.md',\n      schema: z.object(tinaFieldsToZodShape(postFields, z)),\n    }),\n  },\n})\n","ts",[102,234,235,241,281,301,319,326,397,402,418,431,445,463,480,510,520,526],{"__ignoreMap":138},[142,236,237],{"class":144,"line":145},[142,238,240],{"class":239},"sHwdD","\u002F\u002F content.config.ts\n",[142,242,244,248,252,256,259,262,264,267,270,273,276,278],{"class":144,"line":243},2,[142,245,247],{"class":246},"s7zQu","import",[142,249,251],{"class":250},"sMK4o"," {",[142,253,255],{"class":254},"sTEyZ"," defineCollection",[142,257,258],{"class":250},",",[142,260,261],{"class":254}," defineContentConfig",[142,263,258],{"class":250},[142,265,266],{"class":254}," z",[142,268,269],{"class":250}," }",[142,271,272],{"class":246}," from",[142,274,275],{"class":250}," '",[142,277,115],{"class":152},[142,279,280],{"class":250},"'\n",[142,282,284,286,288,291,293,295,297,299],{"class":144,"line":283},3,[142,285,247],{"class":246},[142,287,251],{"class":250},[142,289,290],{"class":254}," tinaFieldsToZodShape",[142,292,269],{"class":250},[142,294,272],{"class":246},[142,296,275],{"class":250},[142,298,223],{"class":152},[142,300,280],{"class":250},[142,302,304,306,309,312,314,317],{"class":144,"line":303},4,[142,305,247],{"class":246},[142,307,308],{"class":254}," tinaConfig ",[142,310,311],{"class":246},"from",[142,313,275],{"class":250},[142,315,316],{"class":152},".\u002Ftina\u002Fconfig",[142,318,280],{"class":250},[142,320,322],{"class":144,"line":321},5,[142,323,325],{"emptyLinePlaceholder":324},true,"\n",[142,327,329,333,336,339,342,345,348,350,353,355,359,362,366,369,372,374,377,380,382,385,388,391,394],{"class":144,"line":328},6,[142,330,332],{"class":331},"spNyl","const",[142,334,335],{"class":254}," postFields ",[142,337,338],{"class":250},"=",[142,340,341],{"class":254}," tinaConfig",[142,343,344],{"class":250},".",[142,346,347],{"class":254},"schema",[142,349,344],{"class":250},[142,351,352],{"class":254},"collections",[142,354,344],{"class":250},[142,356,358],{"class":357},"s2Zo4","find",[142,360,361],{"class":254},"(",[142,363,365],{"class":364},"sHdIc","c",[142,367,368],{"class":331}," =>",[142,370,371],{"class":254}," c",[142,373,344],{"class":250},[142,375,376],{"class":254},"name ",[142,378,379],{"class":250},"===",[142,381,275],{"class":250},[142,383,384],{"class":152},"post",[142,386,387],{"class":250},"'",[142,389,390],{"class":254},")",[142,392,393],{"class":250},"!.",[142,395,396],{"class":254},"fields\n",[142,398,400],{"class":144,"line":399},7,[142,401,325],{"emptyLinePlaceholder":324},[142,403,405,408,411,413,415],{"class":144,"line":404},8,[142,406,407],{"class":246},"export",[142,409,410],{"class":246}," default",[142,412,261],{"class":357},[142,414,361],{"class":254},[142,416,417],{"class":250},"{\n",[142,419,421,425,428],{"class":144,"line":420},9,[142,422,424],{"class":423},"swJcz","  collections",[142,426,427],{"class":250},":",[142,429,430],{"class":250}," {\n",[142,432,434,437,439,441,443],{"class":144,"line":433},10,[142,435,436],{"class":423},"    posts",[142,438,427],{"class":250},[142,440,255],{"class":357},[142,442,361],{"class":254},[142,444,417],{"class":250},[142,446,448,451,453,455,458,460],{"class":144,"line":447},11,[142,449,450],{"class":423},"      type",[142,452,427],{"class":250},[142,454,275],{"class":250},[142,456,457],{"class":152},"page",[142,459,387],{"class":250},[142,461,462],{"class":250},",\n",[142,464,466,469,471,473,476,478],{"class":144,"line":465},12,[142,467,468],{"class":423},"      source",[142,470,427],{"class":250},[142,472,275],{"class":250},[142,474,475],{"class":152},"posts\u002F*.md",[142,477,387],{"class":250},[142,479,462],{"class":250},[142,481,483,486,488,490,492,495,497,500,503,505,508],{"class":144,"line":482},13,[142,484,485],{"class":423},"      schema",[142,487,427],{"class":250},[142,489,266],{"class":254},[142,491,344],{"class":250},[142,493,494],{"class":357},"object",[142,496,361],{"class":254},[142,498,499],{"class":357},"tinaFieldsToZodShape",[142,501,502],{"class":254},"(postFields",[142,504,258],{"class":250},[142,506,507],{"class":254}," z))",[142,509,462],{"class":250},[142,511,513,516,518],{"class":144,"line":512},14,[142,514,515],{"class":250},"    }",[142,517,390],{"class":254},[142,519,462],{"class":250},[142,521,523],{"class":144,"line":522},15,[142,524,525],{"class":250},"  },\n",[142,527,529,532],{"class":144,"line":528},16,[142,530,531],{"class":250},"}",[142,533,534],{"class":254},")\n",[94,536,537,540],{},[102,538,539],{},"content.config.ts"," should contain no manually written field definitions: just this derive call per collection.",[158,542,544],{"id":543},"how-the-mapping-works","How the mapping works",[170,546,547,554,601,611],{},[173,548,549,550,553],{},"Fields marked ",[102,551,552],{},"isBody: true"," are skipped: Nuxt Content parses the markdown body itself, it isn't a frontmatter field.",[173,555,556,557,560,561,560,564,567,568,105,571,567,574,105,577,567,580,105,583,585,586,589,590,593,594,567,597,600],{},"Type mapping: ",[102,558,559],{},"string","\u002F",[102,562,563],{},"datetime",[102,565,566],{},"image"," → ",[102,569,570],{},"z.string()",[102,572,573],{},"number",[102,575,576],{},"z.number()",[102,578,579],{},"boolean",[102,581,582],{},"z.boolean()",[102,584,494],{}," (with nested ",[102,587,588],{},"fields",") → ",[102,591,592],{},"z.object()"," recursively, ",[102,595,596],{},"rich-text",[102,598,599],{},"z.any()"," (Tina stores rich-text as an AST, not a string).",[173,602,603,604,607,608,344],{},"Fields with ",[102,605,606],{},"list: true"," are wrapped in ",[102,609,610],{},"z.array()",[173,612,613,614,617,618,621],{},"Every field ends up ",[102,615,616],{},".optional()"," on the Zod side: \"required\" validation is still handled by Tina's editor form; Nuxt Content here only needs to know the data's ",[121,619,620],{},"shape"," for querying.",[94,623,624],{},"If one field needs stricter Zod validation than the derived type (an email format, say), override it after the spread instead of writing the whole schema by hand:",[133,626,628],{"className":230,"code":627,"language":232,"meta":138,"style":138},"schema: z.object({\n  ...tinaFieldsToZodShape(postFields, z),\n  email: z.string().email(),\n})\n",[102,629,630,646,662,687],{"__ignoreMap":138},[142,631,632,634,636,638,640,642,644],{"class":144,"line":145},[142,633,347],{"class":148},[142,635,427],{"class":250},[142,637,266],{"class":254},[142,639,344],{"class":250},[142,641,494],{"class":357},[142,643,361],{"class":254},[142,645,417],{"class":250},[142,647,648,651,653,655,657,660],{"class":144,"line":243},[142,649,650],{"class":250},"  ...",[142,652,499],{"class":357},[142,654,502],{"class":254},[142,656,258],{"class":250},[142,658,659],{"class":254}," z)",[142,661,462],{"class":250},[142,663,664,667,669,671,673,675,678,680,683,685],{"class":144,"line":283},[142,665,666],{"class":423},"  email",[142,668,427],{"class":250},[142,670,266],{"class":254},[142,672,344],{"class":250},[142,674,559],{"class":357},[142,676,677],{"class":254},"()",[142,679,344],{"class":250},[142,681,682],{"class":357},"email",[142,684,677],{"class":254},[142,686,462],{"class":250},[142,688,689,691],{"class":144,"line":303},[142,690,531],{"class":250},[142,692,534],{"class":254},[158,694,696],{"id":695},"when-this-doesnt-fit","When this doesn't fit",[94,698,699],{},"The mapping is one-way and only covers the common cases. If a collection needs more specific Zod validation (regex, enums, custom refinements) across the board, write that schema by hand as usual: this helper is optional, not required.",[701,702,703],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":138,"searchDepth":243,"depth":243,"links":705},[706,707,708,709],{"id":160,"depth":243,"text":161},{"id":214,"depth":243,"text":217},{"id":543,"depth":243,"text":544},{"id":695,"depth":243,"text":696},"nuxt-tina works standalone: this covers the optional, manual bridge to @nuxt\u002Fcontent.","md",null,{},{"title":36,"description":710},"ie4CEl3wSO3MF3QmUJ17X4MtcHo6GkF7RFS-lpN4iTA",[717,719],{"title":32,"path":33,"stem":34,"description":718,"children":-1},"Setting up Tina Cloud auth, and two editing modes: basic CMS vs visual\u002Fcontextual.",{"title":40,"path":41,"stem":42,"description":720,"children":-1},"The built-in git-based media store, and backend media handlers for external storage.",1789757557597]