[{"data":1,"prerenderedAt":2060},["ShallowReactive",2],{"docs-navigation":3,"docs:\u002Fdocs\u002Fnuxt\u002Femail":618,"\u002Fdocs\u002Fnuxt\u002Femail:surround":2057},[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":184,"body":620,"description":186,"extension":1224,"meta":2051,"navigation":2052,"path":553,"seo":2054,"stem":2055,"__hash__":2056},"docs\u002Fdocs\u002Fnuxt\u002Femail\u002Findex.md",{"type":621,"value":622,"toc":2039},"minimark",[623,627,640,653,663,668,2036],[624,625,626],"p",{},"Use Email to author Markdown emails and send them through Resend, SendGrid, or Postmark. Frontmatter, optional input validation, and optional CSS all live in the same email file.",[624,628,629,630,635,636,639],{},"Use ",[631,632,634],"a",{"href":633},".\u002Femail\u002Ffrontmatter","Email frontmatter"," for message metadata, ",[631,637,195],{"href":638},".\u002Femail\u002Finput-schemas"," for validation, and the provider pages for delivery-specific behavior.",[624,641,642,643,647,648,652],{},"When you need localized copy, use ",[631,644,646],{"href":645},".\u002Femail\u002Fi18n","Email i18n"," for locale-specific Markdown files, ICU message formatting, and Nuxt request-locale reuse with ",[649,650,651],"code",{},"@nuxtjs\u002Fi18n",".",[654,655,657],"fw",{"id":656},"nuxt",[624,658,659,660,652],{},"ViteHub discovers emails under ",[649,661,662],{},"server\u002Femails\u002F",[664,665,667],"h2",{"id":666},"getting-started","Getting started",[669,670,672,677,688,760,774,778,797,1212,1216,1219,1605,1609,1620,1631,1719,1723,1726,1795,1816,1819,1883,1889,1992,1996,2001,2012,2016,2030],"steps",{"level":671},"3",[673,674,676],"h3",{"id":675},"install-the-package","Install the package",[624,678,679,680,683,684,687],{},"Install ",[649,681,682],{},"@vitehub\u002Femail"," and the delivery SDK you plan to use. Add ",[649,685,686],{},"tailwindcss"," only when you want Tailwind utilities in email styles.",[689,690,692,724,742],"tabs",{"sync":691},"email-provider-install",[693,694,695],"tabs-item",{"icon":208,"label":205},[696,697,703],"pre",{"className":698,"code":699,"filename":700,"language":701,"meta":702,"style":702},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add https:\u002F\u002Fpkg.pr.new\u002Fvite-hub\u002Fvitehub\u002F@vitehub\u002Femail@main resend\n","Terminal","bash","",[649,704,705],{"__ignoreMap":702},[706,707,710,714,718,721],"span",{"class":708,"line":709},"line",1,[706,711,713],{"class":712},"sBMFI","pnpm",[706,715,717],{"class":716},"sfazB"," add",[706,719,720],{"class":716}," https:\u002F\u002Fpkg.pr.new\u002Fvite-hub\u002Fvitehub\u002F@vitehub\u002Femail@main",[706,722,723],{"class":716}," resend\n",[693,725,726],{"icon":213,"label":210},[696,727,729],{"className":698,"code":728,"filename":700,"language":701,"meta":702,"style":702},"pnpm add https:\u002F\u002Fpkg.pr.new\u002Fvite-hub\u002Fvitehub\u002F@vitehub\u002Femail@main @sendgrid\u002Fmail\n",[649,730,731],{"__ignoreMap":702},[706,732,733,735,737,739],{"class":708,"line":709},[706,734,713],{"class":712},[706,736,717],{"class":716},[706,738,720],{"class":716},[706,740,741],{"class":716}," @sendgrid\u002Fmail\n",[693,743,744],{"icon":218,"label":215},[696,745,747],{"className":698,"code":746,"filename":700,"language":701,"meta":702,"style":702},"pnpm add https:\u002F\u002Fpkg.pr.new\u002Fvite-hub\u002Fvitehub\u002F@vitehub\u002Femail@main postmark\n",[649,748,749],{"__ignoreMap":702},[706,750,751,753,755,757],{"class":708,"line":709},[706,752,713],{"class":712},[706,754,717],{"class":716},[706,756,720],{"class":716},[706,758,759],{"class":716}," postmark\n",[696,761,763],{"className":698,"code":762,"filename":700,"language":701,"meta":702,"style":702},"pnpm add tailwindcss\n",[649,764,765],{"__ignoreMap":702},[706,766,767,769,771],{"class":708,"line":709},[706,768,713],{"class":712},[706,770,717],{"class":716},[706,772,773],{"class":716}," tailwindcss\n",[673,775,777],{"id":776},"configure-a-provider","Configure a provider",[624,779,780,781,784,785,788,789,792,793,796],{},"Set the top-level ",[649,782,783],{},"email"," key for provider credentials and app-wide defaults. Keep message-specific fields such as ",[649,786,787],{},"subject",", ",[649,790,791],{},"preheader",", and ",[649,794,795],{},"delivery"," in the email file itself.",[689,798,800,960,1077],{"sync":799},"email-provider",[693,801,802],{"icon":208,"label":205},[654,803,804],{"id":656},[696,805,810],{"className":806,"code":807,"filename":808,"language":809,"meta":702,"style":702},"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  },\n})\n","nuxt.config.ts","ts",[649,811,812,833,860,871,889,912,922,939,945,951],{"__ignoreMap":702},[706,813,814,818,821,825,829],{"class":708,"line":709},[706,815,817],{"class":816},"s7zQu","export",[706,819,820],{"class":816}," default",[706,822,824],{"class":823},"s2Zo4"," defineNuxtConfig",[706,826,828],{"class":827},"sTEyZ","(",[706,830,832],{"class":831},"sMK4o","{\n",[706,834,836,840,843,846,849,852,854,857],{"class":708,"line":835},2,[706,837,839],{"class":838},"swJcz","  modules",[706,841,842],{"class":831},":",[706,844,845],{"class":827}," [",[706,847,848],{"class":831},"'",[706,850,851],{"class":716},"@vitehub\u002Femail\u002Fnuxt",[706,853,848],{"class":831},[706,855,856],{"class":827},"]",[706,858,859],{"class":831},",\n",[706,861,863,866,868],{"class":708,"line":862},3,[706,864,865],{"class":838},"  email",[706,867,842],{"class":831},[706,869,870],{"class":831}," {\n",[706,872,874,877,879,882,885,887],{"class":708,"line":873},4,[706,875,876],{"class":838},"    provider",[706,878,842],{"class":831},[706,880,881],{"class":831}," '",[706,883,884],{"class":716},"resend",[706,886,848],{"class":831},[706,888,859],{"class":831},[706,890,892,895,897,900,902,905,907,910],{"class":708,"line":891},5,[706,893,894],{"class":838},"    apiKey",[706,896,842],{"class":831},[706,898,899],{"class":827}," process",[706,901,652],{"class":831},[706,903,904],{"class":827},"env",[706,906,652],{"class":831},[706,908,909],{"class":827},"RESEND_API_KEY",[706,911,859],{"class":831},[706,913,915,918,920],{"class":708,"line":914},6,[706,916,917],{"class":838},"    defaults",[706,919,842],{"class":831},[706,921,870],{"class":831},[706,923,925,928,930,932,935,937],{"class":708,"line":924},7,[706,926,927],{"class":838},"      from",[706,929,842],{"class":831},[706,931,881],{"class":831},[706,933,934],{"class":716},"Acme \u003Chello@example.com>",[706,936,848],{"class":831},[706,938,859],{"class":831},[706,940,942],{"class":708,"line":941},8,[706,943,944],{"class":831},"    },\n",[706,946,948],{"class":708,"line":947},9,[706,949,950],{"class":831},"  },\n",[706,952,954,957],{"class":708,"line":953},10,[706,955,956],{"class":831},"}",[706,958,959],{"class":827},")\n",[693,961,962],{"icon":213,"label":210},[654,963,964],{"id":656},[696,965,967],{"className":806,"code":966,"filename":808,"language":809,"meta":702,"style":702},"export default defineNuxtConfig({\n  modules: ['@vitehub\u002Femail\u002Fnuxt'],\n  email: {\n    provider: 'sendgrid',\n    apiKey: process.env.SENDGRID_API_KEY,\n    defaults: {\n      from: 'Acme \u003Chello@example.com>',\n    },\n  },\n})\n",[649,968,969,981,999,1007,1022,1041,1049,1063,1067,1071],{"__ignoreMap":702},[706,970,971,973,975,977,979],{"class":708,"line":709},[706,972,817],{"class":816},[706,974,820],{"class":816},[706,976,824],{"class":823},[706,978,828],{"class":827},[706,980,832],{"class":831},[706,982,983,985,987,989,991,993,995,997],{"class":708,"line":835},[706,984,839],{"class":838},[706,986,842],{"class":831},[706,988,845],{"class":827},[706,990,848],{"class":831},[706,992,851],{"class":716},[706,994,848],{"class":831},[706,996,856],{"class":827},[706,998,859],{"class":831},[706,1000,1001,1003,1005],{"class":708,"line":862},[706,1002,865],{"class":838},[706,1004,842],{"class":831},[706,1006,870],{"class":831},[706,1008,1009,1011,1013,1015,1018,1020],{"class":708,"line":873},[706,1010,876],{"class":838},[706,1012,842],{"class":831},[706,1014,881],{"class":831},[706,1016,1017],{"class":716},"sendgrid",[706,1019,848],{"class":831},[706,1021,859],{"class":831},[706,1023,1024,1026,1028,1030,1032,1034,1036,1039],{"class":708,"line":891},[706,1025,894],{"class":838},[706,1027,842],{"class":831},[706,1029,899],{"class":827},[706,1031,652],{"class":831},[706,1033,904],{"class":827},[706,1035,652],{"class":831},[706,1037,1038],{"class":827},"SENDGRID_API_KEY",[706,1040,859],{"class":831},[706,1042,1043,1045,1047],{"class":708,"line":914},[706,1044,917],{"class":838},[706,1046,842],{"class":831},[706,1048,870],{"class":831},[706,1050,1051,1053,1055,1057,1059,1061],{"class":708,"line":924},[706,1052,927],{"class":838},[706,1054,842],{"class":831},[706,1056,881],{"class":831},[706,1058,934],{"class":716},[706,1060,848],{"class":831},[706,1062,859],{"class":831},[706,1064,1065],{"class":708,"line":941},[706,1066,944],{"class":831},[706,1068,1069],{"class":708,"line":947},[706,1070,950],{"class":831},[706,1072,1073,1075],{"class":708,"line":953},[706,1074,956],{"class":831},[706,1076,959],{"class":827},[693,1078,1079],{"icon":218,"label":215},[654,1080,1081],{"id":656},[696,1082,1084],{"className":806,"code":1083,"filename":808,"language":809,"meta":702,"style":702},"export default defineNuxtConfig({\n  modules: ['@vitehub\u002Femail\u002Fnuxt'],\n  email: {\n    provider: 'postmark',\n    serverToken: process.env.POSTMARK_SERVER_TOKEN,\n    messageStream: 'outbound',\n    defaults: {\n      from: 'Acme \u003Chello@example.com>',\n    },\n  },\n})\n",[649,1085,1086,1098,1116,1124,1139,1159,1175,1183,1197,1201,1205],{"__ignoreMap":702},[706,1087,1088,1090,1092,1094,1096],{"class":708,"line":709},[706,1089,817],{"class":816},[706,1091,820],{"class":816},[706,1093,824],{"class":823},[706,1095,828],{"class":827},[706,1097,832],{"class":831},[706,1099,1100,1102,1104,1106,1108,1110,1112,1114],{"class":708,"line":835},[706,1101,839],{"class":838},[706,1103,842],{"class":831},[706,1105,845],{"class":827},[706,1107,848],{"class":831},[706,1109,851],{"class":716},[706,1111,848],{"class":831},[706,1113,856],{"class":827},[706,1115,859],{"class":831},[706,1117,1118,1120,1122],{"class":708,"line":862},[706,1119,865],{"class":838},[706,1121,842],{"class":831},[706,1123,870],{"class":831},[706,1125,1126,1128,1130,1132,1135,1137],{"class":708,"line":873},[706,1127,876],{"class":838},[706,1129,842],{"class":831},[706,1131,881],{"class":831},[706,1133,1134],{"class":716},"postmark",[706,1136,848],{"class":831},[706,1138,859],{"class":831},[706,1140,1141,1144,1146,1148,1150,1152,1154,1157],{"class":708,"line":891},[706,1142,1143],{"class":838},"    serverToken",[706,1145,842],{"class":831},[706,1147,899],{"class":827},[706,1149,652],{"class":831},[706,1151,904],{"class":827},[706,1153,652],{"class":831},[706,1155,1156],{"class":827},"POSTMARK_SERVER_TOKEN",[706,1158,859],{"class":831},[706,1160,1161,1164,1166,1168,1171,1173],{"class":708,"line":914},[706,1162,1163],{"class":838},"    messageStream",[706,1165,842],{"class":831},[706,1167,881],{"class":831},[706,1169,1170],{"class":716},"outbound",[706,1172,848],{"class":831},[706,1174,859],{"class":831},[706,1176,1177,1179,1181],{"class":708,"line":924},[706,1178,917],{"class":838},[706,1180,842],{"class":831},[706,1182,870],{"class":831},[706,1184,1185,1187,1189,1191,1193,1195],{"class":708,"line":941},[706,1186,927],{"class":838},[706,1188,842],{"class":831},[706,1190,881],{"class":831},[706,1192,934],{"class":716},[706,1194,848],{"class":831},[706,1196,859],{"class":831},[706,1198,1199],{"class":708,"line":947},[706,1200,944],{"class":831},[706,1202,1203],{"class":708,"line":953},[706,1204,950],{"class":831},[706,1206,1208,1210],{"class":708,"line":1207},11,[706,1209,956],{"class":831},[706,1211,959],{"class":827},[673,1213,1215],{"id":1214},"create-an-email","Create an email",[624,1217,1218],{},"Email files are Markdown only. Frontmatter stores email metadata. Body content uses Comark\u002FMDC syntax plus the built-in primitives.",[696,1220,1225],{"className":1221,"code":1222,"filename":1223,"language":1224,"meta":702,"style":702},"language-md shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","---\nsubject: \"Welcome {{ name }}\"\npreheader: Finish setting up your account\nlayout: transactional\nenvelope:\n  to:\n    - max@example.com\n---\n```ts vitehub-email-schema\nimport * as v from 'valibot'\n\nconst input = v.object({\n  actionUrl: v.pipe(v.string(), v.url()),\n  name: v.string(),\n})\n\nexport default input\n```\n\n```css vitehub-email-style\n@import \"tailwindcss\";\n\n.cta {\n  border-radius: 12px;\n}\n```\n\n::container{class=\"mx-auto max-w-[560px] bg-white\"}\n  ::heading{level=1 class=\"text-3xl font-bold text-slate-900\"}\n  Welcome, {{ name }}\n  ::\n\n::text{class=\"mt-4 text-base leading-6 text-slate-600\"}\nConfirm your email address to finish setup.\n::\n\n::button{href=\"{{ actionUrl }}\" class=\"mt-6 rounded bg-slate-900 px-4 py-3 text-sm font-semibold text-white\"}\nVerify email\n::\n::\n","welcome.md","md",[649,1226,1227,1232,1247,1256,1266,1274,1281,1289,1293,1302,1327,1333,1358,1399,1417,1424,1429,1439,1445,1450,1458,1474,1479,1489,1504,1510,1515,1520,1537,1543,1549,1555,1560,1566,1572,1578,1583,1589,1595,1600],{"__ignoreMap":702},[706,1228,1229],{"class":708,"line":709},[706,1230,1231],{"class":831},"---\n",[706,1233,1234,1236,1238,1241,1244],{"class":708,"line":835},[706,1235,787],{"class":838},[706,1237,842],{"class":831},[706,1239,1240],{"class":831}," \"",[706,1242,1243],{"class":716},"Welcome {{ name }}",[706,1245,1246],{"class":831},"\"\n",[706,1248,1249,1251,1253],{"class":708,"line":862},[706,1250,791],{"class":838},[706,1252,842],{"class":831},[706,1254,1255],{"class":716}," Finish setting up your account\n",[706,1257,1258,1261,1263],{"class":708,"line":873},[706,1259,1260],{"class":838},"layout",[706,1262,842],{"class":831},[706,1264,1265],{"class":716}," transactional\n",[706,1267,1268,1271],{"class":708,"line":891},[706,1269,1270],{"class":838},"envelope",[706,1272,1273],{"class":831},":\n",[706,1275,1276,1279],{"class":708,"line":914},[706,1277,1278],{"class":838},"  to",[706,1280,1273],{"class":831},[706,1282,1283,1286],{"class":708,"line":924},[706,1284,1285],{"class":831},"    -",[706,1287,1288],{"class":716}," max@example.com\n",[706,1290,1291],{"class":708,"line":941},[706,1292,1231],{"class":831},[706,1294,1295,1298],{"class":708,"line":947},[706,1296,1297],{"class":716},"```",[706,1299,1301],{"class":1300},"sJsPd","ts vitehub-email-schema\n",[706,1303,1304,1307,1310,1313,1316,1319,1321,1324],{"class":708,"line":953},[706,1305,1306],{"class":816},"import",[706,1308,1309],{"class":831}," *",[706,1311,1312],{"class":816}," as",[706,1314,1315],{"class":827}," v ",[706,1317,1318],{"class":816},"from",[706,1320,881],{"class":831},[706,1322,1323],{"class":716},"valibot",[706,1325,1326],{"class":831},"'\n",[706,1328,1329],{"class":708,"line":1207},[706,1330,1332],{"emptyLinePlaceholder":1331},true,"\n",[706,1334,1336,1340,1343,1346,1349,1351,1354,1356],{"class":708,"line":1335},12,[706,1337,1339],{"class":1338},"spNyl","const",[706,1341,1342],{"class":827}," input ",[706,1344,1345],{"class":831},"=",[706,1347,1348],{"class":827}," v",[706,1350,652],{"class":831},[706,1352,1353],{"class":823},"object",[706,1355,828],{"class":827},[706,1357,832],{"class":831},[706,1359,1361,1364,1366,1368,1370,1373,1376,1378,1381,1384,1387,1389,1391,1394,1397],{"class":708,"line":1360},13,[706,1362,1363],{"class":838},"  actionUrl",[706,1365,842],{"class":831},[706,1367,1348],{"class":827},[706,1369,652],{"class":831},[706,1371,1372],{"class":823},"pipe",[706,1374,1375],{"class":827},"(v",[706,1377,652],{"class":831},[706,1379,1380],{"class":823},"string",[706,1382,1383],{"class":827},"()",[706,1385,1386],{"class":831},",",[706,1388,1348],{"class":827},[706,1390,652],{"class":831},[706,1392,1393],{"class":823},"url",[706,1395,1396],{"class":827},"())",[706,1398,859],{"class":831},[706,1400,1402,1405,1407,1409,1411,1413,1415],{"class":708,"line":1401},14,[706,1403,1404],{"class":838},"  name",[706,1406,842],{"class":831},[706,1408,1348],{"class":827},[706,1410,652],{"class":831},[706,1412,1380],{"class":823},[706,1414,1383],{"class":827},[706,1416,859],{"class":831},[706,1418,1420,1422],{"class":708,"line":1419},15,[706,1421,956],{"class":831},[706,1423,959],{"class":827},[706,1425,1427],{"class":708,"line":1426},16,[706,1428,1332],{"emptyLinePlaceholder":1331},[706,1430,1432,1434,1436],{"class":708,"line":1431},17,[706,1433,817],{"class":816},[706,1435,820],{"class":816},[706,1437,1438],{"class":827}," input\n",[706,1440,1442],{"class":708,"line":1441},18,[706,1443,1444],{"class":716},"```\n",[706,1446,1448],{"class":708,"line":1447},19,[706,1449,1332],{"emptyLinePlaceholder":1331},[706,1451,1453,1455],{"class":708,"line":1452},20,[706,1454,1297],{"class":716},[706,1456,1457],{"class":1300},"css vitehub-email-style\n",[706,1459,1461,1464,1466,1468,1471],{"class":708,"line":1460},21,[706,1462,1463],{"class":816},"@import",[706,1465,1240],{"class":831},[706,1467,686],{"class":716},[706,1469,1470],{"class":831},"\"",[706,1472,1473],{"class":831},";\n",[706,1475,1477],{"class":708,"line":1476},22,[706,1478,1332],{"emptyLinePlaceholder":1331},[706,1480,1482,1484,1487],{"class":708,"line":1481},23,[706,1483,652],{"class":831},[706,1485,1486],{"class":712},"cta",[706,1488,870],{"class":831},[706,1490,1492,1496,1498,1502],{"class":708,"line":1491},24,[706,1493,1495],{"class":1494},"sqsOY","  border-radius",[706,1497,842],{"class":831},[706,1499,1501],{"class":1500},"sbssI"," 12px",[706,1503,1473],{"class":831},[706,1505,1507],{"class":708,"line":1506},25,[706,1508,1509],{"class":831},"}\n",[706,1511,1513],{"class":708,"line":1512},26,[706,1514,1444],{"class":716},[706,1516,1518],{"class":708,"line":1517},27,[706,1519,1332],{"emptyLinePlaceholder":1331},[706,1521,1523,1526,1529,1532,1534],{"class":708,"line":1522},28,[706,1524,1525],{"class":827},"::container{class=\"mx-auto max-w-",[706,1527,1528],{"class":831},"[",[706,1530,1531],{"class":716},"560px",[706,1533,856],{"class":831},[706,1535,1536],{"class":827}," bg-white\"}\n",[706,1538,1540],{"class":708,"line":1539},29,[706,1541,1542],{"class":827},"  ::heading{level=1 class=\"text-3xl font-bold text-slate-900\"}\n",[706,1544,1546],{"class":708,"line":1545},30,[706,1547,1548],{"class":827},"  Welcome, {{ name }}\n",[706,1550,1552],{"class":708,"line":1551},31,[706,1553,1554],{"class":827},"  ::\n",[706,1556,1558],{"class":708,"line":1557},32,[706,1559,1332],{"emptyLinePlaceholder":1331},[706,1561,1563],{"class":708,"line":1562},33,[706,1564,1565],{"class":827},"::text{class=\"mt-4 text-base leading-6 text-slate-600\"}\n",[706,1567,1569],{"class":708,"line":1568},34,[706,1570,1571],{"class":827},"Confirm your email address to finish setup.\n",[706,1573,1575],{"class":708,"line":1574},35,[706,1576,1577],{"class":827},"::\n",[706,1579,1581],{"class":708,"line":1580},36,[706,1582,1332],{"emptyLinePlaceholder":1331},[706,1584,1586],{"class":708,"line":1585},37,[706,1587,1588],{"class":827},"::button{href=\"{{ actionUrl }}\" class=\"mt-6 rounded bg-slate-900 px-4 py-3 text-sm font-semibold text-white\"}\n",[706,1590,1592],{"class":708,"line":1591},38,[706,1593,1594],{"class":827},"Verify email\n",[706,1596,1598],{"class":708,"line":1597},39,[706,1599,1577],{"class":827},[706,1601,1603],{"class":708,"line":1602},40,[706,1604,1577],{"class":827},[664,1606,1608],{"id":1607},"styling","Styling",[624,1610,1611,1612,1615,1616,1619],{},"Email styling is user-authored. Add one optional ",[649,1613,1614],{},"css vitehub-email-style"," block at the top of the Markdown file, after frontmatter and after the optional ",[649,1617,1618],{},"ts vitehub-email-schema"," block when present.",[624,1621,1622,1623,1626,1627,1630],{},"Classes and inline ",[649,1624,1625],{},"style"," attributes are preserved from your Markdown. ViteHub then compiles Tailwind utilities when available, inlines the resulting CSS into the final HTML, and keeps media queries in a ",[649,1628,1629],{},"\u003Cstyle>"," tag in the document head.",[696,1632,1634],{"className":1221,"code":1633,"filename":1223,"language":1224,"meta":702,"style":702},"---\nsubject: Welcome\n---\n```css vitehub-email-style\n@import \"tailwindcss\";\n\n.cta {\nborder-radius: 12px;\n}\n```\n\n::button{class=\"cta text-sm font-semibold\"}\nVerify email\n::\n",[649,1635,1636,1640,1649,1653,1659,1671,1675,1683,1694,1698,1702,1706,1711,1715],{"__ignoreMap":702},[706,1637,1638],{"class":708,"line":709},[706,1639,1231],{"class":831},[706,1641,1642,1644,1646],{"class":708,"line":835},[706,1643,787],{"class":838},[706,1645,842],{"class":831},[706,1647,1648],{"class":716}," Welcome\n",[706,1650,1651],{"class":708,"line":862},[706,1652,1231],{"class":831},[706,1654,1655,1657],{"class":708,"line":873},[706,1656,1297],{"class":716},[706,1658,1457],{"class":1300},[706,1660,1661,1663,1665,1667,1669],{"class":708,"line":891},[706,1662,1463],{"class":816},[706,1664,1240],{"class":831},[706,1666,686],{"class":716},[706,1668,1470],{"class":831},[706,1670,1473],{"class":831},[706,1672,1673],{"class":708,"line":914},[706,1674,1332],{"emptyLinePlaceholder":1331},[706,1676,1677,1679,1681],{"class":708,"line":924},[706,1678,652],{"class":831},[706,1680,1486],{"class":712},[706,1682,870],{"class":831},[706,1684,1685,1688,1690,1692],{"class":708,"line":941},[706,1686,1687],{"class":1494},"border-radius",[706,1689,842],{"class":831},[706,1691,1501],{"class":1500},[706,1693,1473],{"class":831},[706,1695,1696],{"class":708,"line":947},[706,1697,1509],{"class":831},[706,1699,1700],{"class":708,"line":953},[706,1701,1444],{"class":716},[706,1703,1704],{"class":708,"line":1207},[706,1705,1332],{"emptyLinePlaceholder":1331},[706,1707,1708],{"class":708,"line":1335},[706,1709,1710],{"class":827},"::button{class=\"cta text-sm font-semibold\"}\n",[706,1712,1713],{"class":708,"line":1360},[706,1714,1594],{"class":827},[706,1716,1717],{"class":708,"line":1401},[706,1718,1577],{"class":827},[664,1720,1722],{"id":1721},"built-in-primitives","Built-in primitives",[624,1724,1725],{},"These are the supported Markdown email components:",[1727,1728,1729,1735,1740,1745,1750,1755,1760,1765,1770,1775,1780,1785,1790],"ul",{},[1730,1731,1732],"li",{},[649,1733,1734],{},"container",[1730,1736,1737],{},[649,1738,1739],{},"section",[1730,1741,1742],{},[649,1743,1744],{},"row",[1730,1746,1747],{},[649,1748,1749],{},"column",[1730,1751,1752],{},[649,1753,1754],{},"text",[1730,1756,1757],{},[649,1758,1759],{},"heading",[1730,1761,1762],{},[649,1763,1764],{},"button",[1730,1766,1767],{},[649,1768,1769],{},"link",[1730,1771,1772],{},[649,1773,1774],{},"img",[1730,1776,1777],{},[649,1778,1779],{},"divider",[1730,1781,1782],{},[649,1783,1784],{},"spacer",[1730,1786,1787],{},[649,1788,1789],{},"code-inline",[1730,1791,1792],{},[649,1793,1794],{},"code-block",[624,1796,1797,1798,788,1801,788,1803,788,1806,788,1809,788,1812,1815],{},"They accept normal attrs such as ",[649,1799,1800],{},"class",[649,1802,1625],{},[649,1804,1805],{},"id",[649,1807,1808],{},"href",[649,1810,1811],{},"src",[649,1813,1814],{},"alt",", and data attributes. Unknown custom components are rejected.",[664,1817,111],{"id":1818},"runtime-api",[1820,1821,1822,1835],"table",{},[1823,1824,1825],"thead",{},[1826,1827,1828,1832],"tr",{},[1829,1830,1831],"th",{},"Function",[1829,1833,1834],{},"Use it for",[1836,1837,1838,1863,1873],"tbody",{},[1826,1839,1840,1846],{},[1841,1842,1843],"td",{},[649,1844,1845],{},"renderEmail(name, input?, options?)",[1841,1847,1848,1849,788,1851,788,1854,792,1856,1858,1859,1862],{},"Return the normalized message with ",[649,1850,787],{},[649,1852,1853],{},"html",[649,1855,1754],{},[649,1857,1270],{}," without sending it. Use ",[649,1860,1861],{},"options.locale"," to select a localized variant.",[1826,1864,1865,1870],{},[1841,1866,1867],{},[649,1868,1869],{},"sendEmail(name, input?, options?)",[1841,1871,1872],{},"Validate, render, and send one discovered email, with optional send-time recipient and delivery overrides.",[1826,1874,1875,1880],{},[1841,1876,1877],{},[649,1878,1879],{},"createEmailClient(provider?)",[1841,1881,1882],{},"Send already-rendered payloads directly, or drop to provider-level flows such as manual batching.",[624,1884,629,1885,1888],{},[649,1886,1887],{},"sendEmail(...)"," as the default runtime path. Keep template data in the second argument and pass recipients or delivery overrides in the third argument.",[696,1890,1892],{"className":806,"code":1891,"language":809,"meta":702,"style":702},"await sendEmail('welcome', {\nname: 'Max',\nactionUrl: 'https:\u002F\u002Fexample.com\u002Fverify',\n}, {\nlocale: 'en',\nto: 'max@example.com',\n})\n",[649,1893,1894,1915,1931,1947,1954,1970,1986],{"__ignoreMap":702},[706,1895,1896,1899,1902,1904,1906,1909,1911,1913],{"class":708,"line":709},[706,1897,1898],{"class":816},"await",[706,1900,1901],{"class":823}," sendEmail",[706,1903,828],{"class":827},[706,1905,848],{"class":831},[706,1907,1908],{"class":716},"welcome",[706,1910,848],{"class":831},[706,1912,1386],{"class":831},[706,1914,870],{"class":831},[706,1916,1917,1920,1922,1924,1927,1929],{"class":708,"line":835},[706,1918,1919],{"class":838},"name",[706,1921,842],{"class":831},[706,1923,881],{"class":831},[706,1925,1926],{"class":716},"Max",[706,1928,848],{"class":831},[706,1930,859],{"class":831},[706,1932,1933,1936,1938,1940,1943,1945],{"class":708,"line":862},[706,1934,1935],{"class":838},"actionUrl",[706,1937,842],{"class":831},[706,1939,881],{"class":831},[706,1941,1942],{"class":716},"https:\u002F\u002Fexample.com\u002Fverify",[706,1944,848],{"class":831},[706,1946,859],{"class":831},[706,1948,1949,1952],{"class":708,"line":873},[706,1950,1951],{"class":831},"},",[706,1953,870],{"class":831},[706,1955,1956,1959,1961,1963,1966,1968],{"class":708,"line":891},[706,1957,1958],{"class":838},"locale",[706,1960,842],{"class":831},[706,1962,881],{"class":831},[706,1964,1965],{"class":716},"en",[706,1967,848],{"class":831},[706,1969,859],{"class":831},[706,1971,1972,1975,1977,1979,1982,1984],{"class":708,"line":914},[706,1973,1974],{"class":838},"to",[706,1976,842],{"class":831},[706,1978,881],{"class":831},[706,1980,1981],{"class":716},"max@example.com",[706,1983,848],{"class":831},[706,1985,859],{"class":831},[706,1987,1988,1990],{"class":708,"line":924},[706,1989,956],{"class":831},[706,1991,959],{"class":827},[664,1993,1995],{"id":1994},"frontmatter-and-validation","Frontmatter and validation",[624,1997,1998,1999,652],{},"Use frontmatter for message metadata and use the Markdown body for the email structure. The dedicated reference lives on ",[631,2000,634],{"href":633},[2002,2003,2004],"note",{},[624,2005,2006,2007,2009,2010,652],{},"Input validation is optional. When you want it, embed a ",[649,2008,1618],{}," block at the top of the Markdown file. The full guide lives on ",[631,2011,195],{"href":638},[664,2013,2015],{"id":2014},"limits","Limits",[1727,2017,2018,2021,2024,2027],{},[1730,2019,2020],{},"ViteHub renders discovered Markdown emails only.",[1730,2022,2023],{},"User-defined custom components are not supported.",[1730,2025,2026],{},"Tailwind utilities that depend on complex selectors may still be limited by email client behavior.",[1730,2028,2029],{},"Media queries are preserved, but email clients remain the final constraint.",[624,2031,2032,2033,652],{},"Users who want a React or Vue authoring stack can still render HTML outside ViteHub and send it through ",[649,2034,2035],{},"createEmailClient()",[1625,2037,2038],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .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 .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 .sJsPd, html code.shiki .sJsPd{--shiki-light:#90A4AE90;--shiki-default:#EEFFFF90;--shiki-dark:#BABED890}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sqsOY, html code.shiki .sqsOY{--shiki-light:#8796B0;--shiki-default:#B2CCD6;--shiki-dark:#B2CCD6}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":702,"searchDepth":835,"depth":835,"links":2040},[2041,2046,2047,2048,2049,2050],{"id":666,"depth":835,"text":667,"children":2042},[2043,2044,2045],{"id":675,"depth":862,"text":676},{"id":776,"depth":862,"text":777},{"id":1214,"depth":862,"text":1215},{"id":1607,"depth":835,"text":1608},{"id":1721,"depth":835,"text":1722},{"id":1818,"depth":835,"text":111},{"id":1994,"depth":835,"text":1995},{"id":2014,"depth":835,"text":2015},{"icon":187},{"title":2053},"Overview",{"title":184,"description":186},"docs\u002Fnuxt\u002Femail\u002Findex","SEVl8oMRRr46MzMHG_sZF932VIhKLzGG7NNb-jQ2kYk",[2058,2059],{"title":59,"path":551,"description":182},{"title":190,"path":556,"description":192},1775391846656]