[{"data":1,"prerenderedAt":1826},["ShallowReactive",2],{"docs-navigation":3,"docs:\u002Fdocs\u002Fnuxt\u002Femail\u002Fi18n":618,"\u002Fdocs\u002Fnuxt\u002Femail\u002Fi18n:surround":1823},[4],{"title":5,"path":6,"children":7},"Docs","\u002Fdocs",[8,316,467],{"title":9,"path":10,"children":11},"Vite","\u002Fdocs\u002Fvite",[12,30,52,63,78,100,174,183,219,238,255,273,304],{"title":13,"path":14,"description":15,"icon":16,"children":17},"Getting Started","\u002Fdocs\u002Fvite\u002Fgetting-started","Learn the ViteHub package model, pick a starting path, and get to a working feature quickly.","i-lucide-rocket",[18,22,26],{"title":19,"path":20,"description":21},"Choose a Package","\u002Fdocs\u002Fvite\u002Fgetting-started\u002Fchoose-a-package","Pick the right ViteHub feature by the job you need to solve on the server.",{"title":23,"path":24,"description":25},"Entrypoints","\u002Fdocs\u002Fvite\u002Fgetting-started\u002Fentrypoints","Understand what belongs on the package root and what each framework-specific entrypoint owns.",{"title":27,"path":28,"description":29},"Architecture","\u002Fdocs\u002Fvite\u002Fgetting-started\u002Farchitecture","How ViteHub keeps one shared feature bridge across Vite, Nitro, and Nuxt.",{"title":31,"path":32,"description":33,"icon":34,"children":35},"Database","\u002Fdocs\u002Fvite\u002Fdatabase","Set up Drizzle or Prisma with `@vitehub\u002Fdb` and explicit ORM runtime imports.","i-lucide-database",[36,40,44,48],{"title":37,"path":38,"description":39},"Drizzle","\u002Fdocs\u002Fvite\u002Fdatabase\u002Fdrizzle","Configure Drizzle with `@vitehub\u002Fdb\u002Fdrizzle`, schema discovery, and committed SQL migrations.",{"title":41,"path":42,"description":43},"Prisma","\u002Fdocs\u002Fvite\u002Fdatabase\u002Fprisma","Configure Prisma with `@vitehub\u002Fdb\u002Fprisma`, generated client output, and native Prisma migrations.",{"title":45,"path":46,"description":47},"Migrations","\u002Fdocs\u002Fvite\u002Fdatabase\u002Fmigrations","Understand when ViteHub applies committed Drizzle and Prisma migrations during development and build.",{"title":49,"path":50,"description":51},"Platform notes","\u002Fdocs\u002Fvite\u002Fdatabase\u002Fplatform-notes","Review driver defaults, hosting behavior, and current runtime limits for Drizzle and Prisma.",{"title":53,"path":54,"description":55,"icon":56,"children":57},"KV","\u002Fdocs\u002Fvite\u002Fkv","Set up key-value storage with the same provider detection used by NuxtHub.","i-lucide-database-zap",[58],{"title":59,"path":60,"description":61,"icon":62},"Usage","\u002Fdocs\u002Fvite\u002Fkv\u002Fusage","Use the KV SDK to set, get, delete, clear, and list key-value pairs.","i-lucide-code",{"title":64,"path":65,"description":66,"icon":67,"children":68},"Blob","\u002Fdocs\u002Fvite\u002Fblob","Add blob storage for images, videos, documents, and other files with `@vitehub\u002Fblob`.","i-lucide-shapes",[69,74],{"title":70,"path":71,"description":72,"icon":73},"Upload","\u002Fdocs\u002Fvite\u002Fblob\u002Fupload","Upload files with validation, simple form handlers, and multipart flows using `@vitehub\u002Fblob`.","i-lucide-upload",{"title":75,"path":76,"description":77,"icon":62},"Blob SDK","\u002Fdocs\u002Fvite\u002Fblob\u002Fusage","Store, read, list, validate, serve, and delete files with `@vitehub\u002Fblob`.",{"title":79,"path":80,"description":81,"icon":82,"children":83},"Vector","\u002Fdocs\u002Fvite\u002Fvector","Add provider-agnostic named vector indexes with similarity search.","i-lucide-scan-search",[84,90,95],{"title":85,"path":86,"description":87,"icon":88,"group":89},"Cloudflare","\u002Fdocs\u002Fvite\u002Fvector\u002Fcloudflare","Configure @vitehub\u002Fvector against Cloudflare Vectorize.","i-simple-icons-cloudflare","Providers",{"title":91,"path":92,"description":93,"icon":94,"group":89},"Postgres","\u002Fdocs\u002Fvite\u002Fvector\u002Fpostgres","Configure @vitehub\u002Fvector against a pgvector-backed Postgres database.","i-simple-icons-postgresql",{"title":96,"path":97,"description":98,"icon":99,"group":89},"Upstash","\u002Fdocs\u002Fvite\u002Fvector\u002Fupstash","Configure @vitehub\u002Fvector against the Upstash Vector HTTP API.","i-simple-icons-upstash",{"title":101,"path":102,"description":103,"icon":104,"children":105},"Queue","\u002Fdocs\u002Fvite\u002Fqueue","Send background jobs through Platformatic, Cloudflare, Vercel, Netlify, Upstash QStash, or Memory.","i-lucide-layers",[106,110,114,118,123,127,131,135,139,144,147,152,157,161,166,170],{"title":107,"path":108,"description":109},"Quickstart","\u002Fdocs\u002Fvite\u002Fqueue\u002Fquickstart","Get a first queue working locally with the memory provider.",{"title":111,"path":112,"description":113},"Runtime API","\u002Fdocs\u002Fvite\u002Fqueue\u002Fruntime-api","Reference for defineQueue, runQueue, deferQueue, getQueue, and the core Queue types.",{"title":115,"path":116,"description":117},"When to use Queue","\u002Fdocs\u002Fvite\u002Fqueue\u002Fwhen-to-use","Decide when Queue is the right primitive compared with Workflow, Cron, or inline request handling.",{"title":119,"path":120,"description":121,"group":122},"Send a job","\u002Fdocs\u002Fvite\u002Fqueue\u002Fguides\u002Fsend-a-job","Enqueue payloads with runQueue and the common delivery patterns.","Guides",{"title":124,"path":125,"description":126,"group":122},"Defer after response","\u002Fdocs\u002Fvite\u002Fqueue\u002Fguides\u002Fdefer-after-response","Use deferQueue when the queue send should happen after the current response is committed.",{"title":128,"path":129,"description":130,"group":122},"Validate payloads","\u002Fdocs\u002Fvite\u002Fqueue\u002Fguides\u002Fvalidate-payloads","Validate payloads before enqueueing and before running queue handlers.",{"title":132,"path":133,"description":134,"group":122},"Local development","\u002Fdocs\u002Fvite\u002Fqueue\u002Fguides\u002Flocal-development","Use the memory provider for local development and understand how auto-selection works.",{"title":136,"path":137,"description":138,"group":122},"Native handles","\u002Fdocs\u002Fvite\u002Fqueue\u002Fguides\u002Fnative-handles","Know when to use getQueue and provider-native methods instead of the portable runtime API.",{"title":140,"path":141,"description":142,"icon":143,"group":89},"Platformatic","\u002Fdocs\u002Fvite\u002Fqueue\u002Fproviders\u002Fplatformatic","Configure Platformatic Job Queue with local or self-hosted workers.","i-brand-platformatic",{"title":85,"path":145,"description":146,"icon":88,"group":89},"\u002Fdocs\u002Fvite\u002Fqueue\u002Fproviders\u002Fcloudflare","Configure Cloudflare Queues and process named queues in Workers.",{"title":148,"path":149,"description":150,"icon":151,"group":89},"Vercel","\u002Fdocs\u002Fvite\u002Fqueue\u002Fproviders\u002Fvercel","Configure Vercel Queue and send named jobs through Vercel.","i-simple-icons-vercel",{"title":153,"path":154,"description":155,"icon":156,"group":89},"Netlify","\u002Fdocs\u002Fvite\u002Fqueue\u002Fproviders\u002Fnetlify","Configure Netlify Async Workloads and run named queues on Netlify.","i-simple-icons-netlify",{"title":158,"path":159,"description":160,"icon":99,"group":89},"Upstash QStash","\u002Fdocs\u002Fvite\u002Fqueue\u002Fproviders\u002Fupstash-qstash","Configure Upstash QStash for queues and signed callback delivery.",{"title":162,"path":163,"description":164,"icon":165,"group":89},"Memory","\u002Fdocs\u002Fvite\u002Fqueue\u002Fproviders\u002Fmemory","Process queue jobs in-memory for local development and testing.","i-lucide-memory-stick",{"title":167,"path":168,"description":169},"Troubleshooting","\u002Fdocs\u002Fvite\u002Fqueue\u002Ftroubleshooting","Diagnose common Queue setup and runtime problems across local and hosted providers.",{"title":171,"path":172,"description":173},"Playground","\u002Fdocs\u002Fvite\u002Fqueue\u002Fplayground","Explore the existing Queue playground app and the files that show the end-to-end runtime flow.",{"title":175,"path":176,"description":177,"icon":178,"children":179},"Cache","\u002Fdocs\u002Fvite\u002Fcache","Configure Nitro cache storage for local development, Vercel, and Cloudflare deployments.","i-lucide-timer-reset",[180],{"title":59,"path":181,"description":182,"icon":62},"\u002Fdocs\u002Fvite\u002Fcache\u002Fusage","Cache routes and server functions with practical invalidation examples.",{"title":184,"path":185,"description":186,"icon":187,"children":188},"Email","\u002Fdocs\u002Fvite\u002Femail","Render markdown email files and send them through Resend, SendGrid, or Postmark.","i-lucide-mail",[189,194,199,204,209,214],{"title":190,"path":191,"description":192,"icon":193},"Frontmatter","\u002Fdocs\u002Fvite\u002Femail\u002Ffrontmatter","Define subject lines, recipients, metadata, and delivery defaults directly in the Markdown email file.","i-lucide-file-text",{"title":195,"path":196,"description":197,"icon":198},"Input Schemas","\u002Fdocs\u002Fvite\u002Femail\u002Finput-schemas","Add an embedded schema block when you want email input validation and stronger TypeScript inference.","i-brand-standard-schema",{"title":200,"path":201,"description":202,"icon":203},"i18n","\u002Fdocs\u002Fvite\u002Femail\u002Fi18n","Localize Markdown emails with locale-specific template files and ICU message formatting.","i-lucide-languages",{"title":205,"path":206,"description":207,"icon":208,"group":89},"Resend","\u002Fdocs\u002Fvite\u002Femail\u002Fresend","Configure Resend for transactional delivery and native batch sending.","i-provider-resend",{"title":210,"path":211,"description":212,"icon":213,"group":89},"SendGrid","\u002Fdocs\u002Fvite\u002Femail\u002Fsendgrid","Configure SendGrid when you need advanced delivery controls and template support.","i-provider-sendgrid",{"title":215,"path":216,"description":217,"icon":218,"group":89},"Postmark","\u002Fdocs\u002Fvite\u002Femail\u002Fpostmark","Configure Postmark for transactional streams and template-first sends.","i-provider-postmark",{"title":220,"path":221,"description":222,"icon":223,"children":224},"Workflow","\u002Fdocs\u002Fvite\u002Fworkflow","Run durable workflows on Cloudflare, Netlify, Vercel, or OpenWorkflow.","i-lucide-workflow",[225,228,231,235],{"title":85,"path":226,"description":227,"icon":88},"\u002Fdocs\u002Fvite\u002Fworkflow\u002Fcloudflare","Configure Cloudflare Workflows and inspect runs from your app.",{"title":148,"path":229,"description":230,"icon":151},"\u002Fdocs\u002Fvite\u002Fworkflow\u002Fvercel","Configure Vercel Workflow and run durable workflows on Vercel.",{"title":232,"path":233,"description":234,"icon":223},"OpenWorkflow","\u002Fdocs\u002Fvite\u002Fworkflow\u002Fopenworkflow","Connect OpenWorkflow and use your own workflow backend behind the ViteHub API.",{"title":153,"path":236,"description":237,"icon":156},"\u002Fdocs\u002Fvite\u002Fworkflow\u002Fnetlify","Configure Netlify Async Workloads and run discovered workflows on Netlify.",{"title":239,"path":240,"description":241,"icon":242,"children":243},"Cron","\u002Fdocs\u002Fvite\u002Fcron","Schedule crons with Node, Cloudflare, or Vercel.","i-lucide-list-check",[244,249,252],{"title":245,"path":246,"description":247,"icon":248},"Node","\u002Fdocs\u002Fvite\u002Fcron\u002Fnode","Configure in-process scheduling for local crons and lightweight cron tasks.","i-simple-icons-nodedotjs",{"title":85,"path":250,"description":251,"icon":88},"\u002Fdocs\u002Fvite\u002Fcron\u002Fcloudflare","Configure Cloudflare-triggered schedules for your crons.",{"title":148,"path":253,"description":254,"icon":151},"\u002Fdocs\u002Fvite\u002Fcron\u002Fvercel","Generate Vercel cron config from discovered crons.",{"title":256,"path":257,"description":258,"icon":259,"children":260},"Browser","\u002Fdocs\u002Fvite\u002Fbrowser","Run named browser automations against Playwright, Browserbase, or Cloudflare Browser Rendering.","i-lucide-monitor-play",[261,264,269],{"title":85,"path":262,"description":263,"icon":88},"\u002Fdocs\u002Fvite\u002Fbrowser\u002Fcloudflare","Configure Cloudflare Browser Rendering through the official `cloudflare` package.",{"title":265,"path":266,"description":267,"icon":268},"Browserbase","\u002Fdocs\u002Fvite\u002Fbrowser\u002Fbrowserbase","Configure Browserbase for managed CDP sessions and session-aware browser calls.","i-lucide-orbit",{"title":270,"path":271,"description":272,"icon":259},"Playwright","\u002Fdocs\u002Fvite\u002Fbrowser\u002Fplaywright","Configure remote Playwright browser sessions over a WebSocket endpoint.",{"title":274,"path":275,"description":276,"icon":277,"children":278},"Sandbox","\u002Fdocs\u002Fvite\u002Fsandbox","Run isolated sandboxes on Cloudflare Durable Objects, Cloudflare Dynamic Workers, Vercel, Deno, Docker, or locally.","i-lucide-box",[279,282,286,289,294,299],{"title":85,"path":280,"description":281,"icon":88},"\u002Fdocs\u002Fvite\u002Fsandbox\u002Fcloudflare","Configure Cloudflare Sandbox on top of Durable Objects.",{"title":283,"path":284,"description":285,"icon":88},"Cloudflare Dynamic","\u002Fdocs\u002Fvite\u002Fsandbox\u002Fcloudflare-dynamic","Configure Cloudflare Dynamic Workers with the Worker Loader API.",{"title":148,"path":287,"description":288,"icon":151},"\u002Fdocs\u002Fvite\u002Fsandbox\u002Fvercel","Configure Vercel Sandbox and run isolated sandboxes on Vercel.",{"title":290,"path":291,"description":292,"icon":293},"Deno","\u002Fdocs\u002Fvite\u002Fsandbox\u002Fdeno","Configure Deno Sandbox and run isolated sandboxes on Deno Deploy.","i-simple-icons-deno",{"title":295,"path":296,"description":297,"icon":298},"Docker","\u002Fdocs\u002Fvite\u002Fsandbox\u002Fdocker","Configure Docker Sandbox and run isolated sandboxes locally.","i-simple-icons-docker",{"title":300,"path":301,"description":302,"icon":303},"Local","\u002Fdocs\u002Fvite\u002Fsandbox\u002Flocal","Run sandboxes locally with OS-level isolation using platform primitives.","i-lucide-monitor",{"title":305,"path":306,"description":307,"icon":308,"children":309},"Analytics","\u002Fdocs\u002Fvite\u002Fanalytics","Integrate explicit analytics backends with a small shared runtime API.","i-lucide-megaphone",[310,313],{"title":148,"path":311,"description":312,"icon":151},"\u002Fdocs\u002Fvite\u002Fanalytics\u002Fvercel","Configure Vercel Analytics through the official SDK and keep a small portable runtime API.",{"title":85,"path":314,"description":315,"icon":88},"\u002Fdocs\u002Fvite\u002Fanalytics\u002Fcloudflare","Configure first-party analytics ingestion on Cloudflare and query a semantic event shape on top of Analytics Engine slots.",{"title":317,"path":318,"children":319},"Nitro","\u002Fdocs\u002Fnitro",[320,329,340,345,352,361,396,401,416,427,436,445,460],{"title":13,"path":321,"description":15,"icon":16,"children":322},"\u002Fdocs\u002Fnitro\u002Fgetting-started",[323,325,327],{"title":19,"path":324,"description":21},"\u002Fdocs\u002Fnitro\u002Fgetting-started\u002Fchoose-a-package",{"title":23,"path":326,"description":25},"\u002Fdocs\u002Fnitro\u002Fgetting-started\u002Fentrypoints",{"title":27,"path":328,"description":29},"\u002Fdocs\u002Fnitro\u002Fgetting-started\u002Farchitecture",{"title":31,"path":330,"description":33,"icon":34,"children":331},"\u002Fdocs\u002Fnitro\u002Fdatabase",[332,334,336,338],{"title":37,"path":333,"description":39},"\u002Fdocs\u002Fnitro\u002Fdatabase\u002Fdrizzle",{"title":41,"path":335,"description":43},"\u002Fdocs\u002Fnitro\u002Fdatabase\u002Fprisma",{"title":45,"path":337,"description":47},"\u002Fdocs\u002Fnitro\u002Fdatabase\u002Fmigrations",{"title":49,"path":339,"description":51},"\u002Fdocs\u002Fnitro\u002Fdatabase\u002Fplatform-notes",{"title":53,"path":341,"description":55,"icon":56,"children":342},"\u002Fdocs\u002Fnitro\u002Fkv",[343],{"title":59,"path":344,"description":61,"icon":62},"\u002Fdocs\u002Fnitro\u002Fkv\u002Fusage",{"title":64,"path":346,"description":66,"icon":67,"children":347},"\u002Fdocs\u002Fnitro\u002Fblob",[348,350],{"title":70,"path":349,"description":72,"icon":73},"\u002Fdocs\u002Fnitro\u002Fblob\u002Fupload",{"title":75,"path":351,"description":77,"icon":62},"\u002Fdocs\u002Fnitro\u002Fblob\u002Fusage",{"title":79,"path":353,"description":81,"icon":82,"children":354},"\u002Fdocs\u002Fnitro\u002Fvector",[355,357,359],{"title":85,"path":356,"description":87,"icon":88,"group":89},"\u002Fdocs\u002Fnitro\u002Fvector\u002Fcloudflare",{"title":91,"path":358,"description":93,"icon":94,"group":89},"\u002Fdocs\u002Fnitro\u002Fvector\u002Fpostgres",{"title":96,"path":360,"description":98,"icon":99,"group":89},"\u002Fdocs\u002Fnitro\u002Fvector\u002Fupstash",{"title":101,"path":362,"description":103,"icon":104,"children":363},"\u002Fdocs\u002Fnitro\u002Fqueue",[364,366,368,370,372,374,376,378,380,382,384,386,388,390,392,394],{"title":107,"path":365,"description":109},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fquickstart",{"title":111,"path":367,"description":113},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fruntime-api",{"title":115,"path":369,"description":117},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fwhen-to-use",{"title":119,"path":371,"description":121,"group":122},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fguides\u002Fsend-a-job",{"title":124,"path":373,"description":126,"group":122},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fguides\u002Fdefer-after-response",{"title":128,"path":375,"description":130,"group":122},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fguides\u002Fvalidate-payloads",{"title":132,"path":377,"description":134,"group":122},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fguides\u002Flocal-development",{"title":136,"path":379,"description":138,"group":122},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fguides\u002Fnative-handles",{"title":140,"path":381,"description":142,"icon":143,"group":89},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fproviders\u002Fplatformatic",{"title":85,"path":383,"description":146,"icon":88,"group":89},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fproviders\u002Fcloudflare",{"title":148,"path":385,"description":150,"icon":151,"group":89},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fproviders\u002Fvercel",{"title":153,"path":387,"description":155,"icon":156,"group":89},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fproviders\u002Fnetlify",{"title":158,"path":389,"description":160,"icon":99,"group":89},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fproviders\u002Fupstash-qstash",{"title":162,"path":391,"description":164,"icon":165,"group":89},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fproviders\u002Fmemory",{"title":167,"path":393,"description":169},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Ftroubleshooting",{"title":171,"path":395,"description":173},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fplayground",{"title":175,"path":397,"description":177,"icon":178,"children":398},"\u002Fdocs\u002Fnitro\u002Fcache",[399],{"title":59,"path":400,"description":182,"icon":62},"\u002Fdocs\u002Fnitro\u002Fcache\u002Fusage",{"title":184,"path":402,"description":186,"icon":187,"children":403},"\u002Fdocs\u002Fnitro\u002Femail",[404,406,408,410,412,414],{"title":190,"path":405,"description":192,"icon":193},"\u002Fdocs\u002Fnitro\u002Femail\u002Ffrontmatter",{"title":195,"path":407,"description":197,"icon":198},"\u002Fdocs\u002Fnitro\u002Femail\u002Finput-schemas",{"title":200,"path":409,"description":202,"icon":203},"\u002Fdocs\u002Fnitro\u002Femail\u002Fi18n",{"title":205,"path":411,"description":207,"icon":208,"group":89},"\u002Fdocs\u002Fnitro\u002Femail\u002Fresend",{"title":210,"path":413,"description":212,"icon":213,"group":89},"\u002Fdocs\u002Fnitro\u002Femail\u002Fsendgrid",{"title":215,"path":415,"description":217,"icon":218,"group":89},"\u002Fdocs\u002Fnitro\u002Femail\u002Fpostmark",{"title":220,"path":417,"description":222,"icon":223,"children":418},"\u002Fdocs\u002Fnitro\u002Fworkflow",[419,421,423,425],{"title":85,"path":420,"description":227,"icon":88},"\u002Fdocs\u002Fnitro\u002Fworkflow\u002Fcloudflare",{"title":148,"path":422,"description":230,"icon":151},"\u002Fdocs\u002Fnitro\u002Fworkflow\u002Fvercel",{"title":232,"path":424,"description":234,"icon":223},"\u002Fdocs\u002Fnitro\u002Fworkflow\u002Fopenworkflow",{"title":153,"path":426,"description":237,"icon":156},"\u002Fdocs\u002Fnitro\u002Fworkflow\u002Fnetlify",{"title":239,"path":428,"description":241,"icon":242,"children":429},"\u002Fdocs\u002Fnitro\u002Fcron",[430,432,434],{"title":245,"path":431,"description":247,"icon":248},"\u002Fdocs\u002Fnitro\u002Fcron\u002Fnode",{"title":85,"path":433,"description":251,"icon":88},"\u002Fdocs\u002Fnitro\u002Fcron\u002Fcloudflare",{"title":148,"path":435,"description":254,"icon":151},"\u002Fdocs\u002Fnitro\u002Fcron\u002Fvercel",{"title":256,"path":437,"description":258,"icon":259,"children":438},"\u002Fdocs\u002Fnitro\u002Fbrowser",[439,441,443],{"title":85,"path":440,"description":263,"icon":88},"\u002Fdocs\u002Fnitro\u002Fbrowser\u002Fcloudflare",{"title":265,"path":442,"description":267,"icon":268},"\u002Fdocs\u002Fnitro\u002Fbrowser\u002Fbrowserbase",{"title":270,"path":444,"description":272,"icon":259},"\u002Fdocs\u002Fnitro\u002Fbrowser\u002Fplaywright",{"title":274,"path":446,"description":276,"icon":277,"children":447},"\u002Fdocs\u002Fnitro\u002Fsandbox",[448,450,452,454,456,458],{"title":85,"path":449,"description":281,"icon":88},"\u002Fdocs\u002Fnitro\u002Fsandbox\u002Fcloudflare",{"title":283,"path":451,"description":285,"icon":88},"\u002Fdocs\u002Fnitro\u002Fsandbox\u002Fcloudflare-dynamic",{"title":148,"path":453,"description":288,"icon":151},"\u002Fdocs\u002Fnitro\u002Fsandbox\u002Fvercel",{"title":290,"path":455,"description":292,"icon":293},"\u002Fdocs\u002Fnitro\u002Fsandbox\u002Fdeno",{"title":295,"path":457,"description":297,"icon":298},"\u002Fdocs\u002Fnitro\u002Fsandbox\u002Fdocker",{"title":300,"path":459,"description":302,"icon":303},"\u002Fdocs\u002Fnitro\u002Fsandbox\u002Flocal",{"title":305,"path":461,"description":307,"icon":308,"children":462},"\u002Fdocs\u002Fnitro\u002Fanalytics",[463,465],{"title":148,"path":464,"description":312,"icon":151},"\u002Fdocs\u002Fnitro\u002Fanalytics\u002Fvercel",{"title":85,"path":466,"description":315,"icon":88},"\u002Fdocs\u002Fnitro\u002Fanalytics\u002Fcloudflare",{"title":468,"path":469,"children":470},"Nuxt","\u002Fdocs\u002Fnuxt",[471,480,491,496,503,512,547,552,567,578,587,596,611],{"title":13,"path":472,"description":15,"icon":16,"children":473},"\u002Fdocs\u002Fnuxt\u002Fgetting-started",[474,476,478],{"title":19,"path":475,"description":21},"\u002Fdocs\u002Fnuxt\u002Fgetting-started\u002Fchoose-a-package",{"title":23,"path":477,"description":25},"\u002Fdocs\u002Fnuxt\u002Fgetting-started\u002Fentrypoints",{"title":27,"path":479,"description":29},"\u002Fdocs\u002Fnuxt\u002Fgetting-started\u002Farchitecture",{"title":31,"path":481,"description":33,"icon":34,"children":482},"\u002Fdocs\u002Fnuxt\u002Fdatabase",[483,485,487,489],{"title":37,"path":484,"description":39},"\u002Fdocs\u002Fnuxt\u002Fdatabase\u002Fdrizzle",{"title":41,"path":486,"description":43},"\u002Fdocs\u002Fnuxt\u002Fdatabase\u002Fprisma",{"title":45,"path":488,"description":47},"\u002Fdocs\u002Fnuxt\u002Fdatabase\u002Fmigrations",{"title":49,"path":490,"description":51},"\u002Fdocs\u002Fnuxt\u002Fdatabase\u002Fplatform-notes",{"title":53,"path":492,"description":55,"icon":56,"children":493},"\u002Fdocs\u002Fnuxt\u002Fkv",[494],{"title":59,"path":495,"description":61,"icon":62},"\u002Fdocs\u002Fnuxt\u002Fkv\u002Fusage",{"title":64,"path":497,"description":66,"icon":67,"children":498},"\u002Fdocs\u002Fnuxt\u002Fblob",[499,501],{"title":70,"path":500,"description":72,"icon":73},"\u002Fdocs\u002Fnuxt\u002Fblob\u002Fupload",{"title":75,"path":502,"description":77,"icon":62},"\u002Fdocs\u002Fnuxt\u002Fblob\u002Fusage",{"title":79,"path":504,"description":81,"icon":82,"children":505},"\u002Fdocs\u002Fnuxt\u002Fvector",[506,508,510],{"title":85,"path":507,"description":87,"icon":88,"group":89},"\u002Fdocs\u002Fnuxt\u002Fvector\u002Fcloudflare",{"title":91,"path":509,"description":93,"icon":94,"group":89},"\u002Fdocs\u002Fnuxt\u002Fvector\u002Fpostgres",{"title":96,"path":511,"description":98,"icon":99,"group":89},"\u002Fdocs\u002Fnuxt\u002Fvector\u002Fupstash",{"title":101,"path":513,"description":103,"icon":104,"children":514},"\u002Fdocs\u002Fnuxt\u002Fqueue",[515,517,519,521,523,525,527,529,531,533,535,537,539,541,543,545],{"title":107,"path":516,"description":109},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fquickstart",{"title":111,"path":518,"description":113},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fruntime-api",{"title":115,"path":520,"description":117},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fwhen-to-use",{"title":119,"path":522,"description":121,"group":122},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fguides\u002Fsend-a-job",{"title":124,"path":524,"description":126,"group":122},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fguides\u002Fdefer-after-response",{"title":128,"path":526,"description":130,"group":122},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fguides\u002Fvalidate-payloads",{"title":132,"path":528,"description":134,"group":122},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fguides\u002Flocal-development",{"title":136,"path":530,"description":138,"group":122},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fguides\u002Fnative-handles",{"title":140,"path":532,"description":142,"icon":143,"group":89},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fproviders\u002Fplatformatic",{"title":85,"path":534,"description":146,"icon":88,"group":89},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fproviders\u002Fcloudflare",{"title":148,"path":536,"description":150,"icon":151,"group":89},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fproviders\u002Fvercel",{"title":153,"path":538,"description":155,"icon":156,"group":89},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fproviders\u002Fnetlify",{"title":158,"path":540,"description":160,"icon":99,"group":89},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fproviders\u002Fupstash-qstash",{"title":162,"path":542,"description":164,"icon":165,"group":89},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fproviders\u002Fmemory",{"title":167,"path":544,"description":169},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Ftroubleshooting",{"title":171,"path":546,"description":173},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fplayground",{"title":175,"path":548,"description":177,"icon":178,"children":549},"\u002Fdocs\u002Fnuxt\u002Fcache",[550],{"title":59,"path":551,"description":182,"icon":62},"\u002Fdocs\u002Fnuxt\u002Fcache\u002Fusage",{"title":184,"path":553,"description":186,"icon":187,"children":554},"\u002Fdocs\u002Fnuxt\u002Femail",[555,557,559,561,563,565],{"title":190,"path":556,"description":192,"icon":193},"\u002Fdocs\u002Fnuxt\u002Femail\u002Ffrontmatter",{"title":195,"path":558,"description":197,"icon":198},"\u002Fdocs\u002Fnuxt\u002Femail\u002Finput-schemas",{"title":200,"path":560,"description":202,"icon":203},"\u002Fdocs\u002Fnuxt\u002Femail\u002Fi18n",{"title":205,"path":562,"description":207,"icon":208,"group":89},"\u002Fdocs\u002Fnuxt\u002Femail\u002Fresend",{"title":210,"path":564,"description":212,"icon":213,"group":89},"\u002Fdocs\u002Fnuxt\u002Femail\u002Fsendgrid",{"title":215,"path":566,"description":217,"icon":218,"group":89},"\u002Fdocs\u002Fnuxt\u002Femail\u002Fpostmark",{"title":220,"path":568,"description":222,"icon":223,"children":569},"\u002Fdocs\u002Fnuxt\u002Fworkflow",[570,572,574,576],{"title":85,"path":571,"description":227,"icon":88},"\u002Fdocs\u002Fnuxt\u002Fworkflow\u002Fcloudflare",{"title":148,"path":573,"description":230,"icon":151},"\u002Fdocs\u002Fnuxt\u002Fworkflow\u002Fvercel",{"title":232,"path":575,"description":234,"icon":223},"\u002Fdocs\u002Fnuxt\u002Fworkflow\u002Fopenworkflow",{"title":153,"path":577,"description":237,"icon":156},"\u002Fdocs\u002Fnuxt\u002Fworkflow\u002Fnetlify",{"title":239,"path":579,"description":241,"icon":242,"children":580},"\u002Fdocs\u002Fnuxt\u002Fcron",[581,583,585],{"title":245,"path":582,"description":247,"icon":248},"\u002Fdocs\u002Fnuxt\u002Fcron\u002Fnode",{"title":85,"path":584,"description":251,"icon":88},"\u002Fdocs\u002Fnuxt\u002Fcron\u002Fcloudflare",{"title":148,"path":586,"description":254,"icon":151},"\u002Fdocs\u002Fnuxt\u002Fcron\u002Fvercel",{"title":256,"path":588,"description":258,"icon":259,"children":589},"\u002Fdocs\u002Fnuxt\u002Fbrowser",[590,592,594],{"title":85,"path":591,"description":263,"icon":88},"\u002Fdocs\u002Fnuxt\u002Fbrowser\u002Fcloudflare",{"title":265,"path":593,"description":267,"icon":268},"\u002Fdocs\u002Fnuxt\u002Fbrowser\u002Fbrowserbase",{"title":270,"path":595,"description":272,"icon":259},"\u002Fdocs\u002Fnuxt\u002Fbrowser\u002Fplaywright",{"title":274,"path":597,"description":276,"icon":277,"children":598},"\u002Fdocs\u002Fnuxt\u002Fsandbox",[599,601,603,605,607,609],{"title":85,"path":600,"description":281,"icon":88},"\u002Fdocs\u002Fnuxt\u002Fsandbox\u002Fcloudflare",{"title":283,"path":602,"description":285,"icon":88},"\u002Fdocs\u002Fnuxt\u002Fsandbox\u002Fcloudflare-dynamic",{"title":148,"path":604,"description":288,"icon":151},"\u002Fdocs\u002Fnuxt\u002Fsandbox\u002Fvercel",{"title":290,"path":606,"description":292,"icon":293},"\u002Fdocs\u002Fnuxt\u002Fsandbox\u002Fdeno",{"title":295,"path":608,"description":297,"icon":298},"\u002Fdocs\u002Fnuxt\u002Fsandbox\u002Fdocker",{"title":300,"path":610,"description":302,"icon":303},"\u002Fdocs\u002Fnuxt\u002Fsandbox\u002Flocal",{"title":305,"path":612,"description":307,"icon":308,"children":613},"\u002Fdocs\u002Fnuxt\u002Fanalytics",[614,616],{"title":148,"path":615,"description":312,"icon":151},"\u002Fdocs\u002Fnuxt\u002Fanalytics\u002Fvercel",{"title":85,"path":617,"description":315,"icon":88},"\u002Fdocs\u002Fnuxt\u002Fanalytics\u002Fcloudflare",{"id":619,"title":620,"body":621,"description":202,"extension":979,"meta":1818,"navigation":1819,"path":560,"seo":1820,"stem":1821,"__hash__":1822},"docs\u002Fdocs\u002Fnuxt\u002Femail\u002Fi18n.md","Email i18n",{"type":622,"value":623,"toc":1810},"minimark",[624,633,648,659,664,671,941,950,954,957,967,973,1104,1107,1111,1114,1230,1235,1335,1338,1362,1374,1704,1708,1717,1771,1774,1789,1796,1800,1803,1806],[625,626,627,628,632],"p",{},"Email i18n uses locale-specific Markdown files as the template primitive. Keep one logical email name, such as ",[629,630,631],"code",{},"welcome",", and add localized variants under locale folders.",[634,635,637],"fw",{"id":636},"nuxt",[625,638,639,640,643,644,647],{},"Use ",[629,641,642],{},"server\u002Femails\u002Fen\u002Fwelcome.md"," and ",[629,645,646],{},"server\u002Femails\u002Ffr\u002Fwelcome.md"," for the localized variants.",[625,649,650,651,654,655,658],{},"ViteHub resolves the correct variant at runtime from the locale you pass to ",[629,652,653],{},"renderEmail()"," or ",[629,656,657],{},"sendEmail()",". Inside each localized file, you can use ICU message syntax for interpolation, plural rules, and locale-aware number or date formatting.",[660,661,663],"h2",{"id":662},"enable-i18n","Enable i18n",[625,665,666,667,670],{},"Configure ",[629,668,669],{},"email.i18n"," with the locales you want to support.",[634,672,673],{"id":636},[674,675,681],"pre",{"className":676,"code":677,"filename":678,"language":679,"meta":680,"style":680},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: ['@vitehub\u002Femail\u002Fnuxt'],\n  email: {\n    provider: 'resend',\n    apiKey: process.env.RESEND_API_KEY,\n    defaults: {\n      from: 'Acme \u003Chello@example.com>',\n    },\n    i18n: {\n      enabled: true,\n      locales: ['en', 'fr', 'fr-CA'],\n      defaultLocale: 'en',\n      fallbackLocale: ['en'],\n    },\n  },\n})\n","nuxt.config.ts","ts","",[629,682,683,707,735,746,764,788,798,815,821,831,845,885,901,921,926,932],{"__ignoreMap":680},[684,685,688,692,695,699,703],"span",{"class":686,"line":687},"line",1,[684,689,691],{"class":690},"s7zQu","export",[684,693,694],{"class":690}," default",[684,696,698],{"class":697},"s2Zo4"," defineNuxtConfig",[684,700,702],{"class":701},"sTEyZ","(",[684,704,706],{"class":705},"sMK4o","{\n",[684,708,710,714,717,720,723,727,729,732],{"class":686,"line":709},2,[684,711,713],{"class":712},"swJcz","  modules",[684,715,716],{"class":705},":",[684,718,719],{"class":701}," [",[684,721,722],{"class":705},"'",[684,724,726],{"class":725},"sfazB","@vitehub\u002Femail\u002Fnuxt",[684,728,722],{"class":705},[684,730,731],{"class":701},"]",[684,733,734],{"class":705},",\n",[684,736,738,741,743],{"class":686,"line":737},3,[684,739,740],{"class":712},"  email",[684,742,716],{"class":705},[684,744,745],{"class":705}," {\n",[684,747,749,752,754,757,760,762],{"class":686,"line":748},4,[684,750,751],{"class":712},"    provider",[684,753,716],{"class":705},[684,755,756],{"class":705}," '",[684,758,759],{"class":725},"resend",[684,761,722],{"class":705},[684,763,734],{"class":705},[684,765,767,770,772,775,778,781,783,786],{"class":686,"line":766},5,[684,768,769],{"class":712},"    apiKey",[684,771,716],{"class":705},[684,773,774],{"class":701}," process",[684,776,777],{"class":705},".",[684,779,780],{"class":701},"env",[684,782,777],{"class":705},[684,784,785],{"class":701},"RESEND_API_KEY",[684,787,734],{"class":705},[684,789,791,794,796],{"class":686,"line":790},6,[684,792,793],{"class":712},"    defaults",[684,795,716],{"class":705},[684,797,745],{"class":705},[684,799,801,804,806,808,811,813],{"class":686,"line":800},7,[684,802,803],{"class":712},"      from",[684,805,716],{"class":705},[684,807,756],{"class":705},[684,809,810],{"class":725},"Acme \u003Chello@example.com>",[684,812,722],{"class":705},[684,814,734],{"class":705},[684,816,818],{"class":686,"line":817},8,[684,819,820],{"class":705},"    },\n",[684,822,824,827,829],{"class":686,"line":823},9,[684,825,826],{"class":712},"    i18n",[684,828,716],{"class":705},[684,830,745],{"class":705},[684,832,834,837,839,843],{"class":686,"line":833},10,[684,835,836],{"class":712},"      enabled",[684,838,716],{"class":705},[684,840,842],{"class":841},"sfNiH"," true",[684,844,734],{"class":705},[684,846,848,851,853,855,857,860,862,865,867,870,872,874,876,879,881,883],{"class":686,"line":847},11,[684,849,850],{"class":712},"      locales",[684,852,716],{"class":705},[684,854,719],{"class":701},[684,856,722],{"class":705},[684,858,859],{"class":725},"en",[684,861,722],{"class":705},[684,863,864],{"class":705},",",[684,866,756],{"class":705},[684,868,869],{"class":725},"fr",[684,871,722],{"class":705},[684,873,864],{"class":705},[684,875,756],{"class":705},[684,877,878],{"class":725},"fr-CA",[684,880,722],{"class":705},[684,882,731],{"class":701},[684,884,734],{"class":705},[684,886,888,891,893,895,897,899],{"class":686,"line":887},12,[684,889,890],{"class":712},"      defaultLocale",[684,892,716],{"class":705},[684,894,756],{"class":705},[684,896,859],{"class":725},[684,898,722],{"class":705},[684,900,734],{"class":705},[684,902,904,907,909,911,913,915,917,919],{"class":686,"line":903},13,[684,905,906],{"class":712},"      fallbackLocale",[684,908,716],{"class":705},[684,910,719],{"class":701},[684,912,722],{"class":705},[684,914,859],{"class":725},[684,916,722],{"class":705},[684,918,731],{"class":701},[684,920,734],{"class":705},[684,922,924],{"class":686,"line":923},14,[684,925,820],{"class":705},[684,927,929],{"class":686,"line":928},15,[684,930,931],{"class":705},"  },\n",[684,933,935,938],{"class":686,"line":934},16,[684,936,937],{"class":705},"}",[684,939,940],{"class":701},")\n",[625,942,639,943,946,947,777],{},[629,944,945],{},"defaultLocale"," when you want a locale-specific file to be selected even when the caller does not pass ",[629,948,949],{},"options.locale",[660,951,953],{"id":952},"author-localized-templates","Author localized templates",[625,955,956],{},"Create one Markdown file per locale variant.",[634,958,959],{"id":636},[674,960,965],{"className":961,"code":963,"language":964,"meta":680},[962],"language-text","server\u002Femails\u002F\n  welcome.md\n  en\u002Fwelcome.md\n  fr\u002Fwelcome.md\n","text",[629,966,963],{"__ignoreMap":680},[625,968,969,970,972],{},"The public email name stays ",[629,971,631],{},". Locale folders do not become part of the API.",[634,974,975,1045],{"id":636},[674,976,980],{"className":977,"code":978,"filename":642,"language":979,"meta":680,"style":680},"language-md shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","---\nsubject: \"{count, plural, one {# invitation} other {# invitations}} for {{ name }}\"\npreheader: \"Created {createdAt, date, medium}\"\n---\n\n# Hello {name}\n\nYou have {count, plural, one {# invitation} other {# invitations}} waiting.\n","md",[629,981,982,987,1003,1017,1021,1027,1036,1040],{"__ignoreMap":680},[684,983,984],{"class":686,"line":687},[684,985,986],{"class":705},"---\n",[684,988,989,992,994,997,1000],{"class":686,"line":709},[684,990,991],{"class":712},"subject",[684,993,716],{"class":705},[684,995,996],{"class":705}," \"",[684,998,999],{"class":725},"{count, plural, one {# invitation} other {# invitations}} for {{ name }}",[684,1001,1002],{"class":705},"\"\n",[684,1004,1005,1008,1010,1012,1015],{"class":686,"line":737},[684,1006,1007],{"class":712},"preheader",[684,1009,716],{"class":705},[684,1011,996],{"class":705},[684,1013,1014],{"class":725},"Created {createdAt, date, medium}",[684,1016,1002],{"class":705},[684,1018,1019],{"class":686,"line":748},[684,1020,986],{"class":705},[684,1022,1023],{"class":686,"line":766},[684,1024,1026],{"emptyLinePlaceholder":1025},true,"\n",[684,1028,1029,1032],{"class":686,"line":790},[684,1030,1031],{"class":705},"# ",[684,1033,1035],{"class":1034},"sBMFI","Hello {name}\n",[684,1037,1038],{"class":686,"line":800},[684,1039,1026],{"emptyLinePlaceholder":1025},[684,1041,1042],{"class":686,"line":817},[684,1043,1044],{"class":701},"You have {count, plural, one {# invitation} other {# invitations}} waiting.\n",[674,1046,1048],{"className":977,"code":1047,"filename":646,"language":979,"meta":680,"style":680},"---\nsubject: \"{count, plural, one {# invitation} other {# invitations}} pour {{ name }}\"\npreheader: \"Créé le {createdAt, date, medium}\"\n---\n\n# Bonjour {name}\n\nVous avez {count, plural, one {# invitation} other {# invitations}} en attente.\n",[629,1049,1050,1054,1067,1080,1084,1088,1095,1099],{"__ignoreMap":680},[684,1051,1052],{"class":686,"line":687},[684,1053,986],{"class":705},[684,1055,1056,1058,1060,1062,1065],{"class":686,"line":709},[684,1057,991],{"class":712},[684,1059,716],{"class":705},[684,1061,996],{"class":705},[684,1063,1064],{"class":725},"{count, plural, one {# invitation} other {# invitations}} pour {{ name }}",[684,1066,1002],{"class":705},[684,1068,1069,1071,1073,1075,1078],{"class":686,"line":737},[684,1070,1007],{"class":712},[684,1072,716],{"class":705},[684,1074,996],{"class":705},[684,1076,1077],{"class":725},"Créé le {createdAt, date, medium}",[684,1079,1002],{"class":705},[684,1081,1082],{"class":686,"line":748},[684,1083,986],{"class":705},[684,1085,1086],{"class":686,"line":766},[684,1087,1026],{"emptyLinePlaceholder":1025},[684,1089,1090,1092],{"class":686,"line":790},[684,1091,1031],{"class":705},[684,1093,1094],{"class":1034},"Bonjour {name}\n",[684,1096,1097],{"class":686,"line":800},[684,1098,1026],{"emptyLinePlaceholder":1025},[684,1100,1101],{"class":686,"line":817},[684,1102,1103],{"class":701},"Vous avez {count, plural, one {# invitation} other {# invitations}} en attente.\n",[625,1105,1106],{},"Use frontmatter for message metadata and use the body for the localized structure. Locale-specific files can reorder blocks, headings, and calls to action when needed.",[660,1108,1110],{"id":1109},"render-and-send-localized-emails","Render and send localized emails",[625,1112,1113],{},"Pass the locale in the third argument.",[674,1115,1117],{"className":676,"code":1116,"language":679,"meta":680,"style":680},"await sendEmail('welcome', {\n  count: 2,\n  createdAt: new Date(),\n  name: 'Max',\n}, {\n  locale: 'fr-CA',\n  to: 'max@example.com',\n})\n",[629,1118,1119,1139,1152,1170,1186,1193,1208,1224],{"__ignoreMap":680},[684,1120,1121,1124,1127,1129,1131,1133,1135,1137],{"class":686,"line":687},[684,1122,1123],{"class":690},"await",[684,1125,1126],{"class":697}," sendEmail",[684,1128,702],{"class":701},[684,1130,722],{"class":705},[684,1132,631],{"class":725},[684,1134,722],{"class":705},[684,1136,864],{"class":705},[684,1138,745],{"class":705},[684,1140,1141,1144,1146,1150],{"class":686,"line":709},[684,1142,1143],{"class":712},"  count",[684,1145,716],{"class":705},[684,1147,1149],{"class":1148},"sbssI"," 2",[684,1151,734],{"class":705},[684,1153,1154,1157,1159,1162,1165,1168],{"class":686,"line":737},[684,1155,1156],{"class":712},"  createdAt",[684,1158,716],{"class":705},[684,1160,1161],{"class":705}," new",[684,1163,1164],{"class":697}," Date",[684,1166,1167],{"class":701},"()",[684,1169,734],{"class":705},[684,1171,1172,1175,1177,1179,1182,1184],{"class":686,"line":748},[684,1173,1174],{"class":712},"  name",[684,1176,716],{"class":705},[684,1178,756],{"class":705},[684,1180,1181],{"class":725},"Max",[684,1183,722],{"class":705},[684,1185,734],{"class":705},[684,1187,1188,1191],{"class":686,"line":766},[684,1189,1190],{"class":705},"},",[684,1192,745],{"class":705},[684,1194,1195,1198,1200,1202,1204,1206],{"class":686,"line":790},[684,1196,1197],{"class":712},"  locale",[684,1199,716],{"class":705},[684,1201,756],{"class":705},[684,1203,878],{"class":725},[684,1205,722],{"class":705},[684,1207,734],{"class":705},[684,1209,1210,1213,1215,1217,1220,1222],{"class":686,"line":800},[684,1211,1212],{"class":712},"  to",[684,1214,716],{"class":705},[684,1216,756],{"class":705},[684,1218,1219],{"class":725},"max@example.com",[684,1221,722],{"class":705},[684,1223,734],{"class":705},[684,1225,1226,1228],{"class":686,"line":817},[684,1227,937],{"class":705},[684,1229,940],{"class":701},[625,1231,1232,1234],{},[629,1233,653],{}," accepts the same locale option:",[674,1236,1238],{"className":676,"code":1237,"language":679,"meta":680,"style":680},"const message = await renderEmail('welcome', {\n  count: 1,\n  createdAt: new Date(),\n  name: 'Max',\n}, {\n  locale: 'fr',\n})\n",[629,1239,1240,1270,1281,1295,1309,1315,1329],{"__ignoreMap":680},[684,1241,1242,1246,1249,1252,1255,1258,1260,1262,1264,1266,1268],{"class":686,"line":687},[684,1243,1245],{"class":1244},"spNyl","const",[684,1247,1248],{"class":701}," message ",[684,1250,1251],{"class":705},"=",[684,1253,1254],{"class":690}," await",[684,1256,1257],{"class":697}," renderEmail",[684,1259,702],{"class":701},[684,1261,722],{"class":705},[684,1263,631],{"class":725},[684,1265,722],{"class":705},[684,1267,864],{"class":705},[684,1269,745],{"class":705},[684,1271,1272,1274,1276,1279],{"class":686,"line":709},[684,1273,1143],{"class":712},[684,1275,716],{"class":705},[684,1277,1278],{"class":1148}," 1",[684,1280,734],{"class":705},[684,1282,1283,1285,1287,1289,1291,1293],{"class":686,"line":737},[684,1284,1156],{"class":712},[684,1286,716],{"class":705},[684,1288,1161],{"class":705},[684,1290,1164],{"class":697},[684,1292,1167],{"class":701},[684,1294,734],{"class":705},[684,1296,1297,1299,1301,1303,1305,1307],{"class":686,"line":748},[684,1298,1174],{"class":712},[684,1300,716],{"class":705},[684,1302,756],{"class":705},[684,1304,1181],{"class":725},[684,1306,722],{"class":705},[684,1308,734],{"class":705},[684,1310,1311,1313],{"class":686,"line":766},[684,1312,1190],{"class":705},[684,1314,745],{"class":705},[684,1316,1317,1319,1321,1323,1325,1327],{"class":686,"line":790},[684,1318,1197],{"class":712},[684,1320,716],{"class":705},[684,1322,756],{"class":705},[684,1324,869],{"class":725},[684,1326,722],{"class":705},[684,1328,734],{"class":705},[684,1330,1331,1333],{"class":686,"line":800},[684,1332,937],{"class":705},[684,1334,940],{"class":701},[625,1336,1337],{},"Resolution happens in this order:",[1339,1340,1341,1347,1354,1359],"ol",{},[1342,1343,1344,1345],"li",{},"The explicit ",[629,1346,949],{},[1342,1348,1349,1350,1353],{},"The optional ",[629,1351,1352],{},"email.i18n.detectLocale(...)"," adapter when available at runtime",[1342,1355,1356],{},[629,1357,1358],{},"email.i18n.defaultLocale",[1342,1360,1361],{},"The base non-localized Markdown file",[625,1363,1364,1365,1367,1368,1370,1371,1373],{},"For regional locales, ViteHub also falls back through the language chain. For example, ",[629,1366,878],{}," tries ",[629,1369,878],{},", then ",[629,1372,869],{},", then the configured fallback locale, then the base file.",[634,1375,1376,1380,1396,1403,1601,1610,1695],{"id":636},[660,1377,1379],{"id":1378},"nuxt-i18n-auto-detection","Nuxt i18n auto-detection",[625,1381,1382,1383,643,1385,1388,1389,1391,1392,1395],{},"When you use Nuxt with both ",[629,1384,726],{},[629,1386,1387],{},"@nuxtjs\u002Fi18n",", the email module installs a request-scoped locale bridge automatically when ",[629,1390,669],{}," is enabled and you did not provide ",[629,1393,1394],{},"email.i18n.detectLocale"," yourself.",[625,1397,1398,1399,1402],{},"That bridge does one job only: it picks the localized email variant. It does not call ",[629,1400,1401],{},"t()",", read message catalogs, or share translations with the email templates.",[674,1404,1406],{"className":676,"code":1405,"filename":678,"language":679,"meta":680,"style":680},"export default defineNuxtConfig({\n  modules: ['@nuxtjs\u002Fi18n', '@vitehub\u002Femail\u002Fnuxt'],\n  i18n: {\n    experimental: {\n      localeDetector: 'server\u002Futils\u002Flocale-detector.ts',\n    },\n  },\n  email: {\n    provider: 'resend',\n    apiKey: process.env.RESEND_API_KEY,\n    i18n: {\n      enabled: true,\n      locales: ['en', 'fr'],\n      defaultLocale: 'en',\n    },\n  },\n})\n",[629,1407,1408,1420,1446,1455,1464,1480,1484,1488,1496,1510,1528,1536,1546,1572,1586,1590,1594],{"__ignoreMap":680},[684,1409,1410,1412,1414,1416,1418],{"class":686,"line":687},[684,1411,691],{"class":690},[684,1413,694],{"class":690},[684,1415,698],{"class":697},[684,1417,702],{"class":701},[684,1419,706],{"class":705},[684,1421,1422,1424,1426,1428,1430,1432,1434,1436,1438,1440,1442,1444],{"class":686,"line":709},[684,1423,713],{"class":712},[684,1425,716],{"class":705},[684,1427,719],{"class":701},[684,1429,722],{"class":705},[684,1431,1387],{"class":725},[684,1433,722],{"class":705},[684,1435,864],{"class":705},[684,1437,756],{"class":705},[684,1439,726],{"class":725},[684,1441,722],{"class":705},[684,1443,731],{"class":701},[684,1445,734],{"class":705},[684,1447,1448,1451,1453],{"class":686,"line":737},[684,1449,1450],{"class":712},"  i18n",[684,1452,716],{"class":705},[684,1454,745],{"class":705},[684,1456,1457,1460,1462],{"class":686,"line":748},[684,1458,1459],{"class":712},"    experimental",[684,1461,716],{"class":705},[684,1463,745],{"class":705},[684,1465,1466,1469,1471,1473,1476,1478],{"class":686,"line":766},[684,1467,1468],{"class":712},"      localeDetector",[684,1470,716],{"class":705},[684,1472,756],{"class":705},[684,1474,1475],{"class":725},"server\u002Futils\u002Flocale-detector.ts",[684,1477,722],{"class":705},[684,1479,734],{"class":705},[684,1481,1482],{"class":686,"line":790},[684,1483,820],{"class":705},[684,1485,1486],{"class":686,"line":800},[684,1487,931],{"class":705},[684,1489,1490,1492,1494],{"class":686,"line":817},[684,1491,740],{"class":712},[684,1493,716],{"class":705},[684,1495,745],{"class":705},[684,1497,1498,1500,1502,1504,1506,1508],{"class":686,"line":823},[684,1499,751],{"class":712},[684,1501,716],{"class":705},[684,1503,756],{"class":705},[684,1505,759],{"class":725},[684,1507,722],{"class":705},[684,1509,734],{"class":705},[684,1511,1512,1514,1516,1518,1520,1522,1524,1526],{"class":686,"line":833},[684,1513,769],{"class":712},[684,1515,716],{"class":705},[684,1517,774],{"class":701},[684,1519,777],{"class":705},[684,1521,780],{"class":701},[684,1523,777],{"class":705},[684,1525,785],{"class":701},[684,1527,734],{"class":705},[684,1529,1530,1532,1534],{"class":686,"line":847},[684,1531,826],{"class":712},[684,1533,716],{"class":705},[684,1535,745],{"class":705},[684,1537,1538,1540,1542,1544],{"class":686,"line":887},[684,1539,836],{"class":712},[684,1541,716],{"class":705},[684,1543,842],{"class":841},[684,1545,734],{"class":705},[684,1547,1548,1550,1552,1554,1556,1558,1560,1562,1564,1566,1568,1570],{"class":686,"line":903},[684,1549,850],{"class":712},[684,1551,716],{"class":705},[684,1553,719],{"class":701},[684,1555,722],{"class":705},[684,1557,859],{"class":725},[684,1559,722],{"class":705},[684,1561,864],{"class":705},[684,1563,756],{"class":705},[684,1565,869],{"class":725},[684,1567,722],{"class":705},[684,1569,731],{"class":701},[684,1571,734],{"class":705},[684,1573,1574,1576,1578,1580,1582,1584],{"class":686,"line":923},[684,1575,890],{"class":712},[684,1577,716],{"class":705},[684,1579,756],{"class":705},[684,1581,859],{"class":725},[684,1583,722],{"class":705},[684,1585,734],{"class":705},[684,1587,1588],{"class":686,"line":928},[684,1589,820],{"class":705},[684,1591,1592],{"class":686,"line":934},[684,1593,931],{"class":705},[684,1595,1597,1599],{"class":686,"line":1596},17,[684,1598,937],{"class":705},[684,1600,940],{"class":701},[625,1602,639,1603,1606,1607,1609],{},[629,1604,1605],{},"defineI18nLocaleDetector(...)"," for the Nuxt detector so ",[629,1608,1387],{}," can resolve the request locale and the email bridge can reuse it.",[674,1611,1613],{"className":676,"code":1612,"filename":1475,"language":679,"meta":680,"style":680},"export default defineI18nLocaleDetector((event) => {\n  return event.path.startsWith('\u002Ffr') ? 'fr' : 'en'\n})\n",[629,1614,1615,1640,1689],{"__ignoreMap":680},[684,1616,1617,1619,1621,1624,1626,1628,1632,1635,1638],{"class":686,"line":687},[684,1618,691],{"class":690},[684,1620,694],{"class":690},[684,1622,1623],{"class":697}," defineI18nLocaleDetector",[684,1625,702],{"class":701},[684,1627,702],{"class":705},[684,1629,1631],{"class":1630},"sHdIc","event",[684,1633,1634],{"class":705},")",[684,1636,1637],{"class":1244}," =>",[684,1639,745],{"class":705},[684,1641,1642,1645,1648,1650,1653,1655,1658,1660,1662,1665,1667,1670,1673,1675,1677,1679,1682,1684,1686],{"class":686,"line":709},[684,1643,1644],{"class":690},"  return",[684,1646,1647],{"class":701}," event",[684,1649,777],{"class":705},[684,1651,1652],{"class":701},"path",[684,1654,777],{"class":705},[684,1656,1657],{"class":697},"startsWith",[684,1659,702],{"class":712},[684,1661,722],{"class":705},[684,1663,1664],{"class":725},"\u002Ffr",[684,1666,722],{"class":705},[684,1668,1669],{"class":712},") ",[684,1671,1672],{"class":705},"?",[684,1674,756],{"class":705},[684,1676,869],{"class":725},[684,1678,722],{"class":705},[684,1680,1681],{"class":705}," :",[684,1683,756],{"class":705},[684,1685,859],{"class":725},[684,1687,1688],{"class":705},"'\n",[684,1690,1691,1693],{"class":686,"line":737},[684,1692,937],{"class":705},[684,1694,940],{"class":701},[625,1696,1697,1698,1701,1702,777],{},"Automatic Nuxt detection applies only when a request event exists, such as API routes, server handlers, and SSR work. Background jobs, queues, cron handlers, and other non-request execution still need an explicit ",[629,1699,1700],{},"locale"," or a configured ",[629,1703,945],{},[660,1705,1707],{"id":1706},"icu-message-syntax","ICU message syntax",[625,1709,1710,1711,643,1714,777],{},"ViteHub supports ICU formatting in frontmatter string values, Markdown text nodes, and string attributes that already accept interpolation such as ",[629,1712,1713],{},"href",[629,1715,1716],{},"alt",[674,1718,1720],{"className":977,"code":1719,"filename":642,"language":979,"meta":680,"style":680},"---\nsubject: \"{count, plural, one {# invitation} other {# invitations}}\"\n---\n\n::button{href=\"https:\u002F\u002Fexample.com\u002Finvite\u002F{userId}\"}\nOpen invite\n::\n\nBalance: {balance, number, ::currency\u002FUSD}\n",[629,1721,1722,1726,1739,1743,1747,1752,1757,1762,1766],{"__ignoreMap":680},[684,1723,1724],{"class":686,"line":687},[684,1725,986],{"class":705},[684,1727,1728,1730,1732,1734,1737],{"class":686,"line":709},[684,1729,991],{"class":712},[684,1731,716],{"class":705},[684,1733,996],{"class":705},[684,1735,1736],{"class":725},"{count, plural, one {# invitation} other {# invitations}}",[684,1738,1002],{"class":705},[684,1740,1741],{"class":686,"line":737},[684,1742,986],{"class":705},[684,1744,1745],{"class":686,"line":748},[684,1746,1026],{"emptyLinePlaceholder":1025},[684,1748,1749],{"class":686,"line":766},[684,1750,1751],{"class":701},"::button{href=\"https:\u002F\u002Fexample.com\u002Finvite\u002F{userId}\"}\n",[684,1753,1754],{"class":686,"line":790},[684,1755,1756],{"class":701},"Open invite\n",[684,1758,1759],{"class":686,"line":800},[684,1760,1761],{"class":701},"::\n",[684,1763,1764],{"class":686,"line":817},[684,1765,1026],{"emptyLinePlaceholder":1025},[684,1767,1768],{"class":686,"line":823},[684,1769,1770],{"class":701},"Balance: {balance, number, ::currency\u002FUSD}\n",[625,1772,1773],{},"Use ICU syntax for:",[1775,1776,1777,1783,1786],"ul",{},[1342,1778,1779,1780],{},"Variable interpolation such as ",[629,1781,1782],{},"{name}",[1342,1784,1785],{},"Plural and select rules",[1342,1787,1788],{},"Locale-aware date and number formatting",[625,1790,1791,1792,1795],{},"ViteHub still supports the existing ",[629,1793,1794],{},"{{ name }}"," interpolation syntax. Use it when you only need simple value insertion. Use ICU syntax when you need translation-aware formatting.",[660,1797,1799],{"id":1798},"input-schemas-across-locale-variants","Input schemas across locale variants",[625,1801,1802],{},"All localized variants of the same logical email must use the same embedded input schema. Keep the schema blocks identical across variants, or reuse a shared type and schema implementation.",[625,1804,1805],{},"If localized variants declare conflicting embedded schemas, ViteHub fails the build instead of generating ambiguous types for the canonical email name.",[1807,1808,1809],"style",{},"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 .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 pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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":680,"searchDepth":709,"depth":709,"links":1811},[1812,1813,1814,1815,1816,1817],{"id":662,"depth":709,"text":663},{"id":952,"depth":709,"text":953},{"id":1109,"depth":709,"text":1110},{"id":1378,"depth":709,"text":1379},{"id":1706,"depth":709,"text":1707},{"id":1798,"depth":709,"text":1799},{"icon":203},{"title":200},{"title":620,"description":202},"docs\u002Fnuxt\u002Femail\u002Fi18n","NMWCjDofGQI7Lw5zlq7LtXQ5W6GyoRDmiiUdPnj-q0o",[1824,1825],{"title":195,"path":558,"description":197},{"title":205,"path":562,"description":207},1775568181551]