[{"data":1,"prerenderedAt":934},["ShallowReactive",2],{"navigation_docs_en":3,"-en-mail-mjml":441,"-en-mail-mjml-surround":929},[4,45,60,81,112,129,146,173,197,213,242,279,356,372,384,403,429],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Getting Started","i-lucide-rocket","\u002Fen\u002Fgetting-started","en\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fen\u002Fgetting-started\u002Fintroduction","en\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Coming from Laravel","\u002Fen\u002Fgetting-started\u002Fcoming-from-laravel","en\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Coming from Symfony","\u002Fen\u002Fgetting-started\u002Fcoming-from-symfony","en\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Installation","\u002Fen\u002Fgetting-started\u002Finstallation","en\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Your first module","\u002Fen\u002Fgetting-started\u002Ffirst-module","en\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Project structure","\u002Fen\u002Fgetting-started\u002Fproject-structure","en\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"The shop sample application","\u002Fen\u002Fgetting-started\u002Fsample-app","en\u002F1.getting-started\u002F7.sample-app","i-lucide-shopping-cart",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"queue","i-lucide-layers","\u002Fen\u002Fqueue","en\u002F10.queue",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Overview","\u002Fen\u002Fqueue\u002Foverview","en\u002F10.queue\u002F1.overview","i-lucide-list-ordered",{"title":57,"path":58,"stem":59,"icon":47},"Tasks","\u002Fen\u002Fqueue\u002Ftasks","en\u002F10.queue\u002F2.tasks",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":44},"events","i-lucide-workflow","\u002Fen\u002Fevents","en\u002F11.events",[66,71,76],{"title":67,"path":68,"stem":69,"icon":70},"Events","\u002Fen\u002Fevents\u002Foverview","en\u002F11.events\u002F1.overview","i-lucide-radio",{"title":72,"path":73,"stem":74,"icon":75},"Outbox","\u002Fen\u002Fevents\u002Foutbox","en\u002F11.events\u002F2.outbox","i-lucide-inbox",{"title":77,"path":78,"stem":79,"icon":80},"Scheduling","\u002Fen\u002Fevents\u002Fscheduler","en\u002F11.events\u002F3.scheduler","i-lucide-calendar-clock",{"title":82,"icon":83,"path":84,"stem":85,"children":86,"page":44},"auth","i-lucide-shield-check","\u002Fen\u002Fauth","en\u002F12.auth",[87,92,97,102,107],{"title":88,"path":89,"stem":90,"icon":91},"Authentication","\u002Fen\u002Fauth\u002Foverview","en\u002F12.auth\u002F1.overview","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"RBAC","\u002Fen\u002Fauth\u002Frbac","en\u002F12.auth\u002F2.rbac","i-lucide-users",{"title":98,"path":99,"stem":100,"icon":101},"Policies","\u002Fen\u002Fauth\u002Fpolicy","en\u002F12.auth\u002F3.policy","i-lucide-gavel",{"title":103,"path":104,"stem":105,"icon":106},"Using auth standalone","\u002Fen\u002Fauth\u002Fstandalone","en\u002F12.auth\u002F4.standalone","i-lucide-plug",{"title":108,"path":109,"stem":110,"icon":111},"Social login with goth, standalone","\u002Fen\u002Fauth\u002Fsocial-standalone","en\u002F12.auth\u002F5.social-standalone","i-lucide-log-in",{"title":113,"icon":114,"path":115,"stem":116,"children":117,"page":44},"mail","i-lucide-mail","\u002Fen\u002Fmail","en\u002F13.mail",[118,121,125],{"title":52,"path":119,"stem":120,"icon":114},"\u002Fen\u002Fmail\u002Foverview","en\u002F13.mail\u002F1.overview",{"title":122,"path":123,"stem":124,"icon":114},"SMTP","\u002Fen\u002Fmail\u002Fsmtp","en\u002F13.mail\u002F2.smtp",{"title":126,"path":127,"stem":128,"icon":114},"MJML","\u002Fen\u002Fmail\u002Fmjml","en\u002F13.mail\u002F3.mjml",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":44},"notify","i-lucide-bell","\u002Fen\u002Fnotify","en\u002F14.notify",[135,138,142],{"title":52,"path":136,"stem":137,"icon":131},"\u002Fen\u002Fnotify\u002Foverview","en\u002F14.notify\u002F1.overview",{"title":139,"path":140,"stem":141,"icon":131},"Database channel","\u002Fen\u002Fnotify\u002Fdatabase","en\u002F14.notify\u002F2.database",{"title":143,"path":144,"stem":145,"icon":131},"Broadcast channel","\u002Fen\u002Fnotify\u002Fbroadcast","en\u002F14.notify\u002F3.broadcast",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":44},"storage","i-lucide-hard-drive","\u002Fen\u002Fstorage","en\u002F15.storage",[152,155,159,163,168],{"title":52,"path":153,"stem":154,"icon":148},"\u002Fen\u002Fstorage\u002Foverview","en\u002F15.storage\u002F1.overview",{"title":156,"path":157,"stem":158},"Disk API","\u002Fen\u002Fstorage\u002Fdisk-api","en\u002F15.storage\u002F2.disk-api",{"title":160,"path":161,"stem":162,"icon":148},"Memory and local disk","\u002Fen\u002Fstorage\u002Flocal","en\u002F15.storage\u002F3.local",{"title":164,"path":165,"stem":166,"icon":167},"S3","\u002Fen\u002Fstorage\u002Fs3","en\u002F15.storage\u002F4.s3","i-lucide-cloud",{"title":169,"path":170,"stem":171,"icon":172},"Testing","\u002Fen\u002Fstorage\u002Ftesting","en\u002F15.storage\u002F5.testing","i-lucide-flask-conical",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":44},"telemetry","i-lucide-activity","\u002Fen\u002Ftelemetry","en\u002F16.telemetry",[179,182,187,192],{"title":52,"path":180,"stem":181,"icon":175},"\u002Fen\u002Ftelemetry\u002Foverview","en\u002F16.telemetry\u002F1.overview",{"title":183,"path":184,"stem":185,"icon":186},"Logging","\u002Fen\u002Ftelemetry\u002Flogging","en\u002F16.telemetry\u002F2.logging","i-lucide-scroll-text",{"title":188,"path":189,"stem":190,"icon":191},"OpenTelemetry","\u002Fen\u002Ftelemetry\u002Fopentelemetry","en\u002F16.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":193,"path":194,"stem":195,"icon":196},"Sentry","\u002Fen\u002Ftelemetry\u002Fsentry","en\u002F16.telemetry\u002F4.sentry","i-lucide-bug",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":44},"Reference","i-lucide-book-open","\u002Fen\u002Freference","en\u002F17.reference",[203,208],{"title":204,"path":205,"stem":206,"icon":207},"Configuration","\u002Fen\u002Freference\u002Fconfiguration","en\u002F17.reference\u002F1.configuration","i-lucide-settings",{"title":209,"path":210,"stem":211,"icon":212},"External dependencies","\u002Fen\u002Freference\u002Fdependencies","en\u002F17.reference\u002F2.dependencies","i-lucide-package",{"title":214,"icon":215,"path":216,"stem":217,"children":218,"page":44},"Concepts","i-lucide-lightbulb","\u002Fen\u002Fconcepts","en\u002F2.concepts",[219,223,228,232,237],{"title":220,"path":221,"stem":222,"icon":47},"Architecture","\u002Fen\u002Fconcepts\u002Farchitecture","en\u002F2.concepts\u002F1.architecture",{"title":224,"path":225,"stem":226,"icon":227},"Error model","\u002Fen\u002Fconcepts\u002Ferror-model","en\u002F2.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":204,"path":229,"stem":230,"icon":231},"\u002Fen\u002Fconcepts\u002Fconfiguration","en\u002F2.concepts\u002F3.configuration","i-lucide-settings-2",{"title":233,"path":234,"stem":235,"icon":236},"Codegen pipeline","\u002Fen\u002Fconcepts\u002Fcodegen-pipeline","en\u002F2.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":238,"path":239,"stem":240,"icon":241},"Design patterns","\u002Fen\u002Fconcepts\u002Fdesign-patterns","en\u002F2.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":243,"icon":244,"path":245,"stem":246,"children":247,"page":44},"Kit","i-lucide-box","\u002Fen\u002Fkit","en\u002F3.kit",[248,251,256,261,266,270,275],{"title":52,"path":249,"stem":250,"icon":244},"\u002Fen\u002Fkit\u002Foverview","en\u002F3.kit\u002F1.overview",{"title":252,"path":253,"stem":254,"icon":255},"Application lifecycle","\u002Fen\u002Fkit\u002Fapp","en\u002F3.kit\u002F2.app","i-lucide-power",{"title":257,"path":258,"stem":259,"icon":260},"Server","\u002Fen\u002Fkit\u002Fserver","en\u002F3.kit\u002F3.server","i-lucide-server",{"title":262,"path":263,"stem":264,"icon":265},"Worker","\u002Fen\u002Fkit\u002Fworker","en\u002F3.kit\u002F4.worker","i-lucide-cog",{"title":267,"path":268,"stem":269,"icon":70},"Realtime","\u002Fen\u002Fkit\u002Frealtime","en\u002F3.kit\u002F5.realtime",{"title":271,"path":272,"stem":273,"icon":274},"Migrations","\u002Fen\u002Fkit\u002Fmigrations","en\u002F3.kit\u002F6.migrations","i-lucide-file-stack",{"title":276,"path":277,"stem":278,"icon":111},"Social login","\u002Fen\u002Fkit\u002Fsocial-login","en\u002F3.kit\u002F7.social-login",{"title":280,"icon":281,"path":282,"stem":283,"children":284,"page":44},"CLI Reference","i-lucide-terminal","\u002Fen\u002Fcli","en\u002F4.cli",[285,288,293,298,303,308,313,318,323,328,333,337,342,347,351],{"title":52,"path":286,"stem":287,"icon":281},"\u002Fen\u002Fcli\u002Foverview","en\u002F4.cli\u002F1.overview",{"title":289,"path":290,"stem":291,"icon":292},"add db","\u002Fen\u002Fcli\u002Fadd-db","en\u002F4.cli\u002F10.add-db","i-lucide-database-zap",{"title":294,"path":295,"stem":296,"icon":297},"add compose \u002F add docker","\u002Fen\u002Fcli\u002Fadd-compose","en\u002F4.cli\u002F11.add-compose","i-lucide-container",{"title":299,"path":300,"stem":301,"icon":302},"add mail","\u002Fen\u002Fcli\u002Fadd-mail","en\u002F4.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":304,"path":305,"stem":306,"icon":307},"add notification","\u002Fen\u002Fcli\u002Fadd-notification","en\u002F4.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":309,"path":310,"stem":311,"icon":312},"add realtime","\u002Fen\u002Fcli\u002Fadd-realtime","en\u002F4.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":314,"path":315,"stem":316,"icon":317},"add seeder","\u002Fen\u002Fcli\u002Fadd-seeder","en\u002F4.cli\u002F15.add-seeder","i-lucide-sprout",{"title":319,"path":320,"stem":321,"icon":322},"new project","\u002Fen\u002Fcli\u002Fnew-project","en\u002F4.cli\u002F2.new-project","i-lucide-folder-plus",{"title":324,"path":325,"stem":326,"icon":327},"new module","\u002Fen\u002Fcli\u002Fnew-module","en\u002F4.cli\u002F3.new-module","i-lucide-blocks",{"title":329,"path":330,"stem":331,"icon":332},"add surface","\u002Fen\u002Fcli\u002Fadd-surface","en\u002F4.cli\u002F4.add-surface","i-lucide-layers-2",{"title":334,"path":335,"stem":336,"icon":244},"add core","\u002Fen\u002Fcli\u002Fadd-core","en\u002F4.cli\u002F5.add-core",{"title":338,"path":339,"stem":340,"icon":341},"add handler","\u002Fen\u002Fcli\u002Fadd-handler","en\u002F4.cli\u002F6.add-handler","i-lucide-webhook",{"title":343,"path":344,"stem":345,"icon":346},"new migration","\u002Fen\u002Fcli\u002Fnew-migration","en\u002F4.cli\u002F7.new-migration","i-lucide-file-plus",{"title":348,"path":349,"stem":350,"icon":265},"worker generators","\u002Fen\u002Fcli\u002Fworker-generators","en\u002F4.cli\u002F8.worker-generators",{"title":352,"path":353,"stem":354,"icon":355},"upgrade templates","\u002Fen\u002Fcli\u002Fupgrade-templates","en\u002F4.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"title":357,"icon":227,"path":358,"stem":359,"children":360,"page":44},"errs","\u002Fen\u002Ferrs","en\u002F5.errs",[361,364,368],{"title":52,"path":362,"stem":363,"icon":227},"\u002Fen\u002Ferrs\u002Foverview","en\u002F5.errs\u002F1.overview",{"title":365,"path":366,"stem":367},"API","\u002Fen\u002Ferrs\u002Fapi","en\u002F5.errs\u002F2.api",{"title":369,"path":370,"stem":371,"icon":227},"Integration","\u002Fen\u002Ferrs\u002Fintegration","en\u002F5.errs\u002F3.integration",{"title":373,"icon":231,"path":374,"stem":375,"children":376,"page":44},"envconf","\u002Fen\u002Fenvconf","en\u002F6.envconf",[377,380],{"title":52,"path":378,"stem":379,"icon":231},"\u002Fen\u002Fenvconf\u002Foverview","en\u002F6.envconf\u002F1.overview",{"title":381,"path":382,"stem":383},"Recipes","\u002Fen\u002Fenvconf\u002Frecipes","en\u002F6.envconf\u002F2.recipes",{"title":385,"icon":386,"path":387,"stem":388,"children":389,"page":44},"httperr","i-lucide-globe","\u002Fen\u002Fhttperr","en\u002F7.httperr",[390,393,398],{"title":52,"path":391,"stem":392,"icon":386},"\u002Fen\u002Fhttperr\u002Foverview","en\u002F7.httperr\u002F1.overview",{"title":394,"path":395,"stem":396,"icon":397},"Error responses","\u002Fen\u002Fhttperr\u002Ferror-responses","en\u002F7.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":399,"path":400,"stem":401,"icon":402},"Validation","\u002Fen\u002Fhttperr\u002Fvalidation","en\u002F7.httperr\u002F3.validation","i-lucide-badge-check",{"title":404,"icon":405,"path":406,"stem":407,"children":408,"page":44},"dbx","i-lucide-database","\u002Fen\u002Fdbx","en\u002F8.dbx",[409,412,416,420,425],{"title":52,"path":410,"stem":411,"icon":405},"\u002Fen\u002Fdbx\u002Foverview","en\u002F8.dbx\u002F1.overview",{"title":413,"path":414,"stem":415,"icon":106},"pgx","\u002Fen\u002Fdbx\u002Fpg","en\u002F8.dbx\u002F2.pg",{"title":417,"path":418,"stem":419,"icon":47},"bun","\u002Fen\u002Fdbx\u002Fbunx","en\u002F8.dbx\u002F3.bunx",{"title":421,"path":422,"stem":423,"icon":424},"Transactions","\u002Fen\u002Fdbx\u002Ftransactions","en\u002F8.dbx\u002F4.transactions","i-lucide-git-merge",{"title":426,"path":427,"stem":428,"icon":317},"Seeders","\u002Fen\u002Fdbx\u002Fseed","en\u002F8.dbx\u002F5.seed",{"title":430,"icon":55,"path":431,"stem":432,"children":433,"page":44},"paginate","\u002Fen\u002Fpaginate","en\u002F9.paginate",[434,437],{"title":52,"path":435,"stem":436,"icon":55},"\u002Fen\u002Fpaginate\u002Foverview","en\u002F9.paginate\u002F1.overview",{"title":438,"path":439,"stem":440,"icon":19},"Cursor pagination","\u002Fen\u002Fpaginate\u002Fcursor","en\u002F9.paginate\u002F2.cursor",{"id":442,"title":126,"body":443,"description":922,"extension":923,"links":924,"meta":925,"navigation":926,"path":127,"seo":927,"stem":128,"__hash__":928},"docs_en\u002Fen\u002F13.mail\u002F3.mjml.md",{"type":444,"value":445,"toc":914},"minimark",[446,455,484,522,527,638,672,676,682,750,805,809,831,835,862,866,886,890,910],[447,448,449,450,454],"p",{},"Reach for this subpackage when you want to compile a mail body from MJML rather than plain HTML or ",[451,452,453],"code",{},"html\u002Ftemplate",".",[456,457,462],"pre",{"className":458,"code":459,"language":460,"meta":461,"style":461},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import \"github.com\u002Fgp-system\u002Fmail\u002Fmjml\"\n","go","",[451,463,464],{"__ignoreMap":461},[465,466,469,473,477,481],"span",{"class":467,"line":468},"line",1,[465,470,472],{"class":471},"s7zQu","import",[465,474,476],{"class":475},"sMK4o"," \"",[465,478,480],{"class":479},"sBMFI","github.com\u002Fgp-system\u002Fmail\u002Fmjml",[465,482,483],{"class":475},"\"\n",[447,485,486,489,490,496,497,503,504,507,508,511,512,517,518,521],{},[451,487,488],{},"mail\u002Fmjml"," compiles ",[491,492,126],"a",{"href":493,"rel":494},"https:\u002F\u002Fmjml.io\u002F",[495],"nofollow"," markup into responsive, email-client-friendly HTML, and is itself a ",[491,498,500],{"href":499},"\u002Fen\u002Fmail\u002Foverview#body-types",[451,501,502],{},"mail.Body",": it slots into ",[451,505,506],{},"Message.WithBody"," exactly like a plain text or HTML body. The source is first rendered as an ",[509,510,453],"strong",{}," (interpolated data is escaped), then compiled from MJML. It runs in pure Go (",[491,513,516],{"href":514,"rel":515},"https:\u002F\u002Fgithub.com\u002FBoostport\u002Fmjml-go",[495],"Boostport\u002Fmjml-go",", wazero WASM runtime). ",[509,519,520],{},"No Node.js needed"," for build or runtime.",[523,524,526],"h2",{"id":525},"template-and-string","Template and String",[456,528,530],{"className":458,"code":529,"language":460,"meta":461,"style":461},"body := mjml.Template(tmpls, \"templates\u002Forder_confirmation.mjml.tmpl\", data).\n    WithTextTemplate(\"templates\u002Forder_confirmation.txt.tmpl\")\n\n\u002F\u002F or from an inline source:\nbody := mjml.String(`\u003Cmjml>\u003Cmj-body>...\u003C\u002Fmj-body>\u003C\u002Fmjml>`, data)\n",[451,531,532,576,594,601,608],{"__ignoreMap":461},[465,533,534,538,541,544,546,550,553,556,559,561,565,568,570,573],{"class":467,"line":468},[465,535,537],{"class":536},"sTEyZ","body ",[465,539,540],{"class":475},":=",[465,542,543],{"class":536}," mjml",[465,545,454],{"class":475},[465,547,549],{"class":548},"s2Zo4","Template",[465,551,552],{"class":475},"(",[465,554,555],{"class":536},"tmpls",[465,557,558],{"class":475},",",[465,560,476],{"class":475},[465,562,564],{"class":563},"sfazB","templates\u002Forder_confirmation.mjml.tmpl",[465,566,567],{"class":475},"\"",[465,569,558],{"class":475},[465,571,572],{"class":536}," data",[465,574,575],{"class":475},").\n",[465,577,579,582,584,586,589,591],{"class":467,"line":578},2,[465,580,581],{"class":548},"    WithTextTemplate",[465,583,552],{"class":475},[465,585,567],{"class":475},[465,587,588],{"class":563},"templates\u002Forder_confirmation.txt.tmpl",[465,590,567],{"class":475},[465,592,593],{"class":475},")\n",[465,595,597],{"class":467,"line":596},3,[465,598,600],{"emptyLinePlaceholder":599},true,"\n",[465,602,604],{"class":467,"line":603},4,[465,605,607],{"class":606},"sHwdD","\u002F\u002F or from an inline source:\n",[465,609,611,613,615,617,619,622,624,627,630,632,634,636],{"class":467,"line":610},5,[465,612,537],{"class":536},[465,614,540],{"class":475},[465,616,543],{"class":536},[465,618,454],{"class":475},[465,620,621],{"class":548},"String",[465,623,552],{"class":475},[465,625,626],{"class":475},"`",[465,628,629],{"class":563},"\u003Cmjml>\u003Cmj-body>...\u003C\u002Fmj-body>\u003C\u002Fmjml>",[465,631,626],{"class":475},[465,633,558],{"class":475},[465,635,572],{"class":536},[465,637,593],{"class":475},[447,639,640,643,644,647,648,651,652,655,656,659,660,663,664,667,668,671],{},[451,641,642],{},"mjml.Template"," reads from an ",[451,645,646],{},"fs.FS"," (typically a ",[451,649,650],{},"\u002F\u002Fgo:embed"," directory), the same signature ",[451,653,654],{},"mail.Template"," uses; ",[451,657,658],{},"mjml.String"," compiles an inline source string. Both can be extended with ",[451,661,662],{},"WithFuncs(template.FuncMap)"," before parsing, and ",[451,665,666],{},"WithTextTemplate"," attaches the plain-text alternative (there is no automatic text derivation, see ",[491,669,670],{"href":499},"Body types",").",[523,673,675],{"id":674},"worked-example","Worked example",[447,677,678,679,681],{},"A minimal order-confirmation template (",[451,680,564],{},"):",[456,683,687],{"className":684,"code":685,"language":686,"meta":461,"style":461},"language-mjml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cmjml>\n  \u003Cmj-body>\n    \u003Cmj-section>\n      \u003Cmj-column>\n        \u003Cmj-text font-size=\"20px\" color=\"#333333\">Hi {{.CustomerName}},\u003C\u002Fmj-text>\n        \u003Cmj-text>Your order (#{{.OrderID}}) has arrived and is on its way soon.\u003C\u002Fmj-text>\n        \u003Cmj-button href=\"{{.OrderURL}}\" background-color=\"#2563eb\">View your order\u003C\u002Fmj-button>\n      \u003C\u002Fmj-column>\n    \u003C\u002Fmj-section>\n  \u003C\u002Fmj-body>\n\u003C\u002Fmjml>\n","mjml",[451,688,689,694,699,704,709,714,720,726,732,738,744],{"__ignoreMap":461},[465,690,691],{"class":467,"line":468},[465,692,693],{},"\u003Cmjml>\n",[465,695,696],{"class":467,"line":578},[465,697,698],{},"  \u003Cmj-body>\n",[465,700,701],{"class":467,"line":596},[465,702,703],{},"    \u003Cmj-section>\n",[465,705,706],{"class":467,"line":603},[465,707,708],{},"      \u003Cmj-column>\n",[465,710,711],{"class":467,"line":610},[465,712,713],{},"        \u003Cmj-text font-size=\"20px\" color=\"#333333\">Hi {{.CustomerName}},\u003C\u002Fmj-text>\n",[465,715,717],{"class":467,"line":716},6,[465,718,719],{},"        \u003Cmj-text>Your order (#{{.OrderID}}) has arrived and is on its way soon.\u003C\u002Fmj-text>\n",[465,721,723],{"class":467,"line":722},7,[465,724,725],{},"        \u003Cmj-button href=\"{{.OrderURL}}\" background-color=\"#2563eb\">View your order\u003C\u002Fmj-button>\n",[465,727,729],{"class":467,"line":728},8,[465,730,731],{},"      \u003C\u002Fmj-column>\n",[465,733,735],{"class":467,"line":734},9,[465,736,737],{},"    \u003C\u002Fmj-section>\n",[465,739,741],{"class":467,"line":740},10,[465,742,743],{},"  \u003C\u002Fmj-body>\n",[465,745,747],{"class":467,"line":746},11,[465,748,749],{},"\u003C\u002Fmjml>\n",[447,751,752,753,756,757,759,760,763,764,767,768,771,772,775,776,778,779,782,783,786,787,790,791,794,795,797,798,800,801,804],{},"Calling ",[451,754,755],{},"mjml.Template(tmpls, \"templates\u002Forder_confirmation.mjml.tmpl\", data)"," first renders this file as an ",[509,758,453],{},": ",[451,761,762],{},"{{.CustomerName}}",", ",[451,765,766],{},"{{.OrderID}}",", and ",[451,769,770],{},"{{.OrderURL}}"," are filled in from ",[451,773,774],{},"data",", escaped. ",[451,777,516],{}," then compiles the resulting MJML: ",[451,780,781],{},"\u003Cmj-section>","\u002F",[451,784,785],{},"\u003Cmj-column>"," become a fixed-width, table-based layout, ",[451,788,789],{},"\u003Cmj-button>"," becomes a button with a VML fallback that renders correctly in Outlook, and ",[451,792,793],{},"\u003Cmj-text>"," becomes a paragraph with sane font size and line height, all without a single hand-written media query or layout table. The result, wrapped as a ",[451,796,502],{},", slots into ",[451,799,506],{}," exactly like a plain HTML body (see the ",[491,802,52],{"href":803},"\u002Fen\u002Fmail\u002Foverview#in-the-shop-the-sendorderconfirmation-listener"," for the full call chain).",[523,806,808],{"id":807},"options","Options",[810,811,812,822],"ul",{},[813,814,815,818,819,454],"li",{},[451,816,817],{},"mjml.Minify(bool)",": minify the compiled HTML; default ",[451,820,821],{},"true",[813,823,824,827,828,454],{},[451,825,826],{},"mjml.ValidationLevel(\"strict\" | \"soft\" | \"skip\")",": MJML validation strictness; default ",[451,829,830],{},"soft",[523,832,834],{"id":833},"the-wasm-cost","The WASM cost",[836,837,838,839,841,842,845,846,848,849,854,855,857,858,861],"warning",{},"Importing ",[451,840,488],{}," links a WASM runtime into the binary, and the ",[509,843,844],{},"first render"," pays for loading the WASM module. Subsequent calls are cheaper. Only the binary that actually imports the package carries that cost: the ",[451,847,113],{}," root and the ",[491,850,851],{"href":123},[451,852,853],{},"smtp"," driver know nothing about ",[451,856,686],{},". Typically only ",[451,859,860],{},"cmd\u002Fworker"," imports it.",[523,863,865],{"id":864},"with-the-kit","With the kit",[447,867,868,869,872,873,876,877,880,881,885],{},"The ",[491,870,871],{"href":41},"shop sample app","'s ",[451,874,875],{},"sendOrderConfirmation"," listener renders an order confirmation this way; see the ",[491,878,879],{"href":803},"worked example on the overview page",". Generating a module-level notifier around a template like this is what ",[491,882,883],{"href":300},[451,884,299],{}," is for; see its reference for the exact generated shape.",[523,887,889],{"id":888},"related-pages","Related pages",[810,891,892,905],{},[813,893,894,896,897,900,901,904],{},[491,895,52],{"href":119},": the ",[451,898,899],{},"Mailer"," interface, ",[451,902,903],{},"Message"," builder, and the other body types.",[813,906,907,909],{},[491,908,122],{"href":123},": the driver that actually sends the HTML this page compiles.",[911,912,913],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":461,"searchDepth":578,"depth":578,"links":915},[916,917,918,919,920,921],{"id":525,"depth":578,"text":526},{"id":674,"depth":578,"text":675},{"id":807,"depth":578,"text":808},{"id":833,"depth":578,"text":834},{"id":864,"depth":578,"text":865},{"id":888,"depth":578,"text":889},"MJML templating for mail.","md",null,{},{"icon":114},{"title":126,"description":922},"FpirX4zX7JUzocgvPQadW-4sglqkecIcN5Zm13LQFUE",[930,932],{"title":122,"path":123,"stem":124,"description":931,"icon":114,"children":-1},"SMTP transport configuration for mail.",{"title":52,"path":136,"stem":137,"description":933,"icon":131,"children":-1},"Multi-channel notifications: one payload, several channels (database, mail, broadcast), driven by a shared Hub.",1785445900998]