[{"data":1,"prerenderedAt":721},["ShallowReactive",2],{"navigation_docs_id":3,"-id-guide-nuxt-content":88,"-id-guide-nuxt-content-surround":716},[4,18,51],{"title":5,"path":6,"stem":7,"children":8,"page":17},"Getting Started","\u002Fid\u002Fgetting-started","id\u002F1.getting-started",[9,13],{"title":10,"path":11,"stem":12},"Pengenalan","\u002Fid\u002Fgetting-started\u002Fintroduction","id\u002F1.getting-started\u002F1.introduction",{"title":14,"path":15,"stem":16},"Instalasi & Konfigurasi","\u002Fid\u002Fgetting-started\u002Finstallation","id\u002F1.getting-started\u002F2.installation",false,{"title":19,"path":20,"stem":21,"children":22,"page":17},"Guide","\u002Fid\u002Fguide","id\u002F2.guide",[23,27,31,35,39,43,47],{"title":24,"path":25,"stem":26},"Contextual Editing","\u002Fid\u002Fguide\u002Fcontextual-editing","id\u002F2.guide\u002F1.contextual-editing",{"title":28,"path":29,"stem":30},"Preview Mode","\u002Fid\u002Fguide\u002Fpreview-mode","id\u002F2.guide\u002F2.preview-mode",{"title":32,"path":33,"stem":34},"Tina Cloud & Mode Editing","\u002Fid\u002Fguide\u002Ftina-cloud","id\u002F2.guide\u002F3.tina-cloud",{"title":36,"path":37,"stem":38},"Kompatibilitas Nuxt Content","\u002Fid\u002Fguide\u002Fnuxt-content","id\u002F2.guide\u002F4.nuxt-content",{"title":40,"path":41,"stem":42},"Media","\u002Fid\u002Fguide\u002Fmedia","id\u002F2.guide\u002F5.media",{"title":44,"path":45,"stem":46},"Rich-Text Lanjutan","\u002Fid\u002Fguide\u002Frich-text-advanced","id\u002F2.guide\u002F6.rich-text-advanced",{"title":48,"path":49,"stem":50},"Deployment","\u002Fid\u002Fguide\u002Fdeployment","id\u002F2.guide\u002F7.deployment",{"title":52,"path":53,"stem":54,"children":55,"page":17},"Api","\u002Fid\u002Fapi","id\u002F3.api",[56,60,64,68,72,76,80,84],{"title":57,"path":58,"stem":59},"useTina()","\u002Fid\u002Fapi\u002Fuse-tina","id\u002F3.api\u002F1.use-tina",{"title":61,"path":62,"stem":63},"useTinaBridge()","\u002Fid\u002Fapi\u002Fuse-tina-bridge","id\u002F3.api\u002F2.use-tina-bridge",{"title":65,"path":66,"stem":67},"useTinaPreview()","\u002Fid\u002Fapi\u002Fuse-tina-preview","id\u002F3.api\u002F3.use-tina-preview",{"title":69,"path":70,"stem":71},"\u003CTinaProvider>","\u002Fid\u002Fapi\u002Ftina-provider","id\u002F3.api\u002F4.tina-provider",{"title":73,"path":74,"stem":75},"\u003CTinaMarkdown>","\u002Fid\u002Fapi\u002Ftina-markdown","id\u002F3.api\u002F5.tina-markdown",{"title":77,"path":78,"stem":79},"\u003CTinaMermaid>","\u002Fid\u002Fapi\u002Ftina-mermaid","id\u002F3.api\u002F6.tina-mermaid",{"title":81,"path":82,"stem":83},"Konfigurasi Module","\u002Fid\u002Fapi\u002Fconfiguration","id\u002F3.api\u002F7.configuration",{"title":85,"path":86,"stem":87},"Tipe Field","\u002Fid\u002Fapi\u002Ffield-types","id\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_id\u002Fid\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",{},"Kamu nggak butuh Nuxt Content sama sekali."," ",[102,103,104],"code",{},"useTina",", ",[102,107,108],{},"TinaMarkdown",[102,110,111],{},"TinaProvider",", dan bridge visual editing semuanya baca langsung dari GraphQL client Tina sendiri, nggak ada dependency ke ",[102,114,115],{},"@nuxt\u002Fcontent"," sama sekali. Nggak diinstall sama module ini, dan nggak ada yang rusak tanpa itu.",[94,118,119,120,124,125,128,129,131],{},"Semua yang di bawah ini buat orang yang ",[121,122,123],"em",{},"juga"," mau query konten yang sama lewat Nuxt Content (search, listing, ",[102,126,127],{},"queryCollection()",") bersamaan sama editing Tina. ",[102,130,115],{}," bukan dependency module ini; install sendiri:",[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},"dua-sistem-ini-nggak-ngobrol-otomatis","Dua sistem ini nggak ngobrol otomatis",[94,163,164,165,168],{},"Field-nya tetap ditulis sekali di ",[102,166,167],{},"tina\u002Fconfig.ts",", terus kamu arahkan dua config-nya ke file yang sama secara manual:",[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],{},"Path folder",": ",[102,180,181],{},"path"," collection Tina (misal ",[102,184,185],{},"content\u002Fpages",") relatif ke root project dan udah termasuk ",[102,188,189],{},"content\u002F",". Glob ",[102,192,193],{},"source"," Nuxt Content (misal ",[102,196,197],{},"pages\u002F*.md",") relatif ke content directory-nya sendiri (",[102,200,189],{}," secara default) dan ",[97,203,204],{},"nggak"," ngulang prefix itu. Salah di sini, dua sistemnya diam-diam nunjuk ke file yang beda.",[173,207,208,211],{},[97,209,210],{},"Schema",": daripada nulis bentuk frontmatter dua kali (sekali sebagai field Tina, sekali lagi sebagai schema Zod), turunkan schema Nuxt Content dari field Tina yang udah kamu tulis.",[158,213,215],{"id":214},"tinafieldstozodshape",[102,216,217],{},"tinaFieldsToZodShape()",[94,219,220,221,224,225,227],{},"Diekspor dari ",[102,222,223],{},"nuxt-tina\u002Futils",". Ini helper satu arah, jalan di build-time: field Tina → shape Zod: bukan sync runtime. Nggak ada helper buat arah sebaliknya, jadi ",[102,226,167],{}," tetap satu-satunya tempat definisi field-nya berada.",[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"," sebaiknya nggak punya definisi field manual sama sekali: cuma panggilan derive ini per collection.",[158,542,544],{"id":543},"cara-kerja-mapping-nya","Cara kerja mapping-nya",[170,546,547,554,601,611],{},[173,548,549,550,553],{},"Field yang ditandai ",[102,551,552],{},"isBody: true"," di-skip: Nuxt Content sendiri yang parse body markdown-nya, itu bukan field frontmatter.",[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],{},"Mapping tipe: ",[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],{}," (dengan ",[102,587,588],{},"fields"," nested) → ",[102,591,592],{},"z.object()"," secara rekursif, ",[102,595,596],{},"rich-text",[102,598,599],{},"z.any()"," (Tina simpan rich-text sebagai AST, bukan string).",[173,602,603,604,607,608,344],{},"Field dengan ",[102,605,606],{},"list: true"," dibungkus ",[102,609,610],{},"z.array()",[173,612,613,614,617,618,621],{},"Semua field jadi ",[102,615,616],{},".optional()"," di sisi Zod: validasi \"wajib diisi\" tetap ditangani sama form editor Tina; Nuxt Content di sini cuma butuh tau ",[121,619,620],{},"bentuk"," datanya buat query.",[94,623,624],{},"Kalau satu field butuh validasi Zod yang lebih strict daripada tipe hasil derive-nya (misal format email), override aja setelah spread-nya, nggak usah nulis ulang seluruh schema-nya manual:",[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},"kapan-ini-nggak-cocok-dipakai","Kapan ini nggak cocok dipakai",[94,698,699],{},"Mapping-nya cuma satu arah dan cuma nutupin kasus umum. Kalau collection kamu butuh validasi Zod yang lebih spesifik (regex, enum, custom refinement) secara keseluruhan, tulis schema-nya manual seperti biasa: helper ini opsional, nggak wajib.",[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 jalan standalone: ini soal bridge opsional dan manual ke @nuxt\u002Fcontent.","md",null,{},{"title":36,"description":710},"m_nJhMtjUSX6tcPrKFJCUZLQqS-5n_beHMtivjyau1Q",[717,719],{"title":32,"path":33,"stem":34,"description":718,"children":-1},"Setup auth Tina Cloud, dan dua mode editing: CMS dasar vs visual\u002Fcontextual.",{"title":40,"path":41,"stem":42,"description":720,"children":-1},"Media store bawaan berbasis git, dan backend media handler buat external storage.",1789757554448]