[{"data":1,"prerenderedAt":1547},["ShallowReactive",2],{"docs-navigation":3,"docs:\u002Fdocs\u002Fnuxt\u002Femail\u002Finput-schemas":618,"\u002Fdocs\u002Fnuxt\u002Femail\u002Finput-schemas:surround":1544},[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":195,"body":620,"description":197,"extension":670,"meta":1539,"navigation":1540,"path":558,"seo":1541,"stem":1542,"__hash__":1543},"docs\u002Fdocs\u002Fnuxt\u002Femail\u002Finput-schemas.md",{"type":621,"value":622,"toc":1530},"minimark",[623,636,643,649,654,657,664,885,888,892,895,1297,1301,1304,1307,1311,1314,1331,1334,1340,1344,1347,1467,1490,1494,1502,1506,1509,1526],[624,625,626,627,631,632,635],"p",{},"Input schemas validate template input before ViteHub renders the email. They also improve TypeScript inference for ",[628,629,630],"code",{},"renderEmail()"," and ",[628,633,634],{},"sendEmail()",".",[624,637,638,639,642],{},"The schema is not a separate file. It lives in the Markdown email itself as an embedded ",[628,640,641],{},"ts vitehub-email-schema"," block.",[644,645,646],"tip",{},[624,647,648],{},"Start without a schema if you are new to the package. Add one when you want input checks, better editor help, or stricter runtime guarantees.",[650,651,653],"h2",{"id":652},"add-an-embedded-schema-block","Add an embedded schema block",[624,655,656],{},"Place the schema block at the top of the Markdown file. When frontmatter exists, put the schema block immediately after it.",[624,658,659,660,663],{},"If the email also has an embedded ",[628,661,662],{},"css vitehub-email-style"," block, place the CSS block immediately after the schema block.",[665,666,672],"pre",{"className":667,"code":668,"filename":669,"language":670,"meta":671,"style":671},"language-md shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","---\nsubject: \"Welcome {{ name }}\"\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\nHello {{ name }}\n","welcome.md","md","",[628,673,674,683,703,708,718,747,754,782,824,842,851,856,868,874,879],{"__ignoreMap":671},[675,676,679],"span",{"class":677,"line":678},"line",1,[675,680,682],{"class":681},"sMK4o","---\n",[675,684,686,690,693,696,700],{"class":677,"line":685},2,[675,687,689],{"class":688},"swJcz","subject",[675,691,692],{"class":681},":",[675,694,695],{"class":681}," \"",[675,697,699],{"class":698},"sfazB","Welcome {{ name }}",[675,701,702],{"class":681},"\"\n",[675,704,706],{"class":677,"line":705},3,[675,707,682],{"class":681},[675,709,711,714],{"class":677,"line":710},4,[675,712,713],{"class":698},"```",[675,715,717],{"class":716},"sJsPd","ts vitehub-email-schema\n",[675,719,721,725,728,731,735,738,741,744],{"class":677,"line":720},5,[675,722,724],{"class":723},"s7zQu","import",[675,726,727],{"class":681}," *",[675,729,730],{"class":723}," as",[675,732,734],{"class":733},"sTEyZ"," v ",[675,736,737],{"class":723},"from",[675,739,740],{"class":681}," '",[675,742,743],{"class":698},"valibot",[675,745,746],{"class":681},"'\n",[675,748,750],{"class":677,"line":749},6,[675,751,753],{"emptyLinePlaceholder":752},true,"\n",[675,755,757,761,764,767,770,772,776,779],{"class":677,"line":756},7,[675,758,760],{"class":759},"spNyl","const",[675,762,763],{"class":733}," input ",[675,765,766],{"class":681},"=",[675,768,769],{"class":733}," v",[675,771,635],{"class":681},[675,773,775],{"class":774},"s2Zo4","object",[675,777,778],{"class":733},"(",[675,780,781],{"class":681},"{\n",[675,783,785,788,790,792,794,797,800,802,805,808,811,813,815,818,821],{"class":677,"line":784},8,[675,786,787],{"class":688},"  actionUrl",[675,789,692],{"class":681},[675,791,769],{"class":733},[675,793,635],{"class":681},[675,795,796],{"class":774},"pipe",[675,798,799],{"class":733},"(v",[675,801,635],{"class":681},[675,803,804],{"class":774},"string",[675,806,807],{"class":733},"()",[675,809,810],{"class":681},",",[675,812,769],{"class":733},[675,814,635],{"class":681},[675,816,817],{"class":774},"url",[675,819,820],{"class":733},"())",[675,822,823],{"class":681},",\n",[675,825,827,830,832,834,836,838,840],{"class":677,"line":826},9,[675,828,829],{"class":688},"  name",[675,831,692],{"class":681},[675,833,769],{"class":733},[675,835,635],{"class":681},[675,837,804],{"class":774},[675,839,807],{"class":733},[675,841,823],{"class":681},[675,843,845,848],{"class":677,"line":844},10,[675,846,847],{"class":681},"}",[675,849,850],{"class":733},")\n",[675,852,854],{"class":677,"line":853},11,[675,855,753],{"emptyLinePlaceholder":752},[675,857,859,862,865],{"class":677,"line":858},12,[675,860,861],{"class":723},"export",[675,863,864],{"class":723}," default",[675,866,867],{"class":733}," input\n",[675,869,871],{"class":677,"line":870},13,[675,872,873],{"class":698},"```\n",[675,875,877],{"class":677,"line":876},14,[675,878,753],{"emptyLinePlaceholder":752},[675,880,882],{"class":677,"line":881},15,[675,883,884],{"class":733},"Hello {{ name }}\n",[624,886,887],{},"The schema block must use a default export. ViteHub reads that exported schema during discovery and uses it at runtime.",[650,889,891],{"id":890},"supported-libraries","Supported libraries",[624,893,894],{},"ViteHub works with validators that implement the Standard Schema contract. That includes Valibot, Zod, ArkType, and other compatible libraries.",[896,897,898,1044,1178],"tabs",{},[899,900,903,923],"tabs-item",{"icon":901,"label":902},"i-brand-valibot","Valibot",[665,904,909],{"className":905,"code":906,"filename":907,"language":908,"meta":671,"style":671},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add valibot\n","Terminal","bash",[628,910,911],{"__ignoreMap":671},[675,912,913,917,920],{"class":677,"line":678},[675,914,916],{"class":915},"sBMFI","pnpm",[675,918,919],{"class":698}," add",[675,921,922],{"class":698}," valibot\n",[665,924,926],{"className":667,"code":925,"filename":669,"language":670,"meta":671,"style":671},"```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",[628,927,928,934,952,956,974,1006,1022,1028,1032,1040],{"__ignoreMap":671},[675,929,930,932],{"class":677,"line":678},[675,931,713],{"class":698},[675,933,717],{"class":716},[675,935,936,938,940,942,944,946,948,950],{"class":677,"line":685},[675,937,724],{"class":723},[675,939,727],{"class":681},[675,941,730],{"class":723},[675,943,734],{"class":733},[675,945,737],{"class":723},[675,947,740],{"class":681},[675,949,743],{"class":698},[675,951,746],{"class":681},[675,953,954],{"class":677,"line":705},[675,955,753],{"emptyLinePlaceholder":752},[675,957,958,960,962,964,966,968,970,972],{"class":677,"line":710},[675,959,760],{"class":759},[675,961,763],{"class":733},[675,963,766],{"class":681},[675,965,769],{"class":733},[675,967,635],{"class":681},[675,969,775],{"class":774},[675,971,778],{"class":733},[675,973,781],{"class":681},[675,975,976,978,980,982,984,986,988,990,992,994,996,998,1000,1002,1004],{"class":677,"line":720},[675,977,787],{"class":688},[675,979,692],{"class":681},[675,981,769],{"class":733},[675,983,635],{"class":681},[675,985,796],{"class":774},[675,987,799],{"class":733},[675,989,635],{"class":681},[675,991,804],{"class":774},[675,993,807],{"class":733},[675,995,810],{"class":681},[675,997,769],{"class":733},[675,999,635],{"class":681},[675,1001,817],{"class":774},[675,1003,820],{"class":733},[675,1005,823],{"class":681},[675,1007,1008,1010,1012,1014,1016,1018,1020],{"class":677,"line":749},[675,1009,829],{"class":688},[675,1011,692],{"class":681},[675,1013,769],{"class":733},[675,1015,635],{"class":681},[675,1017,804],{"class":774},[675,1019,807],{"class":733},[675,1021,823],{"class":681},[675,1023,1024,1026],{"class":677,"line":756},[675,1025,847],{"class":681},[675,1027,850],{"class":733},[675,1029,1030],{"class":677,"line":784},[675,1031,753],{"emptyLinePlaceholder":752},[675,1033,1034,1036,1038],{"class":677,"line":826},[675,1035,861],{"class":723},[675,1037,864],{"class":723},[675,1039,867],{"class":733},[675,1041,1042],{"class":677,"line":844},[675,1043,873],{"class":698},[899,1045,1048,1062],{"icon":1046,"label":1047},"i-logos-zod","Zod",[665,1049,1051],{"className":905,"code":1050,"filename":907,"language":908,"meta":671,"style":671},"pnpm add zod\n",[628,1052,1053],{"__ignoreMap":671},[675,1054,1055,1057,1059],{"class":677,"line":678},[675,1056,916],{"class":915},[675,1058,919],{"class":698},[675,1060,1061],{"class":698}," zod\n",[665,1063,1065],{"className":667,"code":1064,"filename":669,"language":670,"meta":671,"style":671},"```ts vitehub-email-schema\nimport { z } from 'zod'\n\nconst input = z.object({\n  actionUrl: z.string().url(),\n  name: z.string(),\n})\n\nexport default input\n```\n",[628,1066,1067,1073,1096,1100,1118,1140,1156,1162,1166,1174],{"__ignoreMap":671},[675,1068,1069,1071],{"class":677,"line":678},[675,1070,713],{"class":698},[675,1072,717],{"class":716},[675,1074,1075,1077,1080,1083,1086,1089,1091,1094],{"class":677,"line":685},[675,1076,724],{"class":723},[675,1078,1079],{"class":681}," {",[675,1081,1082],{"class":733}," z",[675,1084,1085],{"class":681}," }",[675,1087,1088],{"class":723}," from",[675,1090,740],{"class":681},[675,1092,1093],{"class":698},"zod",[675,1095,746],{"class":681},[675,1097,1098],{"class":677,"line":705},[675,1099,753],{"emptyLinePlaceholder":752},[675,1101,1102,1104,1106,1108,1110,1112,1114,1116],{"class":677,"line":710},[675,1103,760],{"class":759},[675,1105,763],{"class":733},[675,1107,766],{"class":681},[675,1109,1082],{"class":733},[675,1111,635],{"class":681},[675,1113,775],{"class":774},[675,1115,778],{"class":733},[675,1117,781],{"class":681},[675,1119,1120,1122,1124,1126,1128,1130,1132,1134,1136,1138],{"class":677,"line":720},[675,1121,787],{"class":688},[675,1123,692],{"class":681},[675,1125,1082],{"class":733},[675,1127,635],{"class":681},[675,1129,804],{"class":774},[675,1131,807],{"class":733},[675,1133,635],{"class":681},[675,1135,817],{"class":774},[675,1137,807],{"class":733},[675,1139,823],{"class":681},[675,1141,1142,1144,1146,1148,1150,1152,1154],{"class":677,"line":749},[675,1143,829],{"class":688},[675,1145,692],{"class":681},[675,1147,1082],{"class":733},[675,1149,635],{"class":681},[675,1151,804],{"class":774},[675,1153,807],{"class":733},[675,1155,823],{"class":681},[675,1157,1158,1160],{"class":677,"line":756},[675,1159,847],{"class":681},[675,1161,850],{"class":733},[675,1163,1164],{"class":677,"line":784},[675,1165,753],{"emptyLinePlaceholder":752},[675,1167,1168,1170,1172],{"class":677,"line":826},[675,1169,861],{"class":723},[675,1171,864],{"class":723},[675,1173,867],{"class":733},[675,1175,1176],{"class":677,"line":844},[675,1177,873],{"class":698},[899,1179,1182,1196],{"icon":1180,"label":1181},"i-brand-arktype","ArkType",[665,1183,1185],{"className":905,"code":1184,"filename":907,"language":908,"meta":671,"style":671},"pnpm add arktype\n",[628,1186,1187],{"__ignoreMap":671},[675,1188,1189,1191,1193],{"class":677,"line":678},[675,1190,916],{"class":915},[675,1192,919],{"class":698},[675,1194,1195],{"class":698}," arktype\n",[665,1197,1199],{"className":667,"code":1198,"filename":669,"language":670,"meta":671,"style":671},"```ts vitehub-email-schema\nimport { type } from 'arktype'\n\nconst input = type({\n  actionUrl: 'string.url',\n  name: 'string',\n})\n\nexport default input\n```\n",[628,1200,1201,1207,1227,1231,1245,1261,1275,1281,1285,1293],{"__ignoreMap":671},[675,1202,1203,1205],{"class":677,"line":678},[675,1204,713],{"class":698},[675,1206,717],{"class":716},[675,1208,1209,1211,1213,1216,1218,1220,1222,1225],{"class":677,"line":685},[675,1210,724],{"class":723},[675,1212,1079],{"class":681},[675,1214,1215],{"class":733}," type",[675,1217,1085],{"class":681},[675,1219,1088],{"class":723},[675,1221,740],{"class":681},[675,1223,1224],{"class":698},"arktype",[675,1226,746],{"class":681},[675,1228,1229],{"class":677,"line":705},[675,1230,753],{"emptyLinePlaceholder":752},[675,1232,1233,1235,1237,1239,1241,1243],{"class":677,"line":710},[675,1234,760],{"class":759},[675,1236,763],{"class":733},[675,1238,766],{"class":681},[675,1240,1215],{"class":774},[675,1242,778],{"class":733},[675,1244,781],{"class":681},[675,1246,1247,1249,1251,1253,1256,1259],{"class":677,"line":720},[675,1248,787],{"class":688},[675,1250,692],{"class":681},[675,1252,740],{"class":681},[675,1254,1255],{"class":698},"string.url",[675,1257,1258],{"class":681},"'",[675,1260,823],{"class":681},[675,1262,1263,1265,1267,1269,1271,1273],{"class":677,"line":749},[675,1264,829],{"class":688},[675,1266,692],{"class":681},[675,1268,740],{"class":681},[675,1270,804],{"class":698},[675,1272,1258],{"class":681},[675,1274,823],{"class":681},[675,1276,1277,1279],{"class":677,"line":756},[675,1278,847],{"class":681},[675,1280,850],{"class":733},[675,1282,1283],{"class":677,"line":784},[675,1284,753],{"emptyLinePlaceholder":752},[675,1286,1287,1289,1291],{"class":677,"line":826},[675,1288,861],{"class":723},[675,1290,864],{"class":723},[675,1292,867],{"class":733},[675,1294,1295],{"class":677,"line":844},[675,1296,873],{"class":698},[650,1298,1300],{"id":1299},"runtime-behavior","Runtime behavior",[624,1302,1303],{},"When a schema exists, ViteHub validates the input before rendering the email. If validation succeeds, ViteHub uses the validated value for interpolation and rendering.",[624,1305,1306],{},"If validation fails, ViteHub throws before it renders or sends the message. If no schema exists, ViteHub skips validation and renders with the input you pass in.",[650,1308,1310],{"id":1309},"ordering-rules","Ordering rules",[624,1312,1313],{},"ViteHub expects the embedded authoring blocks in a fixed order:",[1315,1316,1317,1320,1324,1328],"ol",{},[1318,1319,190],"li",{},[1318,1321,1322],{},[628,1323,641],{},[1318,1325,1326],{},[628,1327,662],{},[1318,1329,1330],{},"Markdown body",[624,1332,1333],{},"Use this order whenever you combine metadata, validation, and styles in the same email file.",[1335,1336,1337],"important",{},[624,1338,1339],{},"Keep the schema block at the top of the file. Do not place it later in the body.",[650,1341,1343],{"id":1342},"frontmatter-still-handles-email-metadata","Frontmatter still handles email metadata",[624,1345,1346],{},"Keep message metadata in frontmatter and keep validation in the embedded schema block.",[665,1348,1350],{"className":667,"code":1349,"filename":669,"language":670,"meta":671,"style":671},"---\nsubject: \"Welcome {{ name }}\"\npreheader: Finish setting up your account\nlayout: transactional\n---\n```ts vitehub-email-schema\nconst input = mySchemaLibrary.object({\n  name: mySchemaLibrary.string(),\n})\n\nexport default input\n```\n\n# Welcome, {{ name }}\n",[628,1351,1352,1356,1368,1378,1388,1392,1398,1417,1433,1439,1443,1451,1455,1459],{"__ignoreMap":671},[675,1353,1354],{"class":677,"line":678},[675,1355,682],{"class":681},[675,1357,1358,1360,1362,1364,1366],{"class":677,"line":685},[675,1359,689],{"class":688},[675,1361,692],{"class":681},[675,1363,695],{"class":681},[675,1365,699],{"class":698},[675,1367,702],{"class":681},[675,1369,1370,1373,1375],{"class":677,"line":705},[675,1371,1372],{"class":688},"preheader",[675,1374,692],{"class":681},[675,1376,1377],{"class":698}," Finish setting up your account\n",[675,1379,1380,1383,1385],{"class":677,"line":710},[675,1381,1382],{"class":688},"layout",[675,1384,692],{"class":681},[675,1386,1387],{"class":698}," transactional\n",[675,1389,1390],{"class":677,"line":720},[675,1391,682],{"class":681},[675,1393,1394,1396],{"class":677,"line":749},[675,1395,713],{"class":698},[675,1397,717],{"class":716},[675,1399,1400,1402,1404,1406,1409,1411,1413,1415],{"class":677,"line":756},[675,1401,760],{"class":759},[675,1403,763],{"class":733},[675,1405,766],{"class":681},[675,1407,1408],{"class":733}," mySchemaLibrary",[675,1410,635],{"class":681},[675,1412,775],{"class":774},[675,1414,778],{"class":733},[675,1416,781],{"class":681},[675,1418,1419,1421,1423,1425,1427,1429,1431],{"class":677,"line":784},[675,1420,829],{"class":688},[675,1422,692],{"class":681},[675,1424,1408],{"class":733},[675,1426,635],{"class":681},[675,1428,804],{"class":774},[675,1430,807],{"class":733},[675,1432,823],{"class":681},[675,1434,1435,1437],{"class":677,"line":826},[675,1436,847],{"class":681},[675,1438,850],{"class":733},[675,1440,1441],{"class":677,"line":844},[675,1442,753],{"emptyLinePlaceholder":752},[675,1444,1445,1447,1449],{"class":677,"line":853},[675,1446,861],{"class":723},[675,1448,864],{"class":723},[675,1450,867],{"class":733},[675,1452,1453],{"class":677,"line":858},[675,1454,873],{"class":698},[675,1456,1457],{"class":677,"line":870},[675,1458,753],{"emptyLinePlaceholder":752},[675,1460,1461,1464],{"class":677,"line":876},[675,1462,1463],{"class":681},"# ",[675,1465,1466],{"class":915},"Welcome, {{ name }}\n",[624,1468,1469,1470,1472,1473,1472,1475,1472,1477,1480,1481,1484,1485,635],{},"Frontmatter keys such as ",[628,1471,689],{},", ",[628,1474,1372],{},[628,1476,1382],{},[628,1478,1479],{},"delivery",", and ",[628,1482,1483],{},"envelope"," still live in the Markdown file. The full reference lives on ",[1486,1487,1489],"a",{"href":1488},".\u002Ffrontmatter","Email frontmatter",[650,1491,1493],{"id":1492},"type-inference","Type inference",[624,1495,1496,1497,631,1499,1501],{},"The schema improves the inferred input type for ",[628,1498,630],{},[628,1500,634],{},". Your editor can then autocomplete the expected fields and flag missing or invalid values earlier.",[650,1503,1505],{"id":1504},"recommended-workflow","Recommended workflow",[624,1507,1508],{},"Use this workflow when you are adding a new email:",[1315,1510,1511,1514,1520,1523],{},[1318,1512,1513],{},"Create the Markdown email and frontmatter first.",[1318,1515,1516,1517,1519],{},"Render it with ",[628,1518,630],{}," while the template is still simple.",[1318,1521,1522],{},"Add an embedded schema block once the template input stabilizes.",[1318,1524,1525],{},"Add an embedded CSS block only if you need custom styling beyond inline attributes and utility classes.",[1527,1528,1529],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sJsPd, html code.shiki .sJsPd{--shiki-light:#90A4AE90;--shiki-default:#EEFFFF90;--shiki-dark:#BABED890}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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .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}",{"title":671,"searchDepth":685,"depth":685,"links":1531},[1532,1533,1534,1535,1536,1537,1538],{"id":652,"depth":685,"text":653},{"id":890,"depth":685,"text":891},{"id":1299,"depth":685,"text":1300},{"id":1309,"depth":685,"text":1310},{"id":1342,"depth":685,"text":1343},{"id":1492,"depth":685,"text":1493},{"id":1504,"depth":685,"text":1505},{"icon":198},{"title":195},{"title":195,"description":197},"docs\u002Fnuxt\u002Femail\u002Finput-schemas","Qxw7wKU8m37qGAHxlwxuY1St9jXNbB9xMv9Xz_YUy00",[1545,1546],{"title":190,"path":556,"description":192},{"title":200,"path":560,"description":202},1775568181425]