[{"data":1,"prerenderedAt":1896},["ShallowReactive",2],{"navigation":3,"\u002Fdocumentation\u002Fbackend-integration":90,"\u002Fdocumentation\u002Fbackend-integration-surround":1891},[4,73],{"title":5,"path":6,"stem":7,"children":8,"icon":72},"Documentation","\u002Fdocumentation","1.documentation\u002F01.index",[9,12,17,22,27,32,37,42,47,52,57,62,67],{"title":10,"path":6,"stem":7,"icon":11},"Welcome","i-lucide-info",{"title":13,"path":14,"stem":15,"icon":16},"Requirements","\u002Fdocumentation\u002Frequirements","1.documentation\u002F02.requirements","i-lucide-alert-triangle",{"title":18,"path":19,"stem":20,"icon":21},"Getting Started","\u002Fdocumentation\u002Fgetting-started","1.documentation\u002F03.getting-started","i-lucide-package",{"title":23,"path":24,"stem":25,"icon":26},"Folder Structure","\u002Fdocumentation\u002Ffolder-structure","1.documentation\u002F04.folder-structure","i-lucide-folder-tree",{"title":28,"path":29,"stem":30,"icon":31},"Customization","\u002Fdocumentation\u002Fcustomization","1.documentation\u002F05.customization","i-lucide-palette",{"title":33,"path":34,"stem":35,"icon":36},"Deployment","\u002Fdocumentation\u002Fdeployment","1.documentation\u002F06.deployment","i-lucide-cloud-upload",{"title":38,"path":39,"stem":40,"icon":41},"API Usage","\u002Fdocumentation\u002Fapi-usage","1.documentation\u002F07.api-usage","i-lucide-plug",{"title":43,"path":44,"stem":45,"icon":46},"Backend Integration","\u002Fdocumentation\u002Fbackend-integration","1.documentation\u002F08.backend-integration","i-lucide-server",{"title":48,"path":49,"stem":50,"icon":51},"Install PWA","\u002Fdocumentation\u002Finstall-pwa","1.documentation\u002F09.install-pwa","i-lucide-smartphone",{"title":53,"path":54,"stem":55,"icon":56},"Configuration","\u002Fdocumentation\u002Fconfiguration","1.documentation\u002F10.configuration","i-lucide-settings",{"title":58,"path":59,"stem":60,"icon":61},"Screens Overview","\u002Fdocumentation\u002Fscreens-overview","1.documentation\u002F11.screens-overview","i-lucide-layout-dashboard",{"title":63,"path":64,"stem":65,"icon":66},"FAQ & Troubleshooting","\u002Fdocumentation\u002Ffaq","1.documentation\u002F12.faq","i-lucide-circle-help",{"title":68,"path":69,"stem":70,"icon":71},"Authentication","\u002Fdocumentation\u002Fauthentication","1.documentation\u002F13.authentication","i-lucide-lock",false,{"title":74,"path":75,"stem":76,"children":77,"icon":72},"Support","\u002Fsupport","2.support\u002F1.index",[78,80,85],{"title":74,"path":75,"stem":76,"icon":79},"i-lucide-life-buoy",{"title":81,"path":82,"stem":83,"icon":84},"Changelog","\u002Fsupport\u002Fchangelog","2.support\u002F2.changelog","i-lucide-scroll-text",{"title":86,"path":87,"stem":88,"icon":89},"Source & Credits","\u002Fsupport\u002Fsource-and-credits","2.support\u002F3.source-&-credits","i-lucide-award",{"id":91,"title":43,"body":92,"description":1884,"extension":1885,"links":1886,"meta":1887,"navigation":1888,"path":44,"seo":1889,"stem":45,"__hash__":1890},"docs\u002F1.documentation\u002F08.backend-integration.md",{"type":93,"value":94,"toc":1878},"minimark",[95,104,110,115,146,150,1786,1790,1836,1840,1859,1874],[96,97,98,99,103],"p",{},"By default Rosavo uses static JSON mock files for data. This page explains how to replace them with a real backend using ",[100,101,102],"strong",{},"PayloadCMS"," — a modern, headless CMS built with TypeScript and Node.js.",[96,105,106],{},[107,108],"img",{"alt":102,"src":109},"\u002Fimages\u002F05.png",[111,112,114],"h2",{"id":113},"why-payloadcms","Why PayloadCMS?",[116,117,118,126,133,139],"card-group",{},[119,120,123],"card",{"icon":121,"title":122},"i-lucide-zap","TypeScript-first",[96,124,125],{},"Fully typed, schema-driven — no runtime surprises.",[119,127,130],{"icon":128,"title":129},"i-lucide-database","REST & GraphQL out of the box",[96,131,132],{},"Instant API endpoints for every collection you define.",[119,134,136],{"icon":61,"title":135},"Built-in Admin Panel",[96,137,138],{},"Manage products, categories, and orders without writing extra UI.",[119,140,143],{"icon":141,"title":142},"i-lucide-globe","Self-hosted",[96,144,145],{},"Deploy on your own server or cloud — no vendor lock-in.",[111,147,149],{"id":148},"setup-payloadcms","Setup PayloadCMS",[151,152,153,158,161,184,199,203,210,228,235,318,325,329,335,1024,1030,1111,1115,1121,1325,1328,1364,1398,1404,1408,1411,1436,1439,1541,1560,1564],"steps",{},[154,155,157],"h3",{"id":156},"install-payloadcms","Install PayloadCMS",[96,159,160],{},"Scaffold a new Payload project (runs alongside or separately from the Nuxt frontend):",[162,163,168],"pre",{"className":164,"code":165,"language":166,"meta":167,"style":167},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx create-payload-app@latest\n","bash","",[169,170,171],"code",{"__ignoreMap":167},[172,173,176,180],"span",{"class":174,"line":175},"line",1,[172,177,179],{"class":178},"sBMFI","npx",[172,181,183],{"class":182},"sfazB"," create-payload-app@latest\n",[96,185,186,187,190,191,194,195,198],{},"Choose ",[100,188,189],{},"Blank"," template, select ",[100,192,193],{},"MongoDB"," or ",[100,196,197],{},"PostgreSQL"," as your database, and follow the prompts.",[154,200,202],{"id":201},"set-the-api-url","Set the API URL",[96,204,205,206,209],{},"Add the Payload base URL to your ",[169,207,208],{},".env"," file at the project root:",[162,211,213],{"className":164,"code":212,"filename":208,"language":166,"meta":167,"style":167},"NUXT_PUBLIC_API_BASE=http:\u002F\u002Flocalhost:3001\n",[169,214,215],{"__ignoreMap":167},[172,216,217,221,225],{"class":174,"line":175},[172,218,220],{"class":219},"sTEyZ","NUXT_PUBLIC_API_BASE",[172,222,224],{"class":223},"sMK4o","=",[172,226,227],{"class":182},"http:\u002F\u002Flocalhost:3001\n",[96,229,230,231,234],{},"Then expose it in ",[169,232,233],{},"nuxt.config.ts",":",[162,236,240],{"className":237,"code":238,"filename":233,"language":239,"meta":167,"style":167},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  runtimeConfig: {\n    public: {\n      apiBase: '',\n    },\n  },\n})\n","ts",[169,241,242,261,273,283,297,303,309],{"__ignoreMap":167},[172,243,244,248,251,255,258],{"class":174,"line":175},[172,245,247],{"class":246},"s7zQu","export",[172,249,250],{"class":246}," default",[172,252,254],{"class":253},"s2Zo4"," defineNuxtConfig",[172,256,257],{"class":219},"(",[172,259,260],{"class":223},"{\n",[172,262,264,268,270],{"class":174,"line":263},2,[172,265,267],{"class":266},"swJcz","  runtimeConfig",[172,269,234],{"class":223},[172,271,272],{"class":223}," {\n",[172,274,276,279,281],{"class":174,"line":275},3,[172,277,278],{"class":266},"    public",[172,280,234],{"class":223},[172,282,272],{"class":223},[172,284,286,289,291,294],{"class":174,"line":285},4,[172,287,288],{"class":266},"      apiBase",[172,290,234],{"class":223},[172,292,293],{"class":223}," ''",[172,295,296],{"class":223},",\n",[172,298,300],{"class":174,"line":299},5,[172,301,302],{"class":223},"    },\n",[172,304,306],{"class":174,"line":305},6,[172,307,308],{"class":223},"  },\n",[172,310,312,315],{"class":174,"line":311},7,[172,313,314],{"class":223},"}",[172,316,317],{"class":219},")\n",[96,319,320,321,324],{},"For production, replace ",[169,322,323],{},"http:\u002F\u002Flocalhost:3001"," with your deployed Payload instance URL.",[154,326,328],{"id":327},"define-collections","Define Collections",[96,330,331,332,234],{},"Create collections that match Rosavo's data model. Example — ",[100,333,334],{},"Products",[162,336,339],{"className":237,"code":337,"filename":338,"language":239,"meta":167,"style":167},"import type { CollectionConfig } from 'payload'\n\nconst Products: CollectionConfig = {\n  slug: 'products',\n  fields: [\n    { name: 'name', type: 'text', required: true },\n    { name: 'description', type: 'textarea', required: true },\n    { name: 'price', type: 'number', required: true },\n    { name: 'rating', type: 'number' },\n    { name: 'image', type: 'upload', relationTo: 'media' },\n    {\n      name: 'gallery',\n      type: 'array',\n      fields: [{ name: 'image', type: 'upload', relationTo: 'media' }],\n    },\n    {\n      name: 'tags',\n      type: 'array',\n      fields: [{ name: 'name', type: 'text' }],\n    },\n    {\n      name: 'colors',\n      type: 'array',\n      fields: [\n        { name: 'name', type: 'text' },\n        { name: 'hexCode', type: 'text' },\n      ],\n    },\n    { name: 'isBestseller', type: 'checkbox', defaultValue: false },\n    { name: 'isFeatured', type: 'checkbox', defaultValue: false },\n  ],\n}\n\nexport default Products\n","payload\u002Fcollections\u002FProducts.ts",[169,340,341,370,376,394,411,421,466,504,543,573,618,624,641,658,713,718,723,739,754,793,798,803,819,834,843,873,903,911,916,957,995,1003,1009,1014],{"__ignoreMap":167},[172,342,343,346,349,352,355,358,361,364,367],{"class":174,"line":175},[172,344,345],{"class":246},"import",[172,347,348],{"class":246}," type",[172,350,351],{"class":223}," {",[172,353,354],{"class":219}," CollectionConfig",[172,356,357],{"class":223}," }",[172,359,360],{"class":246}," from",[172,362,363],{"class":223}," '",[172,365,366],{"class":182},"payload",[172,368,369],{"class":223},"'\n",[172,371,372],{"class":174,"line":263},[172,373,375],{"emptyLinePlaceholder":374},true,"\n",[172,377,378,382,385,387,389,392],{"class":174,"line":275},[172,379,381],{"class":380},"spNyl","const",[172,383,384],{"class":219}," Products",[172,386,234],{"class":223},[172,388,354],{"class":178},[172,390,391],{"class":223}," =",[172,393,272],{"class":223},[172,395,396,399,401,403,406,409],{"class":174,"line":285},[172,397,398],{"class":266},"  slug",[172,400,234],{"class":223},[172,402,363],{"class":223},[172,404,405],{"class":182},"products",[172,407,408],{"class":223},"'",[172,410,296],{"class":223},[172,412,413,416,418],{"class":174,"line":299},[172,414,415],{"class":266},"  fields",[172,417,234],{"class":223},[172,419,420],{"class":219}," [\n",[172,422,423,426,429,431,433,436,438,441,443,445,447,450,452,454,457,459,463],{"class":174,"line":305},[172,424,425],{"class":223},"    {",[172,427,428],{"class":266}," name",[172,430,234],{"class":223},[172,432,363],{"class":223},[172,434,435],{"class":182},"name",[172,437,408],{"class":223},[172,439,440],{"class":223},",",[172,442,348],{"class":266},[172,444,234],{"class":223},[172,446,363],{"class":223},[172,448,449],{"class":182},"text",[172,451,408],{"class":223},[172,453,440],{"class":223},[172,455,456],{"class":266}," required",[172,458,234],{"class":223},[172,460,462],{"class":461},"sfNiH"," true",[172,464,465],{"class":223}," },\n",[172,467,468,470,472,474,476,479,481,483,485,487,489,492,494,496,498,500,502],{"class":174,"line":311},[172,469,425],{"class":223},[172,471,428],{"class":266},[172,473,234],{"class":223},[172,475,363],{"class":223},[172,477,478],{"class":182},"description",[172,480,408],{"class":223},[172,482,440],{"class":223},[172,484,348],{"class":266},[172,486,234],{"class":223},[172,488,363],{"class":223},[172,490,491],{"class":182},"textarea",[172,493,408],{"class":223},[172,495,440],{"class":223},[172,497,456],{"class":266},[172,499,234],{"class":223},[172,501,462],{"class":461},[172,503,465],{"class":223},[172,505,507,509,511,513,515,518,520,522,524,526,528,531,533,535,537,539,541],{"class":174,"line":506},8,[172,508,425],{"class":223},[172,510,428],{"class":266},[172,512,234],{"class":223},[172,514,363],{"class":223},[172,516,517],{"class":182},"price",[172,519,408],{"class":223},[172,521,440],{"class":223},[172,523,348],{"class":266},[172,525,234],{"class":223},[172,527,363],{"class":223},[172,529,530],{"class":182},"number",[172,532,408],{"class":223},[172,534,440],{"class":223},[172,536,456],{"class":266},[172,538,234],{"class":223},[172,540,462],{"class":461},[172,542,465],{"class":223},[172,544,546,548,550,552,554,557,559,561,563,565,567,569,571],{"class":174,"line":545},9,[172,547,425],{"class":223},[172,549,428],{"class":266},[172,551,234],{"class":223},[172,553,363],{"class":223},[172,555,556],{"class":182},"rating",[172,558,408],{"class":223},[172,560,440],{"class":223},[172,562,348],{"class":266},[172,564,234],{"class":223},[172,566,363],{"class":223},[172,568,530],{"class":182},[172,570,408],{"class":223},[172,572,465],{"class":223},[172,574,576,578,580,582,584,587,589,591,593,595,597,600,602,604,607,609,611,614,616],{"class":174,"line":575},10,[172,577,425],{"class":223},[172,579,428],{"class":266},[172,581,234],{"class":223},[172,583,363],{"class":223},[172,585,586],{"class":182},"image",[172,588,408],{"class":223},[172,590,440],{"class":223},[172,592,348],{"class":266},[172,594,234],{"class":223},[172,596,363],{"class":223},[172,598,599],{"class":182},"upload",[172,601,408],{"class":223},[172,603,440],{"class":223},[172,605,606],{"class":266}," relationTo",[172,608,234],{"class":223},[172,610,363],{"class":223},[172,612,613],{"class":182},"media",[172,615,408],{"class":223},[172,617,465],{"class":223},[172,619,621],{"class":174,"line":620},11,[172,622,623],{"class":223},"    {\n",[172,625,627,630,632,634,637,639],{"class":174,"line":626},12,[172,628,629],{"class":266},"      name",[172,631,234],{"class":223},[172,633,363],{"class":223},[172,635,636],{"class":182},"gallery",[172,638,408],{"class":223},[172,640,296],{"class":223},[172,642,644,647,649,651,654,656],{"class":174,"line":643},13,[172,645,646],{"class":266},"      type",[172,648,234],{"class":223},[172,650,363],{"class":223},[172,652,653],{"class":182},"array",[172,655,408],{"class":223},[172,657,296],{"class":223},[172,659,661,664,666,669,672,674,676,678,680,682,684,686,688,690,692,694,696,698,700,702,704,706,708,711],{"class":174,"line":660},14,[172,662,663],{"class":266},"      fields",[172,665,234],{"class":223},[172,667,668],{"class":219}," [",[172,670,671],{"class":223},"{",[172,673,428],{"class":266},[172,675,234],{"class":223},[172,677,363],{"class":223},[172,679,586],{"class":182},[172,681,408],{"class":223},[172,683,440],{"class":223},[172,685,348],{"class":266},[172,687,234],{"class":223},[172,689,363],{"class":223},[172,691,599],{"class":182},[172,693,408],{"class":223},[172,695,440],{"class":223},[172,697,606],{"class":266},[172,699,234],{"class":223},[172,701,363],{"class":223},[172,703,613],{"class":182},[172,705,408],{"class":223},[172,707,357],{"class":223},[172,709,710],{"class":219},"]",[172,712,296],{"class":223},[172,714,716],{"class":174,"line":715},15,[172,717,302],{"class":223},[172,719,721],{"class":174,"line":720},16,[172,722,623],{"class":223},[172,724,726,728,730,732,735,737],{"class":174,"line":725},17,[172,727,629],{"class":266},[172,729,234],{"class":223},[172,731,363],{"class":223},[172,733,734],{"class":182},"tags",[172,736,408],{"class":223},[172,738,296],{"class":223},[172,740,742,744,746,748,750,752],{"class":174,"line":741},18,[172,743,646],{"class":266},[172,745,234],{"class":223},[172,747,363],{"class":223},[172,749,653],{"class":182},[172,751,408],{"class":223},[172,753,296],{"class":223},[172,755,757,759,761,763,765,767,769,771,773,775,777,779,781,783,785,787,789,791],{"class":174,"line":756},19,[172,758,663],{"class":266},[172,760,234],{"class":223},[172,762,668],{"class":219},[172,764,671],{"class":223},[172,766,428],{"class":266},[172,768,234],{"class":223},[172,770,363],{"class":223},[172,772,435],{"class":182},[172,774,408],{"class":223},[172,776,440],{"class":223},[172,778,348],{"class":266},[172,780,234],{"class":223},[172,782,363],{"class":223},[172,784,449],{"class":182},[172,786,408],{"class":223},[172,788,357],{"class":223},[172,790,710],{"class":219},[172,792,296],{"class":223},[172,794,796],{"class":174,"line":795},20,[172,797,302],{"class":223},[172,799,801],{"class":174,"line":800},21,[172,802,623],{"class":223},[172,804,806,808,810,812,815,817],{"class":174,"line":805},22,[172,807,629],{"class":266},[172,809,234],{"class":223},[172,811,363],{"class":223},[172,813,814],{"class":182},"colors",[172,816,408],{"class":223},[172,818,296],{"class":223},[172,820,822,824,826,828,830,832],{"class":174,"line":821},23,[172,823,646],{"class":266},[172,825,234],{"class":223},[172,827,363],{"class":223},[172,829,653],{"class":182},[172,831,408],{"class":223},[172,833,296],{"class":223},[172,835,837,839,841],{"class":174,"line":836},24,[172,838,663],{"class":266},[172,840,234],{"class":223},[172,842,420],{"class":219},[172,844,846,849,851,853,855,857,859,861,863,865,867,869,871],{"class":174,"line":845},25,[172,847,848],{"class":223},"        {",[172,850,428],{"class":266},[172,852,234],{"class":223},[172,854,363],{"class":223},[172,856,435],{"class":182},[172,858,408],{"class":223},[172,860,440],{"class":223},[172,862,348],{"class":266},[172,864,234],{"class":223},[172,866,363],{"class":223},[172,868,449],{"class":182},[172,870,408],{"class":223},[172,872,465],{"class":223},[172,874,876,878,880,882,884,887,889,891,893,895,897,899,901],{"class":174,"line":875},26,[172,877,848],{"class":223},[172,879,428],{"class":266},[172,881,234],{"class":223},[172,883,363],{"class":223},[172,885,886],{"class":182},"hexCode",[172,888,408],{"class":223},[172,890,440],{"class":223},[172,892,348],{"class":266},[172,894,234],{"class":223},[172,896,363],{"class":223},[172,898,449],{"class":182},[172,900,408],{"class":223},[172,902,465],{"class":223},[172,904,906,909],{"class":174,"line":905},27,[172,907,908],{"class":219},"      ]",[172,910,296],{"class":223},[172,912,914],{"class":174,"line":913},28,[172,915,302],{"class":223},[172,917,919,921,923,925,927,930,932,934,936,938,940,943,945,947,950,952,955],{"class":174,"line":918},29,[172,920,425],{"class":223},[172,922,428],{"class":266},[172,924,234],{"class":223},[172,926,363],{"class":223},[172,928,929],{"class":182},"isBestseller",[172,931,408],{"class":223},[172,933,440],{"class":223},[172,935,348],{"class":266},[172,937,234],{"class":223},[172,939,363],{"class":223},[172,941,942],{"class":182},"checkbox",[172,944,408],{"class":223},[172,946,440],{"class":223},[172,948,949],{"class":266}," defaultValue",[172,951,234],{"class":223},[172,953,954],{"class":461}," false",[172,956,465],{"class":223},[172,958,960,962,964,966,968,971,973,975,977,979,981,983,985,987,989,991,993],{"class":174,"line":959},30,[172,961,425],{"class":223},[172,963,428],{"class":266},[172,965,234],{"class":223},[172,967,363],{"class":223},[172,969,970],{"class":182},"isFeatured",[172,972,408],{"class":223},[172,974,440],{"class":223},[172,976,348],{"class":266},[172,978,234],{"class":223},[172,980,363],{"class":223},[172,982,942],{"class":182},[172,984,408],{"class":223},[172,986,440],{"class":223},[172,988,949],{"class":266},[172,990,234],{"class":223},[172,992,954],{"class":461},[172,994,465],{"class":223},[172,996,998,1001],{"class":174,"line":997},31,[172,999,1000],{"class":219},"  ]",[172,1002,296],{"class":223},[172,1004,1006],{"class":174,"line":1005},32,[172,1007,1008],{"class":223},"}\n",[172,1010,1012],{"class":174,"line":1011},33,[172,1013,375],{"emptyLinePlaceholder":374},[172,1015,1017,1019,1021],{"class":174,"line":1016},34,[172,1018,247],{"class":246},[172,1020,250],{"class":246},[172,1022,1023],{"class":219}," Products\n",[96,1025,1026,1027,234],{},"Register it in ",[169,1028,1029],{},"payload.config.ts",[162,1031,1033],{"className":237,"code":1032,"filename":1029,"language":239,"meta":167,"style":167},"import { buildConfig } from 'payload'\nimport Products from '.\u002Fcollections\u002FProducts'\n\nexport default buildConfig({\n  collections: [Products],\n  \u002F\u002F add more collections as you replace other mock files, e.g. Promocodes\n})\n",[169,1034,1035,1054,1071,1075,1087,1099,1105],{"__ignoreMap":167},[172,1036,1037,1039,1041,1044,1046,1048,1050,1052],{"class":174,"line":175},[172,1038,345],{"class":246},[172,1040,351],{"class":223},[172,1042,1043],{"class":219}," buildConfig",[172,1045,357],{"class":223},[172,1047,360],{"class":246},[172,1049,363],{"class":223},[172,1051,366],{"class":182},[172,1053,369],{"class":223},[172,1055,1056,1058,1061,1064,1066,1069],{"class":174,"line":263},[172,1057,345],{"class":246},[172,1059,1060],{"class":219}," Products ",[172,1062,1063],{"class":246},"from",[172,1065,363],{"class":223},[172,1067,1068],{"class":182},".\u002Fcollections\u002FProducts",[172,1070,369],{"class":223},[172,1072,1073],{"class":174,"line":275},[172,1074,375],{"emptyLinePlaceholder":374},[172,1076,1077,1079,1081,1083,1085],{"class":174,"line":285},[172,1078,247],{"class":246},[172,1080,250],{"class":246},[172,1082,1043],{"class":253},[172,1084,257],{"class":219},[172,1086,260],{"class":223},[172,1088,1089,1092,1094,1097],{"class":174,"line":299},[172,1090,1091],{"class":266},"  collections",[172,1093,234],{"class":223},[172,1095,1096],{"class":219}," [Products]",[172,1098,296],{"class":223},[172,1100,1101],{"class":174,"line":305},[172,1102,1104],{"class":1103},"sHwdD","  \u002F\u002F add more collections as you replace other mock files, e.g. Promocodes\n",[172,1106,1107,1109],{"class":174,"line":311},[172,1108,314],{"class":223},[172,1110,317],{"class":219},[154,1112,1114],{"id":1113},"connect-rosavo-to-the-api","Connect Rosavo to the API",[96,1116,1117,1118,234],{},"Create a shared base composable in ",[169,1119,1120],{},"app\u002Fcomposables\u002F",[162,1122,1125],{"className":237,"code":1123,"filename":1124,"language":239,"meta":167,"style":167},"export const useApi = \u003CT>(endpoint: string) => {\n  const { public: { apiBase } } = useRuntimeConfig()\n  const token = useCookie('auth_token')\n\n  return useFetch\u003CT>(`${apiBase}${endpoint}`, {\n    headers: token.value\n      ? { Authorization: `Bearer ${token.value}` }\n      : {},\n  })\n}\n","app\u002Fcomposables\u002FuseApi.ts",[169,1126,1127,1165,1194,1217,1221,1257,1272,1306,1314,1321],{"__ignoreMap":167},[172,1128,1129,1131,1134,1137,1139,1142,1145,1148,1152,1154,1157,1160,1163],{"class":174,"line":175},[172,1130,247],{"class":246},[172,1132,1133],{"class":380}," const",[172,1135,1136],{"class":219}," useApi ",[172,1138,224],{"class":223},[172,1140,1141],{"class":223}," \u003C",[172,1143,1144],{"class":178},"T",[172,1146,1147],{"class":223},">(",[172,1149,1151],{"class":1150},"sHdIc","endpoint",[172,1153,234],{"class":223},[172,1155,1156],{"class":178}," string",[172,1158,1159],{"class":223},")",[172,1161,1162],{"class":380}," =>",[172,1164,272],{"class":223},[172,1166,1167,1170,1172,1175,1177,1179,1182,1184,1186,1188,1191],{"class":174,"line":263},[172,1168,1169],{"class":380},"  const",[172,1171,351],{"class":223},[172,1173,1174],{"class":266}," public",[172,1176,234],{"class":223},[172,1178,351],{"class":223},[172,1180,1181],{"class":219}," apiBase",[172,1183,357],{"class":223},[172,1185,357],{"class":223},[172,1187,391],{"class":223},[172,1189,1190],{"class":253}," useRuntimeConfig",[172,1192,1193],{"class":266},"()\n",[172,1195,1196,1198,1201,1203,1206,1208,1210,1213,1215],{"class":174,"line":275},[172,1197,1169],{"class":380},[172,1199,1200],{"class":219}," token",[172,1202,391],{"class":223},[172,1204,1205],{"class":253}," useCookie",[172,1207,257],{"class":266},[172,1209,408],{"class":223},[172,1211,1212],{"class":182},"auth_token",[172,1214,408],{"class":223},[172,1216,317],{"class":266},[172,1218,1219],{"class":174,"line":285},[172,1220,375],{"emptyLinePlaceholder":374},[172,1222,1223,1226,1229,1232,1234,1237,1239,1242,1245,1248,1250,1253,1255],{"class":174,"line":299},[172,1224,1225],{"class":246},"  return",[172,1227,1228],{"class":253}," useFetch",[172,1230,1231],{"class":223},"\u003C",[172,1233,1144],{"class":178},[172,1235,1236],{"class":223},">",[172,1238,257],{"class":266},[172,1240,1241],{"class":223},"`${",[172,1243,1244],{"class":219},"apiBase",[172,1246,1247],{"class":223},"}${",[172,1249,1151],{"class":219},[172,1251,1252],{"class":223},"}`",[172,1254,440],{"class":223},[172,1256,272],{"class":223},[172,1258,1259,1262,1264,1266,1269],{"class":174,"line":305},[172,1260,1261],{"class":266},"    headers",[172,1263,234],{"class":223},[172,1265,1200],{"class":219},[172,1267,1268],{"class":223},".",[172,1270,1271],{"class":219},"value\n",[172,1273,1274,1277,1279,1282,1284,1287,1290,1293,1296,1298,1301,1303],{"class":174,"line":311},[172,1275,1276],{"class":223},"      ?",[172,1278,351],{"class":223},[172,1280,1281],{"class":266}," Authorization",[172,1283,234],{"class":223},[172,1285,1286],{"class":223}," `",[172,1288,1289],{"class":182},"Bearer ",[172,1291,1292],{"class":223},"${",[172,1294,1295],{"class":219},"token",[172,1297,1268],{"class":223},[172,1299,1300],{"class":219},"value",[172,1302,1252],{"class":223},[172,1304,1305],{"class":223}," }\n",[172,1307,1308,1311],{"class":174,"line":506},[172,1309,1310],{"class":223},"      :",[172,1312,1313],{"class":223}," {},\n",[172,1315,1316,1319],{"class":174,"line":545},[172,1317,1318],{"class":223},"  }",[172,1320,317],{"class":266},[172,1322,1323],{"class":174,"line":575},[172,1324,1008],{"class":223},[96,1326,1327],{},"Then replace each static JSON import with a one-line composable:",[162,1329,1332],{"className":237,"code":1330,"filename":1331,"language":239,"meta":167,"style":167},"export const useProducts = () => useApi('\u002Fapi\u002Fproducts')\n","app\u002Fcomposables\u002FuseProducts.ts",[169,1333,1334],{"__ignoreMap":167},[172,1335,1336,1338,1340,1343,1345,1348,1350,1353,1355,1357,1360,1362],{"class":174,"line":175},[172,1337,247],{"class":246},[172,1339,1133],{"class":380},[172,1341,1342],{"class":219}," useProducts ",[172,1344,224],{"class":223},[172,1346,1347],{"class":223}," ()",[172,1349,1162],{"class":380},[172,1351,1352],{"class":253}," useApi",[172,1354,257],{"class":219},[172,1356,408],{"class":223},[172,1358,1359],{"class":182},"\u002Fapi\u002Fproducts",[172,1361,408],{"class":223},[172,1363,317],{"class":219},[162,1365,1368],{"className":237,"code":1366,"filename":1367,"language":239,"meta":167,"style":167},"export const usePromocodes = () => useApi('\u002Fapi\u002Fpromocodes')\n","app\u002Fcomposables\u002FusePromocodes.ts",[169,1369,1370],{"__ignoreMap":167},[172,1371,1372,1374,1376,1379,1381,1383,1385,1387,1389,1391,1394,1396],{"class":174,"line":175},[172,1373,247],{"class":246},[172,1375,1133],{"class":380},[172,1377,1378],{"class":219}," usePromocodes ",[172,1380,224],{"class":223},[172,1382,1347],{"class":223},[172,1384,1162],{"class":380},[172,1386,1352],{"class":253},[172,1388,257],{"class":219},[172,1390,408],{"class":223},[172,1392,1393],{"class":182},"\u002Fapi\u002Fpromocodes",[172,1395,408],{"class":223},[172,1397,317],{"class":219},[96,1399,1400,1401,1403],{},"As you add more collections (e.g. Orders, Reviews), follow the same pattern. Nuxt auto-imports everything from ",[169,1402,1120],{}," — no manual imports needed.",[154,1405,1407],{"id":1406},"update-existing-pages","Update Existing Pages",[96,1409,1410],{},"The project pages currently import data directly from the local mock files:",[162,1412,1414],{"className":237,"code":1413,"language":239,"meta":167,"style":167},"import { products } from '~\u002Fmocks'\n",[169,1415,1416],{"__ignoreMap":167},[172,1417,1418,1420,1422,1425,1427,1429,1431,1434],{"class":174,"line":175},[172,1419,345],{"class":246},[172,1421,351],{"class":223},[172,1423,1424],{"class":219}," products",[172,1426,357],{"class":223},[172,1428,360],{"class":246},[172,1430,363],{"class":223},[172,1432,1433],{"class":182},"~\u002Fmocks",[172,1435,369],{"class":223},[96,1437,1438],{},"After creating your composables, replace these direct imports in each page:",[1440,1441,1442,1458],"table",{},[1443,1444,1445],"thead",{},[1446,1447,1448,1452,1455],"tr",{},[1449,1450,1451],"th",{},"Page file",[1449,1453,1454],{},"Current import",[1449,1456,1457],{},"Replace with",[1459,1460,1461,1479,1494,1509,1524],"tbody",{},[1446,1462,1463,1469,1474],{},[1464,1465,1466],"td",{},[169,1467,1468],{},"pages\u002Fhome.vue",[1464,1470,1471],{},[169,1472,1473],{},"import { products } from '~\u002Fmocks'",[1464,1475,1476],{},[169,1477,1478],{},"const { data: products } = await useProducts()",[1446,1480,1481,1486,1490],{},[1464,1482,1483],{},[169,1484,1485],{},"pages\u002Fshop.vue",[1464,1487,1488],{},[169,1489,1473],{},[1464,1491,1492],{},[169,1493,1478],{},[1446,1495,1496,1501,1505],{},[1464,1497,1498],{},[169,1499,1500],{},"pages\u002Fsearch.vue",[1464,1502,1503],{},[169,1504,1473],{},[1464,1506,1507],{},[169,1508,1478],{},[1446,1510,1511,1516,1520],{},[1464,1512,1513],{},[169,1514,1515],{},"pages\u002Fproduct\u002F[id].vue",[1464,1517,1518],{},[169,1519,1473],{},[1464,1521,1522],{},[169,1523,1478],{},[1446,1525,1526,1531,1536],{},[1464,1527,1528],{},[169,1529,1530],{},"pages\u002Fmy-promocodes.vue",[1464,1532,1533],{},[169,1534,1535],{},"import { promocodes } from '~\u002Fmocks'",[1464,1537,1538],{},[169,1539,1540],{},"const { data: promocodes } = await usePromocodes()",[1542,1543,1545],"callout",{"color":1544,"icon":11},"warning",[96,1546,1547,1548,1551,1552,1555,1556,1559],{},"PayloadCMS wraps results in a ",[169,1549,1550],{},"docs"," array. After replacing imports, update data references in templates from ",[169,1553,1554],{},"item"," to ",[169,1557,1558],{},"item.docs"," where needed.",[154,1561,1563],{"id":1562},"use-in-a-component","Use in a Component",[162,1565,1570],{"className":1566,"code":1567,"filename":1568,"language":1569,"meta":167,"style":167},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nconst { data: products, pending, error } = await useProducts()\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cdiv v-if=\"pending\">Loading...\u003C\u002Fdiv>\n  \u003Cdiv v-else-if=\"error\">Error: {{ error }}\u003C\u002Fdiv>\n  \u003Cul v-else>\n    \u003Cli v-for=\"product in products?.docs\" :key=\"product.id\">{{ product.name }}\u003C\u002Fli>\n  \u003C\u002Ful>\n\u003C\u002Ftemplate>\n","app\u002Fcomponents\u002FProductList.vue","vue",[169,1571,1572,1597,1632,1641,1645,1654,1685,1714,1726,1769,1778],{"__ignoreMap":167},[172,1573,1574,1576,1579,1582,1585,1587,1590,1592,1594],{"class":174,"line":175},[172,1575,1231],{"class":223},[172,1577,1578],{"class":266},"script",[172,1580,1581],{"class":380}," setup",[172,1583,1584],{"class":380}," lang",[172,1586,224],{"class":223},[172,1588,1589],{"class":223},"\"",[172,1591,239],{"class":182},[172,1593,1589],{"class":223},[172,1595,1596],{"class":223},">\n",[172,1598,1599,1601,1603,1606,1608,1610,1612,1615,1617,1620,1622,1624,1627,1630],{"class":174,"line":263},[172,1600,381],{"class":380},[172,1602,351],{"class":223},[172,1604,1605],{"class":266}," data",[172,1607,234],{"class":223},[172,1609,1424],{"class":219},[172,1611,440],{"class":223},[172,1613,1614],{"class":219}," pending",[172,1616,440],{"class":223},[172,1618,1619],{"class":219}," error ",[172,1621,314],{"class":223},[172,1623,391],{"class":223},[172,1625,1626],{"class":246}," await",[172,1628,1629],{"class":253}," useProducts",[172,1631,1193],{"class":219},[172,1633,1634,1637,1639],{"class":174,"line":275},[172,1635,1636],{"class":223},"\u003C\u002F",[172,1638,1578],{"class":266},[172,1640,1596],{"class":223},[172,1642,1643],{"class":174,"line":285},[172,1644,375],{"emptyLinePlaceholder":374},[172,1646,1647,1649,1652],{"class":174,"line":299},[172,1648,1231],{"class":223},[172,1650,1651],{"class":266},"template",[172,1653,1596],{"class":223},[172,1655,1656,1659,1662,1665,1667,1669,1672,1674,1676,1679,1681,1683],{"class":174,"line":305},[172,1657,1658],{"class":223},"  \u003C",[172,1660,1661],{"class":266},"div",[172,1663,1664],{"class":380}," v-if",[172,1666,224],{"class":223},[172,1668,1589],{"class":223},[172,1670,1671],{"class":182},"pending",[172,1673,1589],{"class":223},[172,1675,1236],{"class":223},[172,1677,1678],{"class":219},"Loading...",[172,1680,1636],{"class":223},[172,1682,1661],{"class":266},[172,1684,1596],{"class":223},[172,1686,1687,1689,1691,1694,1696,1698,1701,1703,1705,1708,1710,1712],{"class":174,"line":311},[172,1688,1658],{"class":223},[172,1690,1661],{"class":266},[172,1692,1693],{"class":380}," v-else-if",[172,1695,224],{"class":223},[172,1697,1589],{"class":223},[172,1699,1700],{"class":182},"error",[172,1702,1589],{"class":223},[172,1704,1236],{"class":223},[172,1706,1707],{"class":219},"Error: {{ error }}",[172,1709,1636],{"class":223},[172,1711,1661],{"class":266},[172,1713,1596],{"class":223},[172,1715,1716,1718,1721,1724],{"class":174,"line":506},[172,1717,1658],{"class":223},[172,1719,1720],{"class":266},"ul",[172,1722,1723],{"class":380}," v-else",[172,1725,1596],{"class":223},[172,1727,1728,1731,1734,1737,1739,1741,1744,1746,1749,1751,1753,1756,1758,1760,1763,1765,1767],{"class":174,"line":545},[172,1729,1730],{"class":223},"    \u003C",[172,1732,1733],{"class":266},"li",[172,1735,1736],{"class":380}," v-for",[172,1738,224],{"class":223},[172,1740,1589],{"class":223},[172,1742,1743],{"class":182},"product in products?.docs",[172,1745,1589],{"class":223},[172,1747,1748],{"class":380}," :key",[172,1750,224],{"class":223},[172,1752,1589],{"class":223},[172,1754,1755],{"class":182},"product.id",[172,1757,1589],{"class":223},[172,1759,1236],{"class":223},[172,1761,1762],{"class":219},"{{ product.name }}",[172,1764,1636],{"class":223},[172,1766,1733],{"class":266},[172,1768,1596],{"class":223},[172,1770,1771,1774,1776],{"class":174,"line":575},[172,1772,1773],{"class":223},"  \u003C\u002F",[172,1775,1720],{"class":266},[172,1777,1596],{"class":223},[172,1779,1780,1782,1784],{"class":174,"line":620},[172,1781,1636],{"class":223},[172,1783,1651],{"class":266},[172,1785,1596],{"class":223},[111,1787,1789],{"id":1788},"recommended-collections","Recommended Collections",[1440,1791,1792,1805],{},[1443,1793,1794],{},[1446,1795,1796,1799,1802],{},[1449,1797,1798],{},"Collection",[1449,1800,1801],{},"Replaces",[1449,1803,1804],{},"Purpose",[1459,1806,1807,1821],{},[1446,1808,1809,1813,1818],{},[1464,1810,1811],{},[169,1812,405],{},[1464,1814,1815],{},[169,1816,1817],{},"products.json",[1464,1819,1820],{},"Products with images, prices, and metadata",[1446,1822,1823,1828,1833],{},[1464,1824,1825],{},[169,1826,1827],{},"promocodes",[1464,1829,1830],{},[169,1831,1832],{},"promocodes.json",[1464,1834,1835],{},"Discount codes and their conditions",[111,1837,1839],{"id":1838},"useful-links","Useful Links",[116,1841,1842,1851],{},[119,1843,1848],{"icon":1844,"title":1845,"target":1846,"to":1847},"i-lucide-book-open","PayloadCMS Docs","_blank","https:\u002F\u002Fpayloadcms.com\u002Fdocs",[96,1849,1850],{},"Official documentation — getting started, collections, auth, uploads.",[119,1852,1856],{"icon":1853,"title":1854,"target":1846,"to":1855},"i-simple-icons-youtube","PayloadCMS on YouTube","https:\u002F\u002Fwww.youtube.com\u002F@payloadcms",[96,1857,1858],{},"Official tutorials, feature overviews, and release walkthroughs.",[1542,1860,1863],{"color":1861,"icon":1862},"info","i-lucide-lightbulb",[96,1864,1865,1866,1869,1870,1873],{},"PayloadCMS automatically generates a full REST API (",[169,1867,1868],{},"\u002Fapi\u002F\u003Ccollection>",") and an Admin UI (",[169,1871,1872],{},"\u002Fadmin",") for every collection you define — no extra configuration needed.",[1875,1876,1877],"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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .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}",{"title":167,"searchDepth":175,"depth":263,"links":1879},[1880,1881,1882,1883],{"id":113,"depth":263,"text":114},{"id":148,"depth":263,"text":149},{"id":1788,"depth":263,"text":1789},{"id":1838,"depth":263,"text":1839},"How to connect Rosavo to a real backend using PayloadCMS.","md",null,{},{"icon":46},{"title":43,"description":1884},"Tiw9Wn865sfZqyJiVy9fTGu1BJtdnQESq7NIeCU5sQk",[1892,1894],{"title":38,"path":39,"stem":40,"description":1893,"icon":41,"children":-1},"Learn how to work with APIs and integrate external services.",{"title":48,"path":49,"stem":50,"description":1895,"icon":51,"children":-1},"How to install the app on any device — iOS, Android, Mac, or Windows.",1784271367585]