[{"data":1,"prerenderedAt":620},["ShallowReactive",2],{"navigation_docs":3,"landing":191},[4,31,67,103,129,155,175],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":30},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,20,25],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-play",{"title":26,"path":27,"stem":28,"icon":29},"Agent Skill","\u002Fgetting-started\u002Fagent-skill","1.getting-started\u002F4.agent-skill","i-lucide-sparkles",false,{"title":32,"icon":33,"path":34,"stem":35,"children":36,"page":30},"Authoring","i-lucide-pen-line","\u002Fauthoring","2.authoring",[37,42,47,52,57,62],{"title":38,"path":39,"stem":40,"icon":41},"Comark syntax","\u002Fauthoring\u002Fcomark-syntax","2.authoring\u002F1.comark-syntax","i-lucide-file-code",{"title":43,"path":44,"stem":45,"icon":46},"Frontmatter","\u002Fauthoring\u002Ffrontmatter","2.authoring\u002F2.frontmatter","i-lucide-heading",{"title":48,"path":49,"stem":50,"icon":51},"Modules","\u002Fauthoring\u002Fmodules","2.authoring\u002F3.modules","i-lucide-blocks",{"title":53,"path":54,"stem":55,"icon":56},"Merge tags and bindings","\u002Fauthoring\u002Fmerge-tags-and-bindings","2.authoring\u002F4.merge-tags-and-bindings","i-lucide-braces",{"title":58,"path":59,"stem":60,"icon":61},"Actions and spans","\u002Fauthoring\u002Factions-and-spans","2.authoring\u002F5.actions-and-spans","i-lucide-mouse-pointer-click",{"title":63,"path":64,"stem":65,"icon":66},"Compile errors","\u002Fauthoring\u002Fcompile-errors","2.authoring\u002F6.compile-errors","i-lucide-circle-alert",{"title":68,"icon":69,"path":70,"stem":71,"children":72,"page":30},"Rendering","i-lucide-layout-template","\u002Frendering","3.rendering",[73,78,83,88,93,98],{"title":74,"path":75,"stem":76,"icon":77},"Families and streams","\u002Frendering\u002Ffamilies-and-streams","3.rendering\u002F1.families-and-streams","i-lucide-users",{"title":79,"path":80,"stem":81,"icon":82},"Themes","\u002Frendering\u002Fthemes","3.rendering\u002F2.themes","i-lucide-palette",{"title":84,"path":85,"stem":86,"icon":87},"Config and the renderer","\u002Frendering\u002Fconfig-and-renderer","3.rendering\u002F3.config-and-renderer","i-lucide-settings",{"title":89,"path":90,"stem":91,"icon":92},"Layout and spacing","\u002Frendering\u002Flayout-and-spacing","3.rendering\u002F4.layout-and-spacing","i-lucide-ruler",{"title":94,"path":95,"stem":96,"icon":97},"HTML output","\u002Frendering\u002Fhtml-output","3.rendering\u002F5.html-output","i-lucide-code-xml",{"title":99,"path":100,"stem":101,"icon":102},"Plain text","\u002Frendering\u002Fplain-text","3.rendering\u002F6.plain-text","i-lucide-file-text",{"title":104,"icon":105,"path":106,"stem":107,"children":108,"page":30},"Sending","i-lucide-send","\u002Fsending","4.sending",[109,114,119,124],{"title":110,"path":111,"stem":112,"icon":113},"Message and MIME","\u002Fsending\u002Fmessage-and-mime","4.sending\u002F1.message-and-mime","i-lucide-mail",{"title":115,"path":116,"stem":117,"icon":118},"Router and streams","\u002Fsending\u002Frouter-and-streams","4.sending\u002F2.router-and-streams","i-lucide-route",{"title":120,"path":121,"stem":122,"icon":123},"SMTP","\u002Fsending\u002Fsmtp","4.sending\u002F3.smtp","i-lucide-server",{"title":125,"path":126,"stem":127,"icon":128},"Maps","\u002Fsending\u002Fmaps","4.sending\u002F4.maps","i-lucide-map",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":30},"Tooling","i-lucide-wrench","\u002Ftooling","5.tooling",[135,140,145,150],{"title":136,"path":137,"stem":138,"icon":139},"The lttr CLI","\u002Ftooling\u002Fcli","5.tooling\u002F1.cli","i-lucide-terminal",{"title":141,"path":142,"stem":143,"icon":144},"Live preview","\u002Ftooling\u002Flive-preview","5.tooling\u002F2.live-preview","i-lucide-eye",{"title":146,"path":147,"stem":148,"icon":149},"Screenshots","\u002Ftooling\u002Fscreenshots","5.tooling\u002F3.screenshots","i-lucide-camera",{"title":151,"path":152,"stem":153,"icon":154},"Goldens and testing","\u002Ftooling\u002Fgoldens-and-testing","5.tooling\u002F4.goldens-and-testing","i-lucide-flask-conical",{"title":156,"icon":157,"path":158,"stem":159,"children":160,"page":30},"Guides","i-lucide-book-open","\u002Fguides","6.guides",[161,166,170],{"title":162,"path":163,"stem":164,"icon":165},"The Quiet example","\u002Fguides\u002Fthe-quiet-example","6.guides\u002F1.the-quiet-example","i-lucide-mail-open",{"title":167,"path":168,"stem":169,"icon":82},"Your own family and theme","\u002Fguides\u002Fyour-own-family-and-theme","6.guides\u002F2.your-own-family-and-theme",{"title":171,"path":172,"stem":173,"icon":174},"Releasing","\u002Fguides\u002Freleasing","6.guides\u002F3.releasing","i-lucide-tag",{"title":176,"icon":177,"path":178,"stem":179,"children":180,"page":30},"Reference","i-lucide-library","\u002Freference","7.reference",[181,186],{"title":182,"path":183,"stem":184,"icon":185},"API reference","\u002Freference\u002Fapi-reference","7.reference\u002F1.api-reference","i-lucide-list-tree",{"title":187,"path":188,"stem":189,"icon":190},"Gallery","\u002Freference\u002Fgallery","7.reference\u002F2.gallery","i-lucide-images",{"id":192,"title":193,"body":194,"description":193,"extension":612,"meta":613,"navigation":366,"path":614,"seo":615,"stem":618,"__hash__":619},"landing\u002Findex.md","",{"type":195,"value":196,"toc":610},"minimark",[197,234,513,592,606],[198,199,200,212,215,218],"u-page-hero",{},[201,202,203],"template",{"v-slot:headline":193},[204,205],"u-color-mode-image",{"alt":206,"className":207,"dark":210,"light":211},"lttr",[208,209],"size-14","mx-auto","\u002Flogo\u002Flttr-mark-dark.svg","\u002Flogo\u002Flttr-mark.svg",[201,213,214],{"v-slot:title":193},"Typed email templates in Go",[201,216,217],{"v-slot:description":193},"Authors write each email in Markdown with components. When your service starts, lttr checks every merge tag in every template against your Go types. Then it renders each message as Outlook-safe HTML, a plain-text part and MIME, ready to send.",[201,219,220,227],{"v-slot:links":193},[221,222,226],"u-button",{"color":223,"size":224,"to":12,"trailing-icon":225},"neutral","xl","i-lucide-arrow-right","Get started",[221,228,233],{"color":223,"size":224,"to":229,"icon":230,"target":231,"variant":232},"https:\u002F\u002Fgithub.com\u002Fsulv-io\u002Flttr","i-simple-icons-github","_blank","outline","View on GitHub",[235,236,237,240,256],"u-page-section",{},[201,238,239],{"v-slot:title":193},"One template, one real email",[201,241,242,243,247,248,251,252,255],{"v-slot:description":193},"This is the order email from the worked example, next to the email lttr renders from it. ",[244,245,246],"code",{},"{{driver.first_name}}",", ",[244,249,250],{},"{{eta}}"," and the ",[244,253,254],{},":order"," binding are checked against the template's Go type when it compiles, and a typo stops the service at startup, with the file, line and column.",[257,258,262,507],"u-page-grid",{"className":259},[260,261],"lg:grid-cols-2","items-start",[263,264,269],"pre",{"className":265,"code":266,"filename":267,"language":268,"meta":193,"style":193},"language-markdown shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","---\ntemplate: order.out_for_delivery\nfamily: buyer\nsubject: Your order is on its way\npreheader: \"Arriving at {{destination}} by {{eta}} today.\"\nfooter:\n  note: \"Payment is held until you confirm delivery. Questions? Reply to this email or visit the [Help Centre]({site}\u002Fhelp).\"\n---\n\n::statement{eyebrow=\"Order {{order_id}}\"}\n# On its way.\n\n{{driver.first_name}} picked up your order at {{picked_up_at}} and will reach {{destination}} by {{eta}}.\n\n:button[Track delivery]{href=\"{{track_url}}\"}\n::\n\n::progress{steps=\"Confirmed, Packed, On its way, Delivered\" current=\"On its way\"}\n::\n\n::receipt{:order=\"order\"}\n::\n\n::meta\n### Deliver to\n{{deliver_to.name}}\n{{deliver_to.address}}\n\n### Driver\n{{driver.name}} · ★ {{driver.rating}}\n{{driver.vehicle}}\n::\n","templates\u002Forder.md","markdown",[244,270,271,280,293,304,315,332,341,356,361,368,375,385,390,396,401,407,413,418,424,429,434,440,445,450,456,465,471,477,482,490,496,502],{"__ignoreMap":193},[272,273,276],"span",{"class":274,"line":275},"line",1,[272,277,279],{"class":278},"sMK4o","---\n",[272,281,283,286,289],{"class":274,"line":282},2,[272,284,201],{"class":285},"swJcz",[272,287,288],{"class":278},":",[272,290,292],{"class":291},"sfazB"," order.out_for_delivery\n",[272,294,296,299,301],{"class":274,"line":295},3,[272,297,298],{"class":285},"family",[272,300,288],{"class":278},[272,302,303],{"class":291}," buyer\n",[272,305,307,310,312],{"class":274,"line":306},4,[272,308,309],{"class":285},"subject",[272,311,288],{"class":278},[272,313,314],{"class":291}," Your order is on its way\n",[272,316,318,321,323,326,329],{"class":274,"line":317},5,[272,319,320],{"class":285},"preheader",[272,322,288],{"class":278},[272,324,325],{"class":278}," \"",[272,327,328],{"class":291},"Arriving at {{destination}} by {{eta}} today.",[272,330,331],{"class":278},"\"\n",[272,333,335,338],{"class":274,"line":334},6,[272,336,337],{"class":285},"footer",[272,339,340],{"class":278},":\n",[272,342,344,347,349,351,354],{"class":274,"line":343},7,[272,345,346],{"class":285},"  note",[272,348,288],{"class":278},[272,350,325],{"class":278},[272,352,353],{"class":291},"Payment is held until you confirm delivery. Questions? Reply to this email or visit the [Help Centre]({site}\u002Fhelp).",[272,355,331],{"class":278},[272,357,359],{"class":274,"line":358},8,[272,360,279],{"class":278},[272,362,364],{"class":274,"line":363},9,[272,365,367],{"emptyLinePlaceholder":366},true,"\n",[272,369,371],{"class":274,"line":370},10,[272,372,374],{"class":373},"sTEyZ","::statement{eyebrow=\"Order {{order_id}}\"}\n",[272,376,378,381],{"class":274,"line":377},11,[272,379,380],{"class":278},"# ",[272,382,384],{"class":383},"sBMFI","On its way.\n",[272,386,388],{"class":274,"line":387},12,[272,389,367],{"emptyLinePlaceholder":366},[272,391,393],{"class":274,"line":392},13,[272,394,395],{"class":373},"{{driver.first_name}} picked up your order at {{picked_up_at}} and will reach {{destination}} by {{eta}}.\n",[272,397,399],{"class":274,"line":398},14,[272,400,367],{"emptyLinePlaceholder":366},[272,402,404],{"class":274,"line":403},15,[272,405,406],{"class":373},":button[Track delivery]{href=\"{{track_url}}\"}\n",[272,408,410],{"class":274,"line":409},16,[272,411,412],{"class":373},"::\n",[272,414,416],{"class":274,"line":415},17,[272,417,367],{"emptyLinePlaceholder":366},[272,419,421],{"class":274,"line":420},18,[272,422,423],{"class":373},"::progress{steps=\"Confirmed, Packed, On its way, Delivered\" current=\"On its way\"}\n",[272,425,427],{"class":274,"line":426},19,[272,428,412],{"class":373},[272,430,432],{"class":274,"line":431},20,[272,433,367],{"emptyLinePlaceholder":366},[272,435,437],{"class":274,"line":436},21,[272,438,439],{"class":373},"::receipt{:order=\"order\"}\n",[272,441,443],{"class":274,"line":442},22,[272,444,412],{"class":373},[272,446,448],{"class":274,"line":447},23,[272,449,367],{"emptyLinePlaceholder":366},[272,451,453],{"class":274,"line":452},24,[272,454,455],{"class":373},"::meta\n",[272,457,459,462],{"class":274,"line":458},25,[272,460,461],{"class":278},"### ",[272,463,464],{"class":383},"Deliver to\n",[272,466,468],{"class":274,"line":467},26,[272,469,470],{"class":373},"{{deliver_to.name}}\n",[272,472,474],{"class":274,"line":473},27,[272,475,476],{"class":373},"{{deliver_to.address}}\n",[272,478,480],{"class":274,"line":479},28,[272,481,367],{"emptyLinePlaceholder":366},[272,483,485,487],{"class":274,"line":484},29,[272,486,461],{"class":278},[272,488,489],{"class":383},"Driver\n",[272,491,493],{"class":274,"line":492},30,[272,494,495],{"class":373},"{{driver.name}} · ★ {{driver.rating}}\n",[272,497,499],{"class":274,"line":498},31,[272,500,501],{"class":373},"{{driver.vehicle}}\n",[272,503,505],{"class":274,"line":504},32,[272,506,412],{"class":373},[508,509],"email-preview",{":compact":510,"name":511,"width":512},"true","01-order.out_for_delivery",375,[235,514,517],{"description":515,"title":516},"The library holds no brand of its own. Colours, fonts, logo, senders and footer copy are yours; lttr supplies the checks and the markup.","What you get",[257,518,519,536,545,558,566,582],{},[520,521,523,526],"u-page-card",{"icon":522,"to":64},"i-lucide-shield-check",[201,524,525],{"v-slot:title":193},"Checked at compile time",[201,527,528,531,532,535],{"v-slot:description":193},[244,529,530],{},"Compile"," checks every merge tag, binding, module and family rule against your Go type once, at startup. It returns every error at once, each at ",[244,533,534],{},"name:line:col",".",[520,537,539,542],{"icon":538,"to":95},"i-lucide-table-2",[201,540,541],{"v-slot:title":193},"Outlook-safe HTML",[201,543,544],{"v-slot:description":193},"Table-based markup with inline styles, fixed-width Outlook tables and VML buttons, all emitted through conditional comments. Every URL is checked before it is written.",[520,546,548,551],{"icon":547,"to":80},"i-lucide-moon",[201,549,550],{"v-slot:title":193},"Dark mode and mobile",[201,552,553,554,557],{"v-slot:description":193},"Your theme's dark palette applies under ",[244,555,556],{},"prefers-color-scheme: dark"," and is repeated for Outlook.com. Below 480px, multi-column modules stack.",[520,559,560,563],{"icon":102,"to":100},[201,561,562],{"v-slot:title":193},"Plain text from the same source",[201,564,565],{"v-slot:description":193},"The text part is rendered from the same laid-out document as the HTML, not scraped from it: headings, links, tables and the footer each have a text form.",[520,567,568,571],{"icon":105,"to":116},[201,569,570],{"v-slot:title":193},"Streams and sending",[201,572,573,574,577,578,581],{"v-slot:description":193},"Each family belongs to a stream. A ",[244,575,576],{},"Router"," sends each stream through its own ",[244,579,580],{},"Sender",", refuses internal mail to outside addresses and honours your suppression list.",[520,583,584,586],{"icon":144,"to":142},[201,585,141],{"v-slot:title":193},[201,587,588,591],{"v-slot:description":193},[244,589,590],{},"lttr serve"," recompiles the templates from disk on every request and shows each email at 600 and 375 px, in light and dark, with its text part.",[235,593,594,597,600],{},[201,595,596],{"v-slot:title":193},"Ready to send your first one?",[201,598,599],{"v-slot:description":193},"Install the module, copy the quick start, and you have a typed, compiled template rendering to HTML and text in one file.",[201,601,602],{"v-slot:links":193},[221,603,605],{"color":223,"size":604,"to":22,"trailing-icon":225},"lg","Read the quick start",[607,608,609],"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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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);}",{"title":193,"searchDepth":282,"depth":282,"links":611},[],"md",{},"\u002F",{"title":616,"description":617},"lttr, typed email templates for Go","Write emails in Markdown with components and give each one a Go data type. lttr checks every merge tag against that type at startup, then renders Outlook-safe HTML, a plain-text part and a MIME message.","index","l9WsuWb6yTTVmOUzhoHWi6isJckjskBGuLp2LTEKYgQ",1790309824486]