[{"data":1,"prerenderedAt":3165},["ShallowReactive",2],{"blog-how-to-create-medusa-js-with-nuxt-4":3},{"id":4,"title":5,"author":6,"authorSlug":7,"body":8,"date":3151,"description":3152,"extension":3153,"faq":7,"featured":3154,"image":3155,"meta":3156,"navigation":471,"path":3157,"readTime":7,"seo":3158,"stem":3159,"tags":3160,"__hash__":3164},"blog\u002Fblog\u002Fhow-to-create-medusa-js-with-nuxt-4.md","How to Build an E-Commerce Store with MedusaJS V2 and Nuxt 4","Epicmax Team",null,{"type":9,"value":10,"toc":3121},"minimark",[11,24,29,36,39,90,93,97,100,103,170,173,177,269,272,275,279,282,305,308,322,326,331,365,368,376,379,383,399,409,413,424,706,709,713,724,728,732,756,762,766,781,788,792,795,956,962,976,980,983,1059,1066,1235,1239,1243,1816,1820,2536,2540,2551,2933,2940,2944,2946,2952,2983,2987,2990,3018,3022,3029,3033,3036,3041,3067,3072,3096,3102,3106,3109,3112,3117],[12,13,14,15,19,20,23],"p",{},"Headless commerce has become the default architecture for teams that want full control over the storefront without reinventing the backend. ",[16,17,18],"strong",{},"MedusaJS V2"," and ",[16,21,22],{},"Nuxt 4"," are a natural fit: Medusa handles products, carts, orders, and payments while Nuxt 4 gives you a fast, SEO-friendly Vue-based storefront. In this guide you will set up both, wire them together, and understand how to manage your store going forward.",[25,26,28],"h2",{"id":27},"what-is-medusajs-v2","What is MedusaJS V2",[12,30,31,32,35],{},"Medusa (now at version 2.x) is an open-source, headless commerce engine built on Node.js and TypeScript. The original v1 was a monolithic Express server. ",[16,33,34],{},"V2 was redesigned from the ground up as a modular platform"," — every commerce domain (products, inventory, carts, orders, customers, promotions, payments) is an independent module that you can swap or extend without touching the rest of the system.",[12,37,38],{},"Key characteristics of Medusa V2:",[40,41,42,49,55,66,72,78,84],"ul",{},[43,44,45,48],"li",{},[16,46,47],{},"Modular architecture"," — install only the modules your store needs. A digital-goods store can skip the inventory module entirely; a B2B store can layer in company accounts.",[43,50,51,54],{},[16,52,53],{},"TypeScript-first"," — the entire codebase and its public APIs are fully typed.",[43,56,57,60,61,65],{},[16,58,59],{},"Built-in admin dashboard"," — ships at ",[62,63,64],"code",{},"\u002Fapp"," out of the box. No separate install required.",[43,67,68,71],{},[16,69,70],{},"Storefront API"," — a dedicated HTTP API surface designed for customer-facing operations: browse products, manage carts, place orders.",[43,73,74,77],{},[16,75,76],{},"Workflow engine"," — long-running operations (order fulfillment, return processing) are modeled as resumable workflows rather than synchronous request handlers.",[43,79,80,83],{},[16,81,82],{},"PostgreSQL as the default database"," — reliable, ACID-compliant, well-supported by hosting providers.",[43,85,86,89],{},[16,87,88],{},"Plugin ecosystem"," — official integrations for Stripe, PayPal, Braintree, SendGrid, S3, and more.",[12,91,92],{},"Medusa V2 runs as a standalone HTTP server. Your storefront is a completely separate application that talks to it over HTTP — which is exactly where Nuxt 4 comes in.",[25,94,96],{"id":95},"what-is-nuxt-4","What is Nuxt 4",[12,98,99],{},"Nuxt 4 is the latest major version of the Nuxt framework, built on top of Vue 3. It became the stable release in July 2025 and introduced several developer-experience improvements over Nuxt 3 while remaining backwards-compatible for most projects.",[12,101,102],{},"What changed in Nuxt 4 that matters for a commerce storefront:",[40,104,105,141,158,164],{},[43,106,107,113,114,117,118,117,121,117,124,127,128,130,131,117,134,117,137,140],{},[16,108,109,112],{},[62,110,111],{},"app\u002F"," directory"," — all application code (",[62,115,116],{},"pages\u002F",", ",[62,119,120],{},"components\u002F",[62,122,123],{},"composables\u002F",[62,125,126],{},"layouts\u002F",") now lives inside ",[62,129,111],{}," rather than the project root. Configuration files (",[62,132,133],{},"nuxt.config.ts",[62,135,136],{},"content.config.ts",[62,138,139],{},"package.json",") stay at the root.",[43,142,143,146,147,19,150,153,154,157],{},[16,144,145],{},"Smarter data fetching"," — ",[62,148,149],{},"useAsyncData",[62,151,152],{},"useFetch"," share state via a singleton cache, clean up on component unmount, and support reactive keys for automatic refetching. This is important for dynamic routes like ",[62,155,156],{},"\u002Fproducts\u002F[handle]",".",[43,159,160,163],{},[16,161,162],{},"Better TypeScript"," — Nuxt now generates separate TS configs for the app, server, and shared contexts, which reduces cross-environment type leakage.",[43,165,166,169],{},[16,167,168],{},"Faster cold starts"," — Node.js compile cache, native file watching, and socket-based communication between the CLI and Vite.",[12,171,172],{},"For a commerce storefront you get SSR + SSG out of the box, which means product pages can be pre-rendered at build time for SEO and then hydrated on the client.",[25,174,176],{"id":175},"why-this-combination-is-great","Why This Combination is Great",[178,179,180,194],"table",{},[181,182,183],"thead",{},[184,185,186,190,192],"tr",{},[187,188,189],"th",{},"Concern",[187,191,18],{},[187,193,22],{},[195,196,197,209,220,235,248,259],"tbody",{},[184,198,199,203,206],{},[200,201,202],"td",{},"Product catalog",[200,204,205],{},"✅ Managed via admin or API",[200,207,208],{},"✅ Fetched and cached at build time",[184,210,211,214,217],{},[200,212,213],{},"Cart & checkout",[200,215,216],{},"✅ Stateful cart sessions, payment integrations",[200,218,219],{},"✅ Client-side composables with SSR fallback",[184,221,222,225,228],{},[200,223,224],{},"SEO",[200,226,227],{},"❌ Not applicable (headless backend)",[200,229,230,231,234],{},"✅ SSR\u002FSSG, ",[62,232,233],{},"useSeoMeta",", sitemap",[184,236,237,240,245],{},[200,238,239],{},"Admin UI",[200,241,242,243],{},"✅ Ships at ",[62,244,64],{},[200,246,247],{},"Not needed",[184,249,250,253,256],{},[200,251,252],{},"Extensibility",[200,254,255],{},"✅ Custom modules, workflows, API routes",[200,257,258],{},"✅ Nuxt plugins, server routes, middleware",[184,260,261,264,267],{},[200,262,263],{},"TypeScript",[200,265,266],{},"✅ Full coverage",[200,268,266],{},[12,270,271],{},"The separation of concerns is clean: Medusa owns the commerce data and business logic; Nuxt owns the presentation layer. You can redesign the storefront completely without touching the backend, and you can upgrade Medusa modules without redeploying the frontend.",[12,273,274],{},"Both tools are open-source, actively maintained, and free to self-host — which keeps infrastructure costs predictable.",[25,276,278],{"id":277},"prerequisites","Prerequisites",[12,280,281],{},"Before you start, make sure you have the following installed:",[40,283,284,294,300],{},[43,285,286,289,290,293],{},[16,287,288],{},"Node.js 20+"," (check with ",[62,291,292],{},"node -v",")",[43,295,296,299],{},[16,297,298],{},"PostgreSQL 15+"," running locally or a managed database URL",[43,301,302],{},[16,303,304],{},"Git",[12,306,307],{},"You will run two separate servers during development:",[40,309,310,316],{},[43,311,312,313],{},"Medusa backend on ",[62,314,315],{},"http:\u002F\u002Flocalhost:9000",[43,317,318,319],{},"Nuxt 4 storefront on ",[62,320,321],{},"http:\u002F\u002Flocalhost:3000",[25,323,325],{"id":324},"setting-up-the-medusajs-v2-backend","Setting Up the MedusaJS V2 Backend",[327,328,330],"h3",{"id":329},"_1-create-a-new-medusa-project","1. Create a new Medusa project",[332,333,338],"pre",{"className":334,"code":335,"language":336,"meta":337,"style":337},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx create-medusa-app@latest my-store-backend\ncd my-store-backend\n","bash","",[62,339,340,356],{"__ignoreMap":337},[341,342,345,349,353],"span",{"class":343,"line":344},"line",1,[341,346,348],{"class":347},"sBMFI","npx",[341,350,352],{"class":351},"sfazB"," create-medusa-app@latest",[341,354,355],{"class":351}," my-store-backend\n",[341,357,359,363],{"class":343,"line":358},2,[341,360,362],{"class":361},"s2Zo4","cd",[341,364,355],{"class":351},[12,366,367],{},"The CLI will ask for a project name and a PostgreSQL connection string. Provide a local database URL in the format:",[332,369,374],{"className":370,"code":372,"language":373},[371],"language-text","postgres:\u002F\u002Fpostgres:password@localhost:5432\u002Fmedusa_store\n","text",[62,375,372],{"__ignoreMap":337},[12,377,378],{},"The scaffold installs dependencies, runs database migrations, and seeds demo data (a sample product catalog so you have something to work with right away).",[327,380,382],{"id":381},"_2-start-the-medusa-server","2. Start the Medusa server",[332,384,386],{"className":334,"code":385,"language":336,"meta":337,"style":337},"npm run dev\n",[62,387,388],{"__ignoreMap":337},[341,389,390,393,396],{"class":343,"line":344},[341,391,392],{"class":347},"npm",[341,394,395],{"class":351}," run",[341,397,398],{"class":351}," dev\n",[12,400,401,402,404,405,408],{},"Medusa starts on ",[62,403,315],{},". Open ",[62,406,407],{},"http:\u002F\u002Flocalhost:9000\u002Fapp"," to access the admin dashboard. Create an admin account when prompted on first launch.",[327,410,412],{"id":411},"_3-enable-cors-for-your-nuxt-storefront","3. Enable CORS for your Nuxt storefront",[12,414,415,416,419,420,423],{},"Open ",[62,417,418],{},"medusa-config.ts"," (or ",[62,421,422],{},"medusa-config.js",") in the project root and add your Nuxt dev URL to the storefront CORS list:",[332,425,429],{"className":426,"code":427,"language":428,"meta":337,"style":337},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F medusa-config.ts\nimport { defineConfig } from \"@medusajs\u002Fframework\u002Fconfig\"\n\nexport default defineConfig({\n  projectConfig: {\n    databaseUrl: process.env.DATABASE_URL,\n    http: {\n      storeCors: process.env.STORE_CORS ?? \"http:\u002F\u002Flocalhost:3000\",\n      adminCors: process.env.ADMIN_CORS ?? \"http:\u002F\u002Flocalhost:9000\",\n      authCors: process.env.AUTH_CORS ?? \"http:\u002F\u002Flocalhost:3000\",\n      jwtSecret: process.env.JWT_SECRET ?? \"supersecret\",\n      cookieSecret: process.env.COOKIE_SECRET ?? \"supersecret\",\n    },\n  },\n})\n","typescript",[62,430,431,437,466,473,490,503,527,537,568,597,626,656,685,691,697],{"__ignoreMap":337},[341,432,433],{"class":343,"line":344},[341,434,436],{"class":435},"sHwdD","\u002F\u002F medusa-config.ts\n",[341,438,439,443,447,451,454,457,460,463],{"class":343,"line":358},[341,440,442],{"class":441},"s7zQu","import",[341,444,446],{"class":445},"sMK4o"," {",[341,448,450],{"class":449},"sTEyZ"," defineConfig",[341,452,453],{"class":445}," }",[341,455,456],{"class":441}," from",[341,458,459],{"class":445}," \"",[341,461,462],{"class":351},"@medusajs\u002Fframework\u002Fconfig",[341,464,465],{"class":445},"\"\n",[341,467,469],{"class":343,"line":468},3,[341,470,472],{"emptyLinePlaceholder":471},true,"\n",[341,474,476,479,482,484,487],{"class":343,"line":475},4,[341,477,478],{"class":441},"export",[341,480,481],{"class":441}," default",[341,483,450],{"class":361},[341,485,486],{"class":449},"(",[341,488,489],{"class":445},"{\n",[341,491,493,497,500],{"class":343,"line":492},5,[341,494,496],{"class":495},"swJcz","  projectConfig",[341,498,499],{"class":445},":",[341,501,502],{"class":445}," {\n",[341,504,506,509,511,514,516,519,521,524],{"class":343,"line":505},6,[341,507,508],{"class":495},"    databaseUrl",[341,510,499],{"class":445},[341,512,513],{"class":449}," process",[341,515,157],{"class":445},[341,517,518],{"class":449},"env",[341,520,157],{"class":445},[341,522,523],{"class":449},"DATABASE_URL",[341,525,526],{"class":445},",\n",[341,528,530,533,535],{"class":343,"line":529},7,[341,531,532],{"class":495},"    http",[341,534,499],{"class":445},[341,536,502],{"class":445},[341,538,540,543,545,547,549,551,553,556,559,561,563,566],{"class":343,"line":539},8,[341,541,542],{"class":495},"      storeCors",[341,544,499],{"class":445},[341,546,513],{"class":449},[341,548,157],{"class":445},[341,550,518],{"class":449},[341,552,157],{"class":445},[341,554,555],{"class":449},"STORE_CORS ",[341,557,558],{"class":445},"??",[341,560,459],{"class":445},[341,562,321],{"class":351},[341,564,565],{"class":445},"\"",[341,567,526],{"class":445},[341,569,571,574,576,578,580,582,584,587,589,591,593,595],{"class":343,"line":570},9,[341,572,573],{"class":495},"      adminCors",[341,575,499],{"class":445},[341,577,513],{"class":449},[341,579,157],{"class":445},[341,581,518],{"class":449},[341,583,157],{"class":445},[341,585,586],{"class":449},"ADMIN_CORS ",[341,588,558],{"class":445},[341,590,459],{"class":445},[341,592,315],{"class":351},[341,594,565],{"class":445},[341,596,526],{"class":445},[341,598,600,603,605,607,609,611,613,616,618,620,622,624],{"class":343,"line":599},10,[341,601,602],{"class":495},"      authCors",[341,604,499],{"class":445},[341,606,513],{"class":449},[341,608,157],{"class":445},[341,610,518],{"class":449},[341,612,157],{"class":445},[341,614,615],{"class":449},"AUTH_CORS ",[341,617,558],{"class":445},[341,619,459],{"class":445},[341,621,321],{"class":351},[341,623,565],{"class":445},[341,625,526],{"class":445},[341,627,629,632,634,636,638,640,642,645,647,649,652,654],{"class":343,"line":628},11,[341,630,631],{"class":495},"      jwtSecret",[341,633,499],{"class":445},[341,635,513],{"class":449},[341,637,157],{"class":445},[341,639,518],{"class":449},[341,641,157],{"class":445},[341,643,644],{"class":449},"JWT_SECRET ",[341,646,558],{"class":445},[341,648,459],{"class":445},[341,650,651],{"class":351},"supersecret",[341,653,565],{"class":445},[341,655,526],{"class":445},[341,657,659,662,664,666,668,670,672,675,677,679,681,683],{"class":343,"line":658},12,[341,660,661],{"class":495},"      cookieSecret",[341,663,499],{"class":445},[341,665,513],{"class":449},[341,667,157],{"class":445},[341,669,518],{"class":449},[341,671,157],{"class":445},[341,673,674],{"class":449},"COOKIE_SECRET ",[341,676,558],{"class":445},[341,678,459],{"class":445},[341,680,651],{"class":351},[341,682,565],{"class":445},[341,684,526],{"class":445},[341,686,688],{"class":343,"line":687},13,[341,689,690],{"class":445},"    },\n",[341,692,694],{"class":343,"line":693},14,[341,695,696],{"class":445},"  },\n",[341,698,700,703],{"class":343,"line":699},15,[341,701,702],{"class":445},"}",[341,704,705],{"class":449},")\n",[12,707,708],{},"Restart the server after making config changes.",[327,710,712],{"id":711},"_4-create-an-api-key-for-the-storefront","4. Create an API key for the storefront",[12,714,715,716,719,720,723],{},"In the admin dashboard, go to ",[16,717,718],{},"Settings → API Keys"," and create a new ",[16,721,722],{},"Publishable API Key",". Copy the key — you will need it in the Nuxt project.",[25,725,727],{"id":726},"setting-up-the-nuxt-4-storefront","Setting Up the Nuxt 4 Storefront",[327,729,731],{"id":730},"_1-create-a-nuxt-4-project","1. Create a Nuxt 4 project",[332,733,735],{"className":334,"code":734,"language":336,"meta":337,"style":337},"npx nuxi@latest init my-store-frontend\ncd my-store-frontend\n",[62,736,737,750],{"__ignoreMap":337},[341,738,739,741,744,747],{"class":343,"line":344},[341,740,348],{"class":347},[341,742,743],{"class":351}," nuxi@latest",[341,745,746],{"class":351}," init",[341,748,749],{"class":351}," my-store-frontend\n",[341,751,752,754],{"class":343,"line":358},[341,753,362],{"class":361},[341,755,749],{"class":351},[12,757,758,759,761],{},"Accept the defaults. The scaffold uses Nuxt 4 by default with the ",[62,760,111],{}," directory structure.",[327,763,765],{"id":764},"_2-install-the-medusa-js-sdk","2. Install the Medusa JS SDK",[332,767,769],{"className":334,"code":768,"language":336,"meta":337,"style":337},"npm install @medusajs\u002Fjs-sdk\n",[62,770,771],{"__ignoreMap":337},[341,772,773,775,778],{"class":343,"line":344},[341,774,392],{"class":347},[341,776,777],{"class":351}," install",[341,779,780],{"class":351}," @medusajs\u002Fjs-sdk\n",[12,782,783,784,787],{},"The ",[62,785,786],{},"@medusajs\u002Fjs-sdk"," package is the official TypeScript client for the Medusa Storefront API. It handles authentication headers, cart session management, and response typing automatically.",[327,789,791],{"id":790},"_3-configure-the-medusa-client","3. Configure the Medusa client",[12,793,794],{},"Create a composable that exports a shared Medusa SDK instance:",[332,796,798],{"className":426,"code":797,"language":428,"meta":337,"style":337},"\u002F\u002F app\u002Fcomposables\u002FuseMedusa.ts\nimport Medusa from \"@medusajs\u002Fjs-sdk\"\n\nconst medusa = new Medusa({\n  baseUrl: \"http:\u002F\u002Flocalhost:9000\",\n  debug: process.env.NODE_ENV === \"development\",\n  publishableKey: import.meta.env.VITE_MEDUSA_PUBLISHABLE_KEY,\n})\n\nexport function useMedusa() {\n  return medusa\n}\n",[62,799,800,805,821,825,847,862,892,918,924,928,943,951],{"__ignoreMap":337},[341,801,802],{"class":343,"line":344},[341,803,804],{"class":435},"\u002F\u002F app\u002Fcomposables\u002FuseMedusa.ts\n",[341,806,807,809,812,815,817,819],{"class":343,"line":358},[341,808,442],{"class":441},[341,810,811],{"class":449}," Medusa ",[341,813,814],{"class":441},"from",[341,816,459],{"class":445},[341,818,786],{"class":351},[341,820,465],{"class":445},[341,822,823],{"class":343,"line":468},[341,824,472],{"emptyLinePlaceholder":471},[341,826,827,831,834,837,840,843,845],{"class":343,"line":475},[341,828,830],{"class":829},"spNyl","const",[341,832,833],{"class":449}," medusa ",[341,835,836],{"class":445},"=",[341,838,839],{"class":445}," new",[341,841,842],{"class":361}," Medusa",[341,844,486],{"class":449},[341,846,489],{"class":445},[341,848,849,852,854,856,858,860],{"class":343,"line":492},[341,850,851],{"class":495},"  baseUrl",[341,853,499],{"class":445},[341,855,459],{"class":445},[341,857,315],{"class":351},[341,859,565],{"class":445},[341,861,526],{"class":445},[341,863,864,867,869,871,873,875,877,880,883,885,888,890],{"class":343,"line":505},[341,865,866],{"class":495},"  debug",[341,868,499],{"class":445},[341,870,513],{"class":449},[341,872,157],{"class":445},[341,874,518],{"class":449},[341,876,157],{"class":445},[341,878,879],{"class":449},"NODE_ENV ",[341,881,882],{"class":445},"===",[341,884,459],{"class":445},[341,886,887],{"class":351},"development",[341,889,565],{"class":445},[341,891,526],{"class":445},[341,893,894,897,899,902,904,907,909,911,913,916],{"class":343,"line":529},[341,895,896],{"class":495},"  publishableKey",[341,898,499],{"class":445},[341,900,901],{"class":441}," import",[341,903,157],{"class":445},[341,905,906],{"class":449},"meta",[341,908,157],{"class":445},[341,910,518],{"class":449},[341,912,157],{"class":445},[341,914,915],{"class":449},"VITE_MEDUSA_PUBLISHABLE_KEY",[341,917,526],{"class":445},[341,919,920,922],{"class":343,"line":539},[341,921,702],{"class":445},[341,923,705],{"class":449},[341,925,926],{"class":343,"line":570},[341,927,472],{"emptyLinePlaceholder":471},[341,929,930,932,935,938,941],{"class":343,"line":599},[341,931,478],{"class":441},[341,933,934],{"class":829}," function",[341,936,937],{"class":361}," useMedusa",[341,939,940],{"class":445},"()",[341,942,502],{"class":445},[341,944,945,948],{"class":343,"line":628},[341,946,947],{"class":441},"  return",[341,949,950],{"class":449}," medusa\n",[341,952,953],{"class":343,"line":658},[341,954,955],{"class":445},"}\n",[12,957,958,959,499],{},"Add your publishable key to ",[62,960,961],{},".env",[332,963,965],{"className":334,"code":964,"language":336,"meta":337,"style":337},"VITE_MEDUSA_PUBLISHABLE_KEY=pk_...your_key_here...\n",[62,966,967],{"__ignoreMap":337},[341,968,969,971,973],{"class":343,"line":344},[341,970,915],{"class":449},[341,972,836],{"class":445},[341,974,975],{"class":351},"pk_...your_key_here...\n",[327,977,979],{"id":978},"_4-set-the-region","4. Set the region",[12,981,982],{},"Medusa V2 requires all store requests to target a specific region. Fetch the available regions and store the active region ID in a composable:",[332,984,986],{"className":426,"code":985,"language":428,"meta":337,"style":337},"\u002F\u002F app\u002Fcomposables\u002FuseRegion.ts\nexport const useRegion = () => {\n  return useState\u003Cstring | null>(\"regionId\", () => null)\n}\n",[62,987,988,993,1013,1055],{"__ignoreMap":337},[341,989,990],{"class":343,"line":344},[341,991,992],{"class":435},"\u002F\u002F app\u002Fcomposables\u002FuseRegion.ts\n",[341,994,995,997,1000,1003,1005,1008,1011],{"class":343,"line":358},[341,996,478],{"class":441},[341,998,999],{"class":829}," const",[341,1001,1002],{"class":449}," useRegion ",[341,1004,836],{"class":445},[341,1006,1007],{"class":445}," ()",[341,1009,1010],{"class":829}," =>",[341,1012,502],{"class":445},[341,1014,1015,1017,1020,1023,1026,1029,1032,1035,1037,1039,1042,1044,1047,1049,1051,1053],{"class":343,"line":468},[341,1016,947],{"class":441},[341,1018,1019],{"class":361}," useState",[341,1021,1022],{"class":445},"\u003C",[341,1024,1025],{"class":347},"string",[341,1027,1028],{"class":445}," |",[341,1030,1031],{"class":347}," null",[341,1033,1034],{"class":445},">",[341,1036,486],{"class":495},[341,1038,565],{"class":445},[341,1040,1041],{"class":351},"regionId",[341,1043,565],{"class":445},[341,1045,1046],{"class":445},",",[341,1048,1007],{"class":445},[341,1050,1010],{"class":829},[341,1052,1031],{"class":445},[341,1054,705],{"class":495},[341,1056,1057],{"class":343,"line":475},[341,1058,955],{"class":445},[12,1060,1061,1062,1065],{},"Then resolve the region once in ",[62,1063,1064],{},"app.vue"," or a plugin:",[332,1067,1069],{"className":426,"code":1068,"language":428,"meta":337,"style":337},"\u002F\u002F app\u002Fplugins\u002Fregion.ts\nexport default defineNuxtPlugin(async () => {\n  const medusa = useMedusa()\n  const regionId = useRegion()\n\n  if (!regionId.value) {\n    const { regions } = await medusa.store.region.list()\n    regionId.value = regions[0]?.id ?? null\n  }\n})\n",[62,1070,1071,1076,1096,1112,1126,1130,1153,1189,1224,1229],{"__ignoreMap":337},[341,1072,1073],{"class":343,"line":344},[341,1074,1075],{"class":435},"\u002F\u002F app\u002Fplugins\u002Fregion.ts\n",[341,1077,1078,1080,1082,1085,1087,1090,1092,1094],{"class":343,"line":358},[341,1079,478],{"class":441},[341,1081,481],{"class":441},[341,1083,1084],{"class":361}," defineNuxtPlugin",[341,1086,486],{"class":449},[341,1088,1089],{"class":829},"async",[341,1091,1007],{"class":445},[341,1093,1010],{"class":829},[341,1095,502],{"class":445},[341,1097,1098,1101,1104,1107,1109],{"class":343,"line":468},[341,1099,1100],{"class":829},"  const",[341,1102,1103],{"class":449}," medusa",[341,1105,1106],{"class":445}," =",[341,1108,937],{"class":361},[341,1110,1111],{"class":495},"()\n",[341,1113,1114,1116,1119,1121,1124],{"class":343,"line":475},[341,1115,1100],{"class":829},[341,1117,1118],{"class":449}," regionId",[341,1120,1106],{"class":445},[341,1122,1123],{"class":361}," useRegion",[341,1125,1111],{"class":495},[341,1127,1128],{"class":343,"line":492},[341,1129,472],{"emptyLinePlaceholder":471},[341,1131,1132,1135,1138,1141,1143,1145,1148,1151],{"class":343,"line":505},[341,1133,1134],{"class":441},"  if",[341,1136,1137],{"class":495}," (",[341,1139,1140],{"class":445},"!",[341,1142,1041],{"class":449},[341,1144,157],{"class":445},[341,1146,1147],{"class":449},"value",[341,1149,1150],{"class":495},") ",[341,1152,489],{"class":445},[341,1154,1155,1158,1160,1163,1165,1167,1170,1172,1174,1177,1179,1182,1184,1187],{"class":343,"line":529},[341,1156,1157],{"class":829},"    const",[341,1159,446],{"class":445},[341,1161,1162],{"class":449}," regions",[341,1164,453],{"class":445},[341,1166,1106],{"class":445},[341,1168,1169],{"class":441}," await",[341,1171,1103],{"class":449},[341,1173,157],{"class":445},[341,1175,1176],{"class":449},"store",[341,1178,157],{"class":445},[341,1180,1181],{"class":449},"region",[341,1183,157],{"class":445},[341,1185,1186],{"class":361},"list",[341,1188,1111],{"class":495},[341,1190,1191,1194,1196,1198,1200,1202,1205,1209,1212,1215,1218,1221],{"class":343,"line":539},[341,1192,1193],{"class":449},"    regionId",[341,1195,157],{"class":445},[341,1197,1147],{"class":449},[341,1199,1106],{"class":445},[341,1201,1162],{"class":449},[341,1203,1204],{"class":495},"[",[341,1206,1208],{"class":1207},"sbssI","0",[341,1210,1211],{"class":495},"]",[341,1213,1214],{"class":445},"?.",[341,1216,1217],{"class":449},"id",[341,1219,1220],{"class":445}," ??",[341,1222,1223],{"class":445}," null\n",[341,1225,1226],{"class":343,"line":570},[341,1227,1228],{"class":445},"  }\n",[341,1230,1231,1233],{"class":343,"line":599},[341,1232,702],{"class":445},[341,1234,705],{"class":449},[25,1236,1238],{"id":1237},"fetching-products-and-building-pages","Fetching Products and Building Pages",[327,1240,1242],{"id":1241},"product-listing-page","Product listing page",[332,1244,1248],{"className":1245,"code":1246,"language":1247,"meta":337,"style":337},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C!-- app\u002Fpages\u002Fproducts\u002Findex.vue -->\n\u003Cscript setup lang=\"ts\">\nconst medusa = useMedusa()\nconst regionId = useRegion()\n\nconst { data } = await useAsyncData(\"products\", () =>\n  medusa.store.product.list({\n    region_id: regionId.value ?? undefined,\n    limit: 20,\n  })\n)\n\nconst products = computed(() => data.value?.products ?? [])\n\nuseSeoMeta({\n  title: \"All Products\",\n  description: \"Browse our full product catalog.\",\n})\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cdiv class=\"container mx-auto px-4 py-12\">\n    \u003Ch1 class=\"text-4xl font-bold mb-8\">Products\u003C\u002Fh1>\n    \u003Cdiv class=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6\">\n      \u003CNuxtLink\n        v-for=\"product in products\"\n        :key=\"product.id\"\n        :to=\"`\u002Fproducts\u002F${product.handle}`\"\n        class=\"group\"\n      >\n        \u003CNuxtImg\n          v-if=\"product.thumbnail\"\n          :src=\"product.thumbnail\"\n          :alt=\"product.title\"\n          class=\"w-full aspect-square object-cover rounded-lg mb-3\"\n        \u002F>\n        \u003Cp class=\"font-semibold group-hover:underline\">{{ product.title }}\u003C\u002Fp>\n      \u003C\u002FNuxtLink>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n","vue",[62,1249,1250,1255,1280,1292,1305,1309,1343,1365,1384,1396,1403,1407,1411,1446,1450,1458,1475,1492,1499,1509,1514,1524,1547,1578,1598,1607,1622,1637,1652,1667,1673,1682,1697,1711,1726,1741,1747,1776,1787,1797,1807],{"__ignoreMap":337},[341,1251,1252],{"class":343,"line":344},[341,1253,1254],{"class":435},"\u003C!-- app\u002Fpages\u002Fproducts\u002Findex.vue -->\n",[341,1256,1257,1259,1262,1265,1268,1270,1272,1275,1277],{"class":343,"line":358},[341,1258,1022],{"class":445},[341,1260,1261],{"class":495},"script",[341,1263,1264],{"class":829}," setup",[341,1266,1267],{"class":829}," lang",[341,1269,836],{"class":445},[341,1271,565],{"class":445},[341,1273,1274],{"class":351},"ts",[341,1276,565],{"class":445},[341,1278,1279],{"class":445},">\n",[341,1281,1282,1284,1286,1288,1290],{"class":343,"line":468},[341,1283,830],{"class":829},[341,1285,833],{"class":449},[341,1287,836],{"class":445},[341,1289,937],{"class":361},[341,1291,1111],{"class":449},[341,1293,1294,1296,1299,1301,1303],{"class":343,"line":475},[341,1295,830],{"class":829},[341,1297,1298],{"class":449}," regionId ",[341,1300,836],{"class":445},[341,1302,1123],{"class":361},[341,1304,1111],{"class":449},[341,1306,1307],{"class":343,"line":492},[341,1308,472],{"emptyLinePlaceholder":471},[341,1310,1311,1313,1315,1318,1320,1322,1324,1327,1329,1331,1334,1336,1338,1340],{"class":343,"line":505},[341,1312,830],{"class":829},[341,1314,446],{"class":445},[341,1316,1317],{"class":449}," data ",[341,1319,702],{"class":445},[341,1321,1106],{"class":445},[341,1323,1169],{"class":441},[341,1325,1326],{"class":361}," useAsyncData",[341,1328,486],{"class":449},[341,1330,565],{"class":445},[341,1332,1333],{"class":351},"products",[341,1335,565],{"class":445},[341,1337,1046],{"class":445},[341,1339,1007],{"class":445},[341,1341,1342],{"class":829}," =>\n",[341,1344,1345,1348,1350,1352,1354,1357,1359,1361,1363],{"class":343,"line":529},[341,1346,1347],{"class":449},"  medusa",[341,1349,157],{"class":445},[341,1351,1176],{"class":449},[341,1353,157],{"class":445},[341,1355,1356],{"class":449},"product",[341,1358,157],{"class":445},[341,1360,1186],{"class":361},[341,1362,486],{"class":449},[341,1364,489],{"class":445},[341,1366,1367,1370,1372,1374,1376,1379,1381],{"class":343,"line":539},[341,1368,1369],{"class":495},"    region_id",[341,1371,499],{"class":445},[341,1373,1118],{"class":449},[341,1375,157],{"class":445},[341,1377,1378],{"class":449},"value ",[341,1380,558],{"class":445},[341,1382,1383],{"class":445}," undefined,\n",[341,1385,1386,1389,1391,1394],{"class":343,"line":570},[341,1387,1388],{"class":495},"    limit",[341,1390,499],{"class":445},[341,1392,1393],{"class":1207}," 20",[341,1395,526],{"class":445},[341,1397,1398,1401],{"class":343,"line":599},[341,1399,1400],{"class":445},"  }",[341,1402,705],{"class":449},[341,1404,1405],{"class":343,"line":628},[341,1406,705],{"class":449},[341,1408,1409],{"class":343,"line":658},[341,1410,472],{"emptyLinePlaceholder":471},[341,1412,1413,1415,1418,1420,1423,1425,1427,1429,1432,1434,1436,1438,1441,1443],{"class":343,"line":687},[341,1414,830],{"class":829},[341,1416,1417],{"class":449}," products ",[341,1419,836],{"class":445},[341,1421,1422],{"class":361}," computed",[341,1424,486],{"class":449},[341,1426,940],{"class":445},[341,1428,1010],{"class":829},[341,1430,1431],{"class":449}," data",[341,1433,157],{"class":445},[341,1435,1147],{"class":449},[341,1437,1214],{"class":445},[341,1439,1440],{"class":449},"products ",[341,1442,558],{"class":445},[341,1444,1445],{"class":449}," [])\n",[341,1447,1448],{"class":343,"line":693},[341,1449,472],{"emptyLinePlaceholder":471},[341,1451,1452,1454,1456],{"class":343,"line":699},[341,1453,233],{"class":361},[341,1455,486],{"class":449},[341,1457,489],{"class":445},[341,1459,1461,1464,1466,1468,1471,1473],{"class":343,"line":1460},16,[341,1462,1463],{"class":495},"  title",[341,1465,499],{"class":445},[341,1467,459],{"class":445},[341,1469,1470],{"class":351},"All Products",[341,1472,565],{"class":445},[341,1474,526],{"class":445},[341,1476,1478,1481,1483,1485,1488,1490],{"class":343,"line":1477},17,[341,1479,1480],{"class":495},"  description",[341,1482,499],{"class":445},[341,1484,459],{"class":445},[341,1486,1487],{"class":351},"Browse our full product catalog.",[341,1489,565],{"class":445},[341,1491,526],{"class":445},[341,1493,1495,1497],{"class":343,"line":1494},18,[341,1496,702],{"class":445},[341,1498,705],{"class":449},[341,1500,1502,1505,1507],{"class":343,"line":1501},19,[341,1503,1504],{"class":445},"\u003C\u002F",[341,1506,1261],{"class":495},[341,1508,1279],{"class":445},[341,1510,1512],{"class":343,"line":1511},20,[341,1513,472],{"emptyLinePlaceholder":471},[341,1515,1517,1519,1522],{"class":343,"line":1516},21,[341,1518,1022],{"class":445},[341,1520,1521],{"class":495},"template",[341,1523,1279],{"class":445},[341,1525,1527,1530,1533,1536,1538,1540,1543,1545],{"class":343,"line":1526},22,[341,1528,1529],{"class":445},"  \u003C",[341,1531,1532],{"class":495},"div",[341,1534,1535],{"class":829}," class",[341,1537,836],{"class":445},[341,1539,565],{"class":445},[341,1541,1542],{"class":351},"container mx-auto px-4 py-12",[341,1544,565],{"class":445},[341,1546,1279],{"class":445},[341,1548,1550,1553,1556,1558,1560,1562,1565,1567,1569,1572,1574,1576],{"class":343,"line":1549},23,[341,1551,1552],{"class":445},"    \u003C",[341,1554,1555],{"class":495},"h1",[341,1557,1535],{"class":829},[341,1559,836],{"class":445},[341,1561,565],{"class":445},[341,1563,1564],{"class":351},"text-4xl font-bold mb-8",[341,1566,565],{"class":445},[341,1568,1034],{"class":445},[341,1570,1571],{"class":449},"Products",[341,1573,1504],{"class":445},[341,1575,1555],{"class":495},[341,1577,1279],{"class":445},[341,1579,1581,1583,1585,1587,1589,1591,1594,1596],{"class":343,"line":1580},24,[341,1582,1552],{"class":445},[341,1584,1532],{"class":495},[341,1586,1535],{"class":829},[341,1588,836],{"class":445},[341,1590,565],{"class":445},[341,1592,1593],{"class":351},"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6",[341,1595,565],{"class":445},[341,1597,1279],{"class":445},[341,1599,1601,1604],{"class":343,"line":1600},25,[341,1602,1603],{"class":445},"      \u003C",[341,1605,1606],{"class":495},"NuxtLink\n",[341,1608,1610,1613,1615,1617,1620],{"class":343,"line":1609},26,[341,1611,1612],{"class":829},"        v-for",[341,1614,836],{"class":445},[341,1616,565],{"class":445},[341,1618,1619],{"class":351},"product in products",[341,1621,465],{"class":445},[341,1623,1625,1628,1630,1632,1635],{"class":343,"line":1624},27,[341,1626,1627],{"class":829},"        :key",[341,1629,836],{"class":445},[341,1631,565],{"class":445},[341,1633,1634],{"class":351},"product.id",[341,1636,465],{"class":445},[341,1638,1640,1643,1645,1647,1650],{"class":343,"line":1639},28,[341,1641,1642],{"class":829},"        :to",[341,1644,836],{"class":445},[341,1646,565],{"class":445},[341,1648,1649],{"class":351},"`\u002Fproducts\u002F${product.handle}`",[341,1651,465],{"class":445},[341,1653,1655,1658,1660,1662,1665],{"class":343,"line":1654},29,[341,1656,1657],{"class":829},"        class",[341,1659,836],{"class":445},[341,1661,565],{"class":445},[341,1663,1664],{"class":351},"group",[341,1666,465],{"class":445},[341,1668,1670],{"class":343,"line":1669},30,[341,1671,1672],{"class":445},"      >\n",[341,1674,1676,1679],{"class":343,"line":1675},31,[341,1677,1678],{"class":445},"        \u003C",[341,1680,1681],{"class":495},"NuxtImg\n",[341,1683,1685,1688,1690,1692,1695],{"class":343,"line":1684},32,[341,1686,1687],{"class":829},"          v-if",[341,1689,836],{"class":445},[341,1691,565],{"class":445},[341,1693,1694],{"class":351},"product.thumbnail",[341,1696,465],{"class":445},[341,1698,1700,1703,1705,1707,1709],{"class":343,"line":1699},33,[341,1701,1702],{"class":829},"          :src",[341,1704,836],{"class":445},[341,1706,565],{"class":445},[341,1708,1694],{"class":351},[341,1710,465],{"class":445},[341,1712,1714,1717,1719,1721,1724],{"class":343,"line":1713},34,[341,1715,1716],{"class":829},"          :alt",[341,1718,836],{"class":445},[341,1720,565],{"class":445},[341,1722,1723],{"class":351},"product.title",[341,1725,465],{"class":445},[341,1727,1729,1732,1734,1736,1739],{"class":343,"line":1728},35,[341,1730,1731],{"class":829},"          class",[341,1733,836],{"class":445},[341,1735,565],{"class":445},[341,1737,1738],{"class":351},"w-full aspect-square object-cover rounded-lg mb-3",[341,1740,465],{"class":445},[341,1742,1744],{"class":343,"line":1743},36,[341,1745,1746],{"class":445},"        \u002F>\n",[341,1748,1750,1752,1754,1756,1758,1760,1763,1765,1767,1770,1772,1774],{"class":343,"line":1749},37,[341,1751,1678],{"class":445},[341,1753,12],{"class":495},[341,1755,1535],{"class":829},[341,1757,836],{"class":445},[341,1759,565],{"class":445},[341,1761,1762],{"class":351},"font-semibold group-hover:underline",[341,1764,565],{"class":445},[341,1766,1034],{"class":445},[341,1768,1769],{"class":449},"{{ product.title }}",[341,1771,1504],{"class":445},[341,1773,12],{"class":495},[341,1775,1279],{"class":445},[341,1777,1779,1782,1785],{"class":343,"line":1778},38,[341,1780,1781],{"class":445},"      \u003C\u002F",[341,1783,1784],{"class":495},"NuxtLink",[341,1786,1279],{"class":445},[341,1788,1790,1793,1795],{"class":343,"line":1789},39,[341,1791,1792],{"class":445},"    \u003C\u002F",[341,1794,1532],{"class":495},[341,1796,1279],{"class":445},[341,1798,1800,1803,1805],{"class":343,"line":1799},40,[341,1801,1802],{"class":445},"  \u003C\u002F",[341,1804,1532],{"class":495},[341,1806,1279],{"class":445},[341,1808,1810,1812,1814],{"class":343,"line":1809},41,[341,1811,1504],{"class":445},[341,1813,1521],{"class":495},[341,1815,1279],{"class":445},[327,1817,1819],{"id":1818},"product-detail-page","Product detail page",[332,1821,1823],{"className":1245,"code":1822,"language":1247,"meta":337,"style":337},"\u003C!-- app\u002Fpages\u002Fproducts\u002F[handle].vue -->\n\u003Cscript setup lang=\"ts\">\nconst route = useRoute()\nconst medusa = useMedusa()\nconst regionId = useRegion()\n\nconst { data } = await useAsyncData(`product-${route.params.handle}`, () =>\n  medusa.store.product.list({\n    handle: route.params.handle as string,\n    region_id: regionId.value ?? undefined,\n  })\n)\n\nconst product = computed(() => data.value?.products[0])\n\nif (!product.value) {\n  throw createError({ statusCode: 404, message: \"Product not found\" })\n}\n\nconst selectedVariantId = ref(product.value?.variants?.[0]?.id ?? null)\n\nuseSeoMeta({\n  title: product.value?.title,\n  description: product.value?.description ?? \"\",\n  ogImage: product.value?.thumbnail ?? undefined,\n})\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cdiv v-if=\"product\" class=\"container mx-auto px-4 py-12\">\n    \u003Cdiv class=\"grid grid-cols-1 md:grid-cols-2 gap-12\">\n      \u003CNuxtImg\n        v-if=\"product.thumbnail\"\n        :src=\"product.thumbnail\"\n        :alt=\"product.title\"\n        class=\"w-full rounded-lg\"\n      \u002F>\n      \u003Cdiv>\n        \u003Ch1 class=\"text-3xl font-bold mb-4\">{{ product.title }}\u003C\u002Fh1>\n        \u003Cp class=\"text-gray-600 mb-6\">{{ product.description }}\u003C\u002Fp>\n        \u003Cbutton\n          class=\"bg-black text-white px-8 py-3 rounded-lg hover:bg-gray-800 transition-colors\"\n          @click=\"addToCart\"\n        >\n          Add to cart\n        \u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n",[62,1824,1825,1830,1850,1864,1876,1888,1892,1941,1961,1988,2004,2010,2014,2018,2051,2055,2073,2112,2116,2120,2163,2167,2175,2195,2219,2241,2247,2255,2259,2267,2296,2315,2321,2334,2347,2360,2373,2378,2386,2413,2441,2448,2462,2477,2483,2489,2500,2509,2518,2527],{"__ignoreMap":337},[341,1826,1827],{"class":343,"line":344},[341,1828,1829],{"class":435},"\u003C!-- app\u002Fpages\u002Fproducts\u002F[handle].vue -->\n",[341,1831,1832,1834,1836,1838,1840,1842,1844,1846,1848],{"class":343,"line":358},[341,1833,1022],{"class":445},[341,1835,1261],{"class":495},[341,1837,1264],{"class":829},[341,1839,1267],{"class":829},[341,1841,836],{"class":445},[341,1843,565],{"class":445},[341,1845,1274],{"class":351},[341,1847,565],{"class":445},[341,1849,1279],{"class":445},[341,1851,1852,1854,1857,1859,1862],{"class":343,"line":468},[341,1853,830],{"class":829},[341,1855,1856],{"class":449}," route ",[341,1858,836],{"class":445},[341,1860,1861],{"class":361}," useRoute",[341,1863,1111],{"class":449},[341,1865,1866,1868,1870,1872,1874],{"class":343,"line":475},[341,1867,830],{"class":829},[341,1869,833],{"class":449},[341,1871,836],{"class":445},[341,1873,937],{"class":361},[341,1875,1111],{"class":449},[341,1877,1878,1880,1882,1884,1886],{"class":343,"line":492},[341,1879,830],{"class":829},[341,1881,1298],{"class":449},[341,1883,836],{"class":445},[341,1885,1123],{"class":361},[341,1887,1111],{"class":449},[341,1889,1890],{"class":343,"line":505},[341,1891,472],{"emptyLinePlaceholder":471},[341,1893,1894,1896,1898,1900,1902,1904,1906,1908,1910,1913,1916,1919,1922,1924,1927,1929,1932,1935,1937,1939],{"class":343,"line":529},[341,1895,830],{"class":829},[341,1897,446],{"class":445},[341,1899,1317],{"class":449},[341,1901,702],{"class":445},[341,1903,1106],{"class":445},[341,1905,1169],{"class":441},[341,1907,1326],{"class":361},[341,1909,486],{"class":449},[341,1911,1912],{"class":445},"`",[341,1914,1915],{"class":351},"product-",[341,1917,1918],{"class":445},"${",[341,1920,1921],{"class":449},"route",[341,1923,157],{"class":445},[341,1925,1926],{"class":449},"params",[341,1928,157],{"class":445},[341,1930,1931],{"class":449},"handle",[341,1933,1934],{"class":445},"}`",[341,1936,1046],{"class":445},[341,1938,1007],{"class":445},[341,1940,1342],{"class":829},[341,1942,1943,1945,1947,1949,1951,1953,1955,1957,1959],{"class":343,"line":539},[341,1944,1347],{"class":449},[341,1946,157],{"class":445},[341,1948,1176],{"class":449},[341,1950,157],{"class":445},[341,1952,1356],{"class":449},[341,1954,157],{"class":445},[341,1956,1186],{"class":361},[341,1958,486],{"class":449},[341,1960,489],{"class":445},[341,1962,1963,1966,1968,1971,1973,1975,1977,1980,1983,1986],{"class":343,"line":570},[341,1964,1965],{"class":495},"    handle",[341,1967,499],{"class":445},[341,1969,1970],{"class":449}," route",[341,1972,157],{"class":445},[341,1974,1926],{"class":449},[341,1976,157],{"class":445},[341,1978,1979],{"class":449},"handle ",[341,1981,1982],{"class":441},"as",[341,1984,1985],{"class":347}," string",[341,1987,526],{"class":445},[341,1989,1990,1992,1994,1996,1998,2000,2002],{"class":343,"line":599},[341,1991,1369],{"class":495},[341,1993,499],{"class":445},[341,1995,1118],{"class":449},[341,1997,157],{"class":445},[341,1999,1378],{"class":449},[341,2001,558],{"class":445},[341,2003,1383],{"class":445},[341,2005,2006,2008],{"class":343,"line":628},[341,2007,1400],{"class":445},[341,2009,705],{"class":449},[341,2011,2012],{"class":343,"line":658},[341,2013,705],{"class":449},[341,2015,2016],{"class":343,"line":687},[341,2017,472],{"emptyLinePlaceholder":471},[341,2019,2020,2022,2025,2027,2029,2031,2033,2035,2037,2039,2041,2043,2046,2048],{"class":343,"line":693},[341,2021,830],{"class":829},[341,2023,2024],{"class":449}," product ",[341,2026,836],{"class":445},[341,2028,1422],{"class":361},[341,2030,486],{"class":449},[341,2032,940],{"class":445},[341,2034,1010],{"class":829},[341,2036,1431],{"class":449},[341,2038,157],{"class":445},[341,2040,1147],{"class":449},[341,2042,1214],{"class":445},[341,2044,2045],{"class":449},"products[",[341,2047,1208],{"class":1207},[341,2049,2050],{"class":449},"])\n",[341,2052,2053],{"class":343,"line":699},[341,2054,472],{"emptyLinePlaceholder":471},[341,2056,2057,2060,2062,2064,2066,2068,2071],{"class":343,"line":1460},[341,2058,2059],{"class":441},"if",[341,2061,1137],{"class":449},[341,2063,1140],{"class":445},[341,2065,1356],{"class":449},[341,2067,157],{"class":445},[341,2069,2070],{"class":449},"value) ",[341,2072,489],{"class":445},[341,2074,2075,2078,2081,2083,2086,2089,2091,2094,2096,2099,2101,2103,2106,2108,2110],{"class":343,"line":1477},[341,2076,2077],{"class":441},"  throw",[341,2079,2080],{"class":361}," createError",[341,2082,486],{"class":495},[341,2084,2085],{"class":445},"{",[341,2087,2088],{"class":495}," statusCode",[341,2090,499],{"class":445},[341,2092,2093],{"class":1207}," 404",[341,2095,1046],{"class":445},[341,2097,2098],{"class":495}," message",[341,2100,499],{"class":445},[341,2102,459],{"class":445},[341,2104,2105],{"class":351},"Product not found",[341,2107,565],{"class":445},[341,2109,453],{"class":445},[341,2111,705],{"class":495},[341,2113,2114],{"class":343,"line":1494},[341,2115,955],{"class":445},[341,2117,2118],{"class":343,"line":1501},[341,2119,472],{"emptyLinePlaceholder":471},[341,2121,2122,2124,2127,2129,2132,2135,2137,2139,2141,2144,2146,2148,2150,2152,2154,2157,2159,2161],{"class":343,"line":1511},[341,2123,830],{"class":829},[341,2125,2126],{"class":449}," selectedVariantId ",[341,2128,836],{"class":445},[341,2130,2131],{"class":361}," ref",[341,2133,2134],{"class":449},"(product",[341,2136,157],{"class":445},[341,2138,1147],{"class":449},[341,2140,1214],{"class":445},[341,2142,2143],{"class":449},"variants",[341,2145,1214],{"class":445},[341,2147,1204],{"class":449},[341,2149,1208],{"class":1207},[341,2151,1211],{"class":449},[341,2153,1214],{"class":445},[341,2155,2156],{"class":449},"id ",[341,2158,558],{"class":445},[341,2160,1031],{"class":445},[341,2162,705],{"class":449},[341,2164,2165],{"class":343,"line":1516},[341,2166,472],{"emptyLinePlaceholder":471},[341,2168,2169,2171,2173],{"class":343,"line":1526},[341,2170,233],{"class":361},[341,2172,486],{"class":449},[341,2174,489],{"class":445},[341,2176,2177,2179,2181,2184,2186,2188,2190,2193],{"class":343,"line":1549},[341,2178,1463],{"class":495},[341,2180,499],{"class":445},[341,2182,2183],{"class":449}," product",[341,2185,157],{"class":445},[341,2187,1147],{"class":449},[341,2189,1214],{"class":445},[341,2191,2192],{"class":449},"title",[341,2194,526],{"class":445},[341,2196,2197,2199,2201,2203,2205,2207,2209,2212,2214,2217],{"class":343,"line":1580},[341,2198,1480],{"class":495},[341,2200,499],{"class":445},[341,2202,2183],{"class":449},[341,2204,157],{"class":445},[341,2206,1147],{"class":449},[341,2208,1214],{"class":445},[341,2210,2211],{"class":449},"description ",[341,2213,558],{"class":445},[341,2215,2216],{"class":445}," \"\"",[341,2218,526],{"class":445},[341,2220,2221,2224,2226,2228,2230,2232,2234,2237,2239],{"class":343,"line":1600},[341,2222,2223],{"class":495},"  ogImage",[341,2225,499],{"class":445},[341,2227,2183],{"class":449},[341,2229,157],{"class":445},[341,2231,1147],{"class":449},[341,2233,1214],{"class":445},[341,2235,2236],{"class":449},"thumbnail ",[341,2238,558],{"class":445},[341,2240,1383],{"class":445},[341,2242,2243,2245],{"class":343,"line":1609},[341,2244,702],{"class":445},[341,2246,705],{"class":449},[341,2248,2249,2251,2253],{"class":343,"line":1624},[341,2250,1504],{"class":445},[341,2252,1261],{"class":495},[341,2254,1279],{"class":445},[341,2256,2257],{"class":343,"line":1639},[341,2258,472],{"emptyLinePlaceholder":471},[341,2260,2261,2263,2265],{"class":343,"line":1654},[341,2262,1022],{"class":445},[341,2264,1521],{"class":495},[341,2266,1279],{"class":445},[341,2268,2269,2271,2273,2276,2278,2280,2282,2284,2286,2288,2290,2292,2294],{"class":343,"line":1669},[341,2270,1529],{"class":445},[341,2272,1532],{"class":495},[341,2274,2275],{"class":829}," v-if",[341,2277,836],{"class":445},[341,2279,565],{"class":445},[341,2281,1356],{"class":351},[341,2283,565],{"class":445},[341,2285,1535],{"class":829},[341,2287,836],{"class":445},[341,2289,565],{"class":445},[341,2291,1542],{"class":351},[341,2293,565],{"class":445},[341,2295,1279],{"class":445},[341,2297,2298,2300,2302,2304,2306,2308,2311,2313],{"class":343,"line":1675},[341,2299,1552],{"class":445},[341,2301,1532],{"class":495},[341,2303,1535],{"class":829},[341,2305,836],{"class":445},[341,2307,565],{"class":445},[341,2309,2310],{"class":351},"grid grid-cols-1 md:grid-cols-2 gap-12",[341,2312,565],{"class":445},[341,2314,1279],{"class":445},[341,2316,2317,2319],{"class":343,"line":1684},[341,2318,1603],{"class":445},[341,2320,1681],{"class":495},[341,2322,2323,2326,2328,2330,2332],{"class":343,"line":1699},[341,2324,2325],{"class":829},"        v-if",[341,2327,836],{"class":445},[341,2329,565],{"class":445},[341,2331,1694],{"class":351},[341,2333,465],{"class":445},[341,2335,2336,2339,2341,2343,2345],{"class":343,"line":1713},[341,2337,2338],{"class":829},"        :src",[341,2340,836],{"class":445},[341,2342,565],{"class":445},[341,2344,1694],{"class":351},[341,2346,465],{"class":445},[341,2348,2349,2352,2354,2356,2358],{"class":343,"line":1728},[341,2350,2351],{"class":829},"        :alt",[341,2353,836],{"class":445},[341,2355,565],{"class":445},[341,2357,1723],{"class":351},[341,2359,465],{"class":445},[341,2361,2362,2364,2366,2368,2371],{"class":343,"line":1743},[341,2363,1657],{"class":829},[341,2365,836],{"class":445},[341,2367,565],{"class":445},[341,2369,2370],{"class":351},"w-full rounded-lg",[341,2372,465],{"class":445},[341,2374,2375],{"class":343,"line":1749},[341,2376,2377],{"class":445},"      \u002F>\n",[341,2379,2380,2382,2384],{"class":343,"line":1778},[341,2381,1603],{"class":445},[341,2383,1532],{"class":495},[341,2385,1279],{"class":445},[341,2387,2388,2390,2392,2394,2396,2398,2401,2403,2405,2407,2409,2411],{"class":343,"line":1789},[341,2389,1678],{"class":445},[341,2391,1555],{"class":495},[341,2393,1535],{"class":829},[341,2395,836],{"class":445},[341,2397,565],{"class":445},[341,2399,2400],{"class":351},"text-3xl font-bold mb-4",[341,2402,565],{"class":445},[341,2404,1034],{"class":445},[341,2406,1769],{"class":449},[341,2408,1504],{"class":445},[341,2410,1555],{"class":495},[341,2412,1279],{"class":445},[341,2414,2415,2417,2419,2421,2423,2425,2428,2430,2432,2435,2437,2439],{"class":343,"line":1799},[341,2416,1678],{"class":445},[341,2418,12],{"class":495},[341,2420,1535],{"class":829},[341,2422,836],{"class":445},[341,2424,565],{"class":445},[341,2426,2427],{"class":351},"text-gray-600 mb-6",[341,2429,565],{"class":445},[341,2431,1034],{"class":445},[341,2433,2434],{"class":449},"{{ product.description }}",[341,2436,1504],{"class":445},[341,2438,12],{"class":495},[341,2440,1279],{"class":445},[341,2442,2443,2445],{"class":343,"line":1809},[341,2444,1678],{"class":445},[341,2446,2447],{"class":495},"button\n",[341,2449,2451,2453,2455,2457,2460],{"class":343,"line":2450},42,[341,2452,1731],{"class":829},[341,2454,836],{"class":445},[341,2456,565],{"class":445},[341,2458,2459],{"class":351},"bg-black text-white px-8 py-3 rounded-lg hover:bg-gray-800 transition-colors",[341,2461,465],{"class":445},[341,2463,2465,2468,2470,2472,2475],{"class":343,"line":2464},43,[341,2466,2467],{"class":829},"          @click",[341,2469,836],{"class":445},[341,2471,565],{"class":445},[341,2473,2474],{"class":351},"addToCart",[341,2476,465],{"class":445},[341,2478,2480],{"class":343,"line":2479},44,[341,2481,2482],{"class":445},"        >\n",[341,2484,2486],{"class":343,"line":2485},45,[341,2487,2488],{"class":449},"          Add to cart\n",[341,2490,2492,2495,2498],{"class":343,"line":2491},46,[341,2493,2494],{"class":445},"        \u003C\u002F",[341,2496,2497],{"class":495},"button",[341,2499,1279],{"class":445},[341,2501,2503,2505,2507],{"class":343,"line":2502},47,[341,2504,1781],{"class":445},[341,2506,1532],{"class":495},[341,2508,1279],{"class":445},[341,2510,2512,2514,2516],{"class":343,"line":2511},48,[341,2513,1792],{"class":445},[341,2515,1532],{"class":495},[341,2517,1279],{"class":445},[341,2519,2521,2523,2525],{"class":343,"line":2520},49,[341,2522,1802],{"class":445},[341,2524,1532],{"class":495},[341,2526,1279],{"class":445},[341,2528,2530,2532,2534],{"class":343,"line":2529},50,[341,2531,1504],{"class":445},[341,2533,1521],{"class":495},[341,2535,1279],{"class":445},[25,2537,2539],{"id":2538},"managing-the-cart","Managing the Cart",[12,2541,2542,2543,2546,2547,2550],{},"Medusa V2 uses a ",[16,2544,2545],{},"cart session"," identified by a cart ID that you store client-side (in a cookie or ",[62,2548,2549],{},"localStorage","). The SDK makes this straightforward.",[332,2552,2554],{"className":426,"code":2553,"language":428,"meta":337,"style":337},"\u002F\u002F app\u002Fcomposables\u002FuseCart.ts\nexport const useCartId = () => useState\u003Cstring | null>(\"cartId\", () => null)\n\nexport function useCart() {\n  const medusa = useMedusa()\n  const regionId = useRegion()\n  const cartId = useCartId()\n\n  async function getOrCreateCart() {\n    if (cartId.value) return cartId.value\n\n    const { cart } = await medusa.store.cart.create({\n      region_id: regionId.value ?? undefined,\n    })\n    cartId.value = cart.id\n    return cart.id\n  }\n\n  async function addItem(variantId: string, quantity = 1) {\n    const id = await getOrCreateCart()\n    await medusa.store.cart.createLineItem(id, {\n      variant_id: variantId,\n      quantity,\n    })\n  }\n\n  return { getOrCreateCart, addItem }\n}\n",[62,2555,2556,2561,2607,2611,2624,2636,2648,2662,2666,2680,2705,2709,2744,2761,2768,2786,2797,2801,2805,2838,2853,2881,2893,2900,2906,2910,2914,2929],{"__ignoreMap":337},[341,2557,2558],{"class":343,"line":344},[341,2559,2560],{"class":435},"\u002F\u002F app\u002Fcomposables\u002FuseCart.ts\n",[341,2562,2563,2565,2567,2570,2572,2574,2576,2578,2580,2582,2584,2586,2588,2590,2592,2595,2597,2599,2601,2603,2605],{"class":343,"line":358},[341,2564,478],{"class":441},[341,2566,999],{"class":829},[341,2568,2569],{"class":449}," useCartId ",[341,2571,836],{"class":445},[341,2573,1007],{"class":445},[341,2575,1010],{"class":829},[341,2577,1019],{"class":361},[341,2579,1022],{"class":445},[341,2581,1025],{"class":347},[341,2583,1028],{"class":445},[341,2585,1031],{"class":347},[341,2587,1034],{"class":445},[341,2589,486],{"class":449},[341,2591,565],{"class":445},[341,2593,2594],{"class":351},"cartId",[341,2596,565],{"class":445},[341,2598,1046],{"class":445},[341,2600,1007],{"class":445},[341,2602,1010],{"class":829},[341,2604,1031],{"class":445},[341,2606,705],{"class":449},[341,2608,2609],{"class":343,"line":468},[341,2610,472],{"emptyLinePlaceholder":471},[341,2612,2613,2615,2617,2620,2622],{"class":343,"line":475},[341,2614,478],{"class":441},[341,2616,934],{"class":829},[341,2618,2619],{"class":361}," useCart",[341,2621,940],{"class":445},[341,2623,502],{"class":445},[341,2625,2626,2628,2630,2632,2634],{"class":343,"line":492},[341,2627,1100],{"class":829},[341,2629,1103],{"class":449},[341,2631,1106],{"class":445},[341,2633,937],{"class":361},[341,2635,1111],{"class":495},[341,2637,2638,2640,2642,2644,2646],{"class":343,"line":505},[341,2639,1100],{"class":829},[341,2641,1118],{"class":449},[341,2643,1106],{"class":445},[341,2645,1123],{"class":361},[341,2647,1111],{"class":495},[341,2649,2650,2652,2655,2657,2660],{"class":343,"line":529},[341,2651,1100],{"class":829},[341,2653,2654],{"class":449}," cartId",[341,2656,1106],{"class":445},[341,2658,2659],{"class":361}," useCartId",[341,2661,1111],{"class":495},[341,2663,2664],{"class":343,"line":539},[341,2665,472],{"emptyLinePlaceholder":471},[341,2667,2668,2671,2673,2676,2678],{"class":343,"line":570},[341,2669,2670],{"class":829},"  async",[341,2672,934],{"class":829},[341,2674,2675],{"class":361}," getOrCreateCart",[341,2677,940],{"class":445},[341,2679,502],{"class":445},[341,2681,2682,2685,2687,2689,2691,2693,2695,2698,2700,2702],{"class":343,"line":599},[341,2683,2684],{"class":441},"    if",[341,2686,1137],{"class":495},[341,2688,2594],{"class":449},[341,2690,157],{"class":445},[341,2692,1147],{"class":449},[341,2694,1150],{"class":495},[341,2696,2697],{"class":441},"return",[341,2699,2654],{"class":449},[341,2701,157],{"class":445},[341,2703,2704],{"class":449},"value\n",[341,2706,2707],{"class":343,"line":628},[341,2708,472],{"emptyLinePlaceholder":471},[341,2710,2711,2713,2715,2718,2720,2722,2724,2726,2728,2730,2732,2735,2737,2740,2742],{"class":343,"line":658},[341,2712,1157],{"class":829},[341,2714,446],{"class":445},[341,2716,2717],{"class":449}," cart",[341,2719,453],{"class":445},[341,2721,1106],{"class":445},[341,2723,1169],{"class":441},[341,2725,1103],{"class":449},[341,2727,157],{"class":445},[341,2729,1176],{"class":449},[341,2731,157],{"class":445},[341,2733,2734],{"class":449},"cart",[341,2736,157],{"class":445},[341,2738,2739],{"class":361},"create",[341,2741,486],{"class":495},[341,2743,489],{"class":445},[341,2745,2746,2749,2751,2753,2755,2757,2759],{"class":343,"line":687},[341,2747,2748],{"class":495},"      region_id",[341,2750,499],{"class":445},[341,2752,1118],{"class":449},[341,2754,157],{"class":445},[341,2756,1147],{"class":449},[341,2758,1220],{"class":445},[341,2760,1383],{"class":445},[341,2762,2763,2766],{"class":343,"line":693},[341,2764,2765],{"class":445},"    }",[341,2767,705],{"class":495},[341,2769,2770,2773,2775,2777,2779,2781,2783],{"class":343,"line":699},[341,2771,2772],{"class":449},"    cartId",[341,2774,157],{"class":445},[341,2776,1147],{"class":449},[341,2778,1106],{"class":445},[341,2780,2717],{"class":449},[341,2782,157],{"class":445},[341,2784,2785],{"class":449},"id\n",[341,2787,2788,2791,2793,2795],{"class":343,"line":1460},[341,2789,2790],{"class":441},"    return",[341,2792,2717],{"class":449},[341,2794,157],{"class":445},[341,2796,2785],{"class":449},[341,2798,2799],{"class":343,"line":1477},[341,2800,1228],{"class":445},[341,2802,2803],{"class":343,"line":1494},[341,2804,472],{"emptyLinePlaceholder":471},[341,2806,2807,2809,2811,2814,2816,2820,2822,2824,2826,2829,2831,2834,2836],{"class":343,"line":1501},[341,2808,2670],{"class":829},[341,2810,934],{"class":829},[341,2812,2813],{"class":361}," addItem",[341,2815,486],{"class":445},[341,2817,2819],{"class":2818},"sHdIc","variantId",[341,2821,499],{"class":445},[341,2823,1985],{"class":347},[341,2825,1046],{"class":445},[341,2827,2828],{"class":2818}," quantity",[341,2830,1106],{"class":445},[341,2832,2833],{"class":1207}," 1",[341,2835,293],{"class":445},[341,2837,502],{"class":445},[341,2839,2840,2842,2845,2847,2849,2851],{"class":343,"line":1511},[341,2841,1157],{"class":829},[341,2843,2844],{"class":449}," id",[341,2846,1106],{"class":445},[341,2848,1169],{"class":441},[341,2850,2675],{"class":361},[341,2852,1111],{"class":495},[341,2854,2855,2858,2860,2862,2864,2866,2868,2870,2873,2875,2877,2879],{"class":343,"line":1516},[341,2856,2857],{"class":441},"    await",[341,2859,1103],{"class":449},[341,2861,157],{"class":445},[341,2863,1176],{"class":449},[341,2865,157],{"class":445},[341,2867,2734],{"class":449},[341,2869,157],{"class":445},[341,2871,2872],{"class":361},"createLineItem",[341,2874,486],{"class":495},[341,2876,1217],{"class":449},[341,2878,1046],{"class":445},[341,2880,502],{"class":445},[341,2882,2883,2886,2888,2891],{"class":343,"line":1526},[341,2884,2885],{"class":495},"      variant_id",[341,2887,499],{"class":445},[341,2889,2890],{"class":449}," variantId",[341,2892,526],{"class":445},[341,2894,2895,2898],{"class":343,"line":1549},[341,2896,2897],{"class":449},"      quantity",[341,2899,526],{"class":445},[341,2901,2902,2904],{"class":343,"line":1580},[341,2903,2765],{"class":445},[341,2905,705],{"class":495},[341,2907,2908],{"class":343,"line":1600},[341,2909,1228],{"class":445},[341,2911,2912],{"class":343,"line":1609},[341,2913,472],{"emptyLinePlaceholder":471},[341,2915,2916,2918,2920,2922,2924,2926],{"class":343,"line":1624},[341,2917,947],{"class":441},[341,2919,446],{"class":445},[341,2921,2675],{"class":449},[341,2923,1046],{"class":445},[341,2925,2813],{"class":449},[341,2927,2928],{"class":445}," }\n",[341,2930,2931],{"class":343,"line":1639},[341,2932,955],{"class":445},[12,2934,2935,2936,2939],{},"Use ",[62,2937,2938],{},"addItem"," from any product page to add variants to the cart.",[25,2941,2943],{"id":2942},"managing-products-and-orders-in-the-admin","Managing Products and Orders in the Admin",[327,2945,1571],{"id":1333},[12,2947,2948,2949,2951],{},"From the Medusa admin dashboard (",[62,2950,407],{},"):",[2953,2954,2955,2965,2971,2977],"ol",{},[43,2956,2957,2960,2961,2964],{},[16,2958,2959],{},"Create a product"," — go to ",[16,2962,2963],{},"Products → New product",". Fill in the title, description, and add variants (e.g., size S\u002FM\u002FL, color). Each variant gets a SKU, price per region, and optional inventory tracking.",[43,2966,2967,2970],{},[16,2968,2969],{},"Upload images"," — drag images directly in the product editor. Medusa stores them in your configured file storage (local filesystem in development, S3\u002FGCS in production).",[43,2972,2973,2976],{},[16,2974,2975],{},"Manage inventory"," — if you have the inventory module enabled, set stock levels per variant and per location.",[43,2978,2979,2982],{},[16,2980,2981],{},"Publish"," — toggle the product status from \"Draft\" to \"Published\" to make it visible via the Storefront API.",[327,2984,2986],{"id":2985},"orders","Orders",[12,2988,2989],{},"When a customer completes checkout:",[2953,2991,2992,2998,3005,3015],{},[43,2993,2994,2995,2997],{},"The order appears under ",[16,2996,2986],{}," in the admin.",[43,2999,3000,3001,3004],{},"You can ",[16,3002,3003],{},"fulfill"," items (mark as shipped, add tracking numbers).",[43,3006,3000,3007,3010,3011,3014],{},[16,3008,3009],{},"issue refunds"," or ",[16,3012,3013],{},"create returns"," directly from the order detail page.",[43,3016,3017],{},"The workflow engine handles multi-step operations (e.g., partial fulfillments, split shipments) without custom code.",[327,3019,3021],{"id":3020},"regions-and-currencies","Regions and Currencies",[12,3023,3024,3025,3028],{},"Under ",[16,3026,3027],{},"Settings → Regions",", configure which countries belong to each region and which currency and payment providers apply. This is important if you sell internationally — product prices are set per region, so you can localize pricing without duplicating products.",[25,3030,3032],{"id":3031},"deploying-to-production","Deploying to Production",[12,3034,3035],{},"When you are ready to deploy:",[12,3037,3038],{},[16,3039,3040],{},"Medusa backend:",[40,3042,3043,3046,3064],{},[43,3044,3045],{},"Use a managed PostgreSQL service (e.g., Supabase, Neon, Railway, AWS RDS).",[43,3047,3048,3049,117,3051,117,3054,117,3057,117,3060,3063],{},"Set ",[62,3050,523],{},[62,3052,3053],{},"JWT_SECRET",[62,3055,3056],{},"COOKIE_SECRET",[62,3058,3059],{},"STORE_CORS",[62,3061,3062],{},"ADMIN_CORS"," as environment variables.",[43,3065,3066],{},"Deploy the Node.js server to Railway, Render, Fly.io, or a VPS.",[12,3068,3069],{},[16,3070,3071],{},"Nuxt 4 storefront:",[40,3073,3074,3082,3093],{},[43,3075,3048,3076,19,3078,3081],{},[62,3077,915],{},[62,3079,3080],{},"NUXT_PUBLIC_MEDUSA_URL"," pointing to your production Medusa URL.",[43,3083,3084,3085,3088,3089,3092],{},"Run ",[62,3086,3087],{},"npm run generate"," for a fully static build or ",[62,3090,3091],{},"npm run build"," for SSR.",[43,3094,3095],{},"Deploy to Netlify, Vercel, or Cloudflare Pages.",[12,3097,3098,3099,3101],{},"Update ",[62,3100,3059],{}," in your Medusa config to include the production Nuxt domain.",[25,3103,3105],{"id":3104},"conclusion","Conclusion",[12,3107,3108],{},"MedusaJS V2 and Nuxt 4 give you a modern, fully typed, open-source e-commerce stack where each layer does exactly one job. Medusa owns the commerce logic — catalog, cart, checkout, order management — and exposes it through a clean Storefront API. Nuxt 4 owns the presentation layer, bringing SSR, SEO, and a great Vue developer experience. The two communicate over HTTP, which means you can scale, replace, or upgrade each side independently as your store grows.",[12,3110,3111],{},"If you want help architecting or building your storefront, the Epicmax team has deep experience with Vue 3 and Nuxt projects of all sizes.",[3113,3114],"blog-button",{"label":3115,"to":3116},"Talk to an engineer","https:\u002F\u002Fcalendar.app.google\u002FXwRzASZitZRSVLxq6",[3118,3119,3120],"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 pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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":337,"searchDepth":468,"depth":468,"links":3122},[3123,3124,3125,3126,3127,3133,3139,3143,3144,3149,3150],{"id":27,"depth":358,"text":28},{"id":95,"depth":358,"text":96},{"id":175,"depth":358,"text":176},{"id":277,"depth":358,"text":278},{"id":324,"depth":358,"text":325,"children":3128},[3129,3130,3131,3132],{"id":329,"depth":468,"text":330},{"id":381,"depth":468,"text":382},{"id":411,"depth":468,"text":412},{"id":711,"depth":468,"text":712},{"id":726,"depth":358,"text":727,"children":3134},[3135,3136,3137,3138],{"id":730,"depth":468,"text":731},{"id":764,"depth":468,"text":765},{"id":790,"depth":468,"text":791},{"id":978,"depth":468,"text":979},{"id":1237,"depth":358,"text":1238,"children":3140},[3141,3142],{"id":1241,"depth":468,"text":1242},{"id":1818,"depth":468,"text":1819},{"id":2538,"depth":358,"text":2539},{"id":2942,"depth":358,"text":2943,"children":3145},[3146,3147,3148],{"id":1333,"depth":468,"text":1571},{"id":2985,"depth":468,"text":2986},{"id":3020,"depth":468,"text":3021},{"id":3031,"depth":358,"text":3032},{"id":3104,"depth":358,"text":3105},"2026-06-03","Step-by-step guide to building a headless e-commerce store with MedusaJS V2 as the backend and Nuxt 4 as the storefront. Covers setup, API integration, and product management.","md",false,"\u002Fimages\u002Fblog\u002Fhow-to-build-an-e-commerce-store-with-medusajs-v2-and-nuxt-4\u002Fcover.png",{},"\u002Fblog\u002Fhow-to-create-medusa-js-with-nuxt-4",{"title":5,"description":3152},"blog\u002Fhow-to-create-medusa-js-with-nuxt-4",[22,3161,3162,3163],"MedusaJS","E-commerce","Vue.js","Gr3KJ0A2BoFKE2CVXhv9gs9iz1O-4GK712OqHG2u-es",1784559991785]