[{"data":1,"prerenderedAt":4078},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-quick-start":191,"-getting-started-quick-start-surround":4073},[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":21,"body":193,"description":4066,"extension":4067,"links":4068,"meta":4069,"navigation":4070,"path":22,"seo":4071,"stem":23,"__hash__":4072},"docs\u002F1.getting-started\u002F3.quick-start.md",{"type":194,"value":195,"toc":4057},"minimark",[196,200,205,212,273,280,2644,2662,2685,2694,2704,2708,2711,2782,2819,2839,2843,2853,2991,3026,3041,3047,3054,3058,3065,3316,3372,3380,3384,3393,3440,3449,3452,3612,3642,3646,3654,3793,3799,3821,3958,3975,3979,4053],[197,198,199],"p",{},"This page builds one transactional email end to end: an \"order shipped\" message with a hero, a total and a sign-off. Everything fits in one file, which you can copy, run, and then take apart section by section.",[201,202,204],"h2",{"id":203},"run-the-program","Run the program",[197,206,207,208,211],{},"Create a module and add lttr (see ",[209,210,16],"a",{"href":17}," for private module access):",[213,214,220],"pre",{"className":215,"code":216,"filename":217,"language":218,"meta":219,"style":219},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","mkdir quickstart && cd quickstart\ngo mod init example.com\u002Fquickstart\ngo get github.com\u002Fsulv-io\u002Flttr\n","Terminal","bash","",[221,222,223,247,262],"code",{"__ignoreMap":219},[224,225,228,232,236,240,244],"span",{"class":226,"line":227},"line",1,[224,229,231],{"class":230},"sBMFI","mkdir",[224,233,235],{"class":234},"sfazB"," quickstart",[224,237,239],{"class":238},"sMK4o"," &&",[224,241,243],{"class":242},"s2Zo4"," cd",[224,245,246],{"class":234}," quickstart\n",[224,248,250,253,256,259],{"class":226,"line":249},2,[224,251,252],{"class":230},"go",[224,254,255],{"class":234}," mod",[224,257,258],{"class":234}," init",[224,260,261],{"class":234}," example.com\u002Fquickstart\n",[224,263,265,267,270],{"class":226,"line":264},3,[224,266,252],{"class":230},[224,268,269],{"class":234}," get",[224,271,272],{"class":234}," github.com\u002Fsulv-io\u002Flttr\n",[197,274,275,276,279],{},"Save this as ",[221,277,278],{},"main.go",":",[213,281,284],{"className":282,"code":283,"filename":278,"language":252,"meta":219,"style":219},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","package main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"log\"\n    \"net\u002Fmail\"\n\n    \"github.com\u002Fsulv-io\u002Flttr\"\n    \"github.com\u002Fsulv-io\u002Flttr\u002Fdata\"\n    \"github.com\u002Fsulv-io\u002Flttr\u002Ftheme\"\n)\n\n\u002F\u002F OrderShipped is the template's data. Every merge tag and binding in the\n\u002F\u002F template is checked against this type when the template compiles.\ntype OrderShipped struct {\n    OrderID  string     `json:\"order_id\"`\n    ETA      string     `json:\"eta\"`\n    Total    data.Money `json:\"total\"`\n    TrackURL string     `json:\"track_url\"`\n}\n\n\u002F\u002F The template: Markdown plus Comark components. In a real service it\n\u002F\u002F usually lives in a .md file pulled in with \u002F\u002Fgo:embed.\nconst orderShippedSrc = `---\ntemplate: order.shipped\nfamily: orders\nsubject: \"Order {{order_id}} is on its way\"\npreheader: \"Arriving by {{eta}}.\"\n---\n\n::statement{eyebrow=\"Order {{order_id}}\"}\n# On its way.\n\nHi {{first_name | there}}, your order will reach you by {{eta}}.\n\n:button[Track delivery]{href=\"{{track_url}}\"}\n::\n\n::breakdown\n| Order total | {{total}} |\n| --- | ---: |\n| Delivery | Free |\n::\n\n::signoff\n::\n`\n\n\u002F\u002F brand is the Theme: two palettes, three font stacks and the logo.\nvar brand = lttr.Theme{\n    Light: theme.Light{\n        Ink: \"#141410\", Body: \"#52524A\", Secondary: \"#6B6B61\", StrongBody: \"#3C3C35\",\n        Action: \"#0B4740\", PillText: \"#FFFFFF\", Accent: \"#C84A0E\",\n        Hairline: \"#E4E4E0\", RowRule: \"#EDEDEA\", NoticeBorder: \"#D8D8D3\",\n        Ground: \"#F7F7F5\", Canvas: \"#FFFFFF\",\n        WarnBg: \"#FEF5E0\", WarnBorder: \"#F0AE23\", WarnText: \"#5A3D04\",\n        OutOfStock: \"#9D1411\", BannerBg: \"#FDF0E8\", BannerText: \"#822E09\",\n        Warm: \"#F6EDE6\", Sea: \"#E3F0EE\", Map: \"#E8F4F3\", Sun: \"#062320\",\n    },\n    Dark: theme.Dark{\n        Canvas: \"#121615\", Footer: \"#1A1F1D\", Hairline: \"#2A302E\",\n        Headline: \"#F2F2F0\", Body: \"#A8ADAB\",\n        Action: \"#8BC9C3\", PillText: \"#062320\",\n        CurrentStep: \"#EC8A50\", AccentText: \"#F4B58C\",\n        BannerBg: \"#2A1A10\", BannerText: \"#F4B58C\", Placeholder: \"#1B201E\",\n        WarnBg: \"#2A2210\", WarnBorder: \"#6B5314\", WarnText: \"#F0D9A8\",\n        OutOfStock: \"#F08A85\",\n    },\n    Fonts: theme.Fonts{\n        Serif: \"Georgia,'Times New Roman',serif\",\n        Sans:  \"Arial,Helvetica,sans-serif\",\n        Mono:  \"'Courier New',Courier,monospace\",\n    },\n    Brand: theme.Brand{Name: \"Acme\", Logo: \"logo.png\", LogoDark: \"logo-dark.png\", LogoSize: 36},\n}\n\n\u002F\u002F families is the consumer's family registry. A family fixes the sender,\n\u002F\u002F the sending stream, the header and footer chrome and the footer copy.\n\u002F\u002F Copy uses {name} placeholders that are filled at render time.\nvar families = lttr.NewRegistry(lttr.Family{\n    Name:   \"orders\",\n    From:   mail.Address{Name: \"Acme\", Address: \"orders@acme.example\"},\n    Stream: lttr.Transactional,\n    Header: lttr.H1,\n    Footer: lttr.F2,\n    Copy: lttr.FooterCopy{\n        Note:      \"Questions? Reply to this email or visit the [Help Centre]({site}\u002Fhelp).\",\n        About:     \"your order\",\n        Service:   \"This is a service email about {about}. [Notification settings]({prefs})\",\n        Address:   \"{brand} · {address}\",\n        TextLinks: []lttr.TextLink{{Label: \"Notification settings\", URL: \"{prefs}\"}},\n    },\n    Tracking: true,\n})\n\n\u002F\u002F Compile once, at init: a template error panics at startup with\n\u002F\u002F name:line:col, never at send time.\nvar orderShipped = lttr.MustCompile[OrderShipped](families, \"order.shipped\", []byte(orderShippedSrc))\n\nfunc main() {\n    r, err := lttr.NewRenderer(lttr.Config{\n        Domain:        \"acme.example\",\n        SiteURL:       \"https:\u002F\u002Facme.example\",\n        AssetBase:     \"https:\u002F\u002Fcdn.acme.example\u002Femail\",\n        Theme:         brand,\n        Families:      families,\n        Entities:      map[string]lttr.Entity{\"default\": {Address: \"1 Harbour Street, Springfield\"}},\n        DefaultRegion: \"default\",\n    })\n    if err != nil {\n        log.Fatal(err) \u002F\u002F every config, theme and family problem at once\n    }\n\n    msg, err := orderShipped.Render(r,\n        lttr.Recipient{Address: \"kim@example.com\", FirstName: \"Kim\"},\n        OrderShipped{\n            OrderID:  \"A-1042\",\n            ETA:      \"5:30 pm\",\n            Total:    data.USD(4250), \u002F\u002F US$42.50\n            TrackURL: \"https:\u002F\u002Facme.example\u002Forders\u002FA-1042\",\n        })\n    if err != nil {\n        log.Fatal(err)\n    }\n    fmt.Println(\"From:   \", msg.From.String())\n    fmt.Println(\"To:     \", msg.To.String())\n    fmt.Println(\"Subject:\", msg.Subject)\n    fmt.Println()\n    fmt.Println(msg.Text)\n\n    \u002F\u002F One Sender per stream keeps reputations apart. Point Addr at your\n    \u002F\u002F relay (and set Auth); localhost:1025 is a local catcher such as Mailpit.\n    router := &lttr.Router{Streams: map[lttr.Stream]lttr.Sender{\n        lttr.Transactional: &lttr.SMTP{Addr: \"localhost:1025\"},\n    }}\n    if err := router.Send(context.Background(), msg); err != nil {\n        log.Fatal(err)\n    }\n    fmt.Println(\"sent to\", msg.To.Address)\n}\n",[221,285,286,294,300,309,321,331,341,351,356,366,376,386,392,397,404,410,425,445,460,483,498,504,509,515,524,541,547,553,559,565,570,575,581,587,592,598,603,609,615,620,626,632,638,644,649,654,660,665,670,675,681,703,721,784,829,874,904,949,994,1053,1059,1076,1121,1151,1179,1210,1253,1295,1311,1316,1333,1350,1368,1385,1390,1462,1467,1472,1478,1484,1490,1520,1538,1582,1599,1616,1633,1650,1668,1686,1703,1720,1770,1775,1789,1795,1800,1806,1812,1865,1870,1884,1916,1934,1952,1969,1982,1995,2045,2061,2067,2083,2105,2111,2116,2143,2183,2191,2208,2225,2252,2269,2275,2288,2303,2308,2346,2379,2408,2420,2441,2446,2452,2458,2504,2539,2545,2587,2602,2607,2639],{"__ignoreMap":219},[224,287,288,291],{"class":226,"line":227},[224,289,290],{"class":238},"package",[224,292,293],{"class":230}," main\n",[224,295,296],{"class":226,"line":249},[224,297,299],{"emptyLinePlaceholder":298},true,"\n",[224,301,302,306],{"class":226,"line":264},[224,303,305],{"class":304},"s7zQu","import",[224,307,308],{"class":238}," (\n",[224,310,312,315,318],{"class":226,"line":311},4,[224,313,314],{"class":238},"    \"",[224,316,317],{"class":230},"context",[224,319,320],{"class":238},"\"\n",[224,322,324,326,329],{"class":226,"line":323},5,[224,325,314],{"class":238},[224,327,328],{"class":230},"fmt",[224,330,320],{"class":238},[224,332,334,336,339],{"class":226,"line":333},6,[224,335,314],{"class":238},[224,337,338],{"class":230},"log",[224,340,320],{"class":238},[224,342,344,346,349],{"class":226,"line":343},7,[224,345,314],{"class":238},[224,347,348],{"class":230},"net\u002Fmail",[224,350,320],{"class":238},[224,352,354],{"class":226,"line":353},8,[224,355,299],{"emptyLinePlaceholder":298},[224,357,359,361,364],{"class":226,"line":358},9,[224,360,314],{"class":238},[224,362,363],{"class":230},"github.com\u002Fsulv-io\u002Flttr",[224,365,320],{"class":238},[224,367,369,371,374],{"class":226,"line":368},10,[224,370,314],{"class":238},[224,372,373],{"class":230},"github.com\u002Fsulv-io\u002Flttr\u002Fdata",[224,375,320],{"class":238},[224,377,379,381,384],{"class":226,"line":378},11,[224,380,314],{"class":238},[224,382,383],{"class":230},"github.com\u002Fsulv-io\u002Flttr\u002Ftheme",[224,385,320],{"class":238},[224,387,389],{"class":226,"line":388},12,[224,390,391],{"class":238},")\n",[224,393,395],{"class":226,"line":394},13,[224,396,299],{"emptyLinePlaceholder":298},[224,398,400],{"class":226,"line":399},14,[224,401,403],{"class":402},"sHwdD","\u002F\u002F OrderShipped is the template's data. Every merge tag and binding in the\n",[224,405,407],{"class":226,"line":406},15,[224,408,409],{"class":402},"\u002F\u002F template is checked against this type when the template compiles.\n",[224,411,413,416,419,422],{"class":226,"line":412},16,[224,414,415],{"class":238},"type",[224,417,418],{"class":230}," OrderShipped",[224,420,421],{"class":238}," struct",[224,423,424],{"class":238}," {\n",[224,426,428,432,436,439,442],{"class":226,"line":427},17,[224,429,431],{"class":430},"sTEyZ","    OrderID  ",[224,433,435],{"class":434},"spNyl","string",[224,437,438],{"class":238},"     `",[224,440,441],{"class":234},"json:\"order_id\"",[224,443,444],{"class":238},"`\n",[224,446,448,451,453,455,458],{"class":226,"line":447},18,[224,449,450],{"class":430},"    ETA      ",[224,452,435],{"class":434},[224,454,438],{"class":238},[224,456,457],{"class":234},"json:\"eta\"",[224,459,444],{"class":238},[224,461,463,466,469,472,475,478,481],{"class":226,"line":462},19,[224,464,465],{"class":430},"    Total    ",[224,467,468],{"class":230},"data",[224,470,471],{"class":238},".",[224,473,474],{"class":230},"Money",[224,476,477],{"class":238}," `",[224,479,480],{"class":234},"json:\"total\"",[224,482,444],{"class":238},[224,484,486,489,491,493,496],{"class":226,"line":485},20,[224,487,488],{"class":430},"    TrackURL ",[224,490,435],{"class":434},[224,492,438],{"class":238},[224,494,495],{"class":234},"json:\"track_url\"",[224,497,444],{"class":238},[224,499,501],{"class":226,"line":500},21,[224,502,503],{"class":238},"}\n",[224,505,507],{"class":226,"line":506},22,[224,508,299],{"emptyLinePlaceholder":298},[224,510,512],{"class":226,"line":511},23,[224,513,514],{"class":402},"\u002F\u002F The template: Markdown plus Comark components. In a real service it\n",[224,516,518,521],{"class":226,"line":517},24,[224,519,520],{"class":402},"\u002F\u002F usually lives in a .md file pulled in with",[224,522,523],{"class":402}," \u002F\u002Fgo:embed.\n",[224,525,527,530,533,536,538],{"class":226,"line":526},25,[224,528,529],{"class":238},"const",[224,531,532],{"class":430}," orderShippedSrc ",[224,534,535],{"class":238},"=",[224,537,477],{"class":238},[224,539,540],{"class":234},"---\n",[224,542,544],{"class":226,"line":543},26,[224,545,546],{"class":234},"template: order.shipped\n",[224,548,550],{"class":226,"line":549},27,[224,551,552],{"class":234},"family: orders\n",[224,554,556],{"class":226,"line":555},28,[224,557,558],{"class":234},"subject: \"Order {{order_id}} is on its way\"\n",[224,560,562],{"class":226,"line":561},29,[224,563,564],{"class":234},"preheader: \"Arriving by {{eta}}.\"\n",[224,566,568],{"class":226,"line":567},30,[224,569,540],{"class":234},[224,571,573],{"class":226,"line":572},31,[224,574,299],{"emptyLinePlaceholder":298},[224,576,578],{"class":226,"line":577},32,[224,579,580],{"class":234},"::statement{eyebrow=\"Order {{order_id}}\"}\n",[224,582,584],{"class":226,"line":583},33,[224,585,586],{"class":234},"# On its way.\n",[224,588,590],{"class":226,"line":589},34,[224,591,299],{"emptyLinePlaceholder":298},[224,593,595],{"class":226,"line":594},35,[224,596,597],{"class":234},"Hi {{first_name | there}}, your order will reach you by {{eta}}.\n",[224,599,601],{"class":226,"line":600},36,[224,602,299],{"emptyLinePlaceholder":298},[224,604,606],{"class":226,"line":605},37,[224,607,608],{"class":234},":button[Track delivery]{href=\"{{track_url}}\"}\n",[224,610,612],{"class":226,"line":611},38,[224,613,614],{"class":234},"::\n",[224,616,618],{"class":226,"line":617},39,[224,619,299],{"emptyLinePlaceholder":298},[224,621,623],{"class":226,"line":622},40,[224,624,625],{"class":234},"::breakdown\n",[224,627,629],{"class":226,"line":628},41,[224,630,631],{"class":234},"| Order total | {{total}} |\n",[224,633,635],{"class":226,"line":634},42,[224,636,637],{"class":234},"| --- | ---: |\n",[224,639,641],{"class":226,"line":640},43,[224,642,643],{"class":234},"| Delivery | Free |\n",[224,645,647],{"class":226,"line":646},44,[224,648,614],{"class":234},[224,650,652],{"class":226,"line":651},45,[224,653,299],{"emptyLinePlaceholder":298},[224,655,657],{"class":226,"line":656},46,[224,658,659],{"class":234},"::signoff\n",[224,661,663],{"class":226,"line":662},47,[224,664,614],{"class":234},[224,666,668],{"class":226,"line":667},48,[224,669,444],{"class":238},[224,671,673],{"class":226,"line":672},49,[224,674,299],{"emptyLinePlaceholder":298},[224,676,678],{"class":226,"line":677},50,[224,679,680],{"class":402},"\u002F\u002F brand is the Theme: two palettes, three font stacks and the logo.\n",[224,682,684,687,690,692,695,697,700],{"class":226,"line":683},51,[224,685,686],{"class":238},"var",[224,688,689],{"class":430}," brand ",[224,691,535],{"class":238},[224,693,694],{"class":230}," lttr",[224,696,471],{"class":238},[224,698,699],{"class":230},"Theme",[224,701,702],{"class":238},"{\n",[224,704,706,709,711,714,716,719],{"class":226,"line":705},52,[224,707,708],{"class":430},"    Light",[224,710,279],{"class":238},[224,712,713],{"class":230}," theme",[224,715,471],{"class":238},[224,717,718],{"class":230},"Light",[224,720,702],{"class":238},[224,722,724,727,729,732,735,738,741,744,746,748,751,753,755,758,760,762,765,767,769,772,774,776,779,781],{"class":226,"line":723},53,[224,725,726],{"class":430},"        Ink",[224,728,279],{"class":238},[224,730,731],{"class":238}," \"",[224,733,734],{"class":234},"#141410",[224,736,737],{"class":238},"\"",[224,739,740],{"class":238},",",[224,742,743],{"class":430}," Body",[224,745,279],{"class":238},[224,747,731],{"class":238},[224,749,750],{"class":234},"#52524A",[224,752,737],{"class":238},[224,754,740],{"class":238},[224,756,757],{"class":430}," Secondary",[224,759,279],{"class":238},[224,761,731],{"class":238},[224,763,764],{"class":234},"#6B6B61",[224,766,737],{"class":238},[224,768,740],{"class":238},[224,770,771],{"class":430}," StrongBody",[224,773,279],{"class":238},[224,775,731],{"class":238},[224,777,778],{"class":234},"#3C3C35",[224,780,737],{"class":238},[224,782,783],{"class":238},",\n",[224,785,787,790,792,794,797,799,801,804,806,808,811,813,815,818,820,822,825,827],{"class":226,"line":786},54,[224,788,789],{"class":430},"        Action",[224,791,279],{"class":238},[224,793,731],{"class":238},[224,795,796],{"class":234},"#0B4740",[224,798,737],{"class":238},[224,800,740],{"class":238},[224,802,803],{"class":430}," PillText",[224,805,279],{"class":238},[224,807,731],{"class":238},[224,809,810],{"class":234},"#FFFFFF",[224,812,737],{"class":238},[224,814,740],{"class":238},[224,816,817],{"class":430}," Accent",[224,819,279],{"class":238},[224,821,731],{"class":238},[224,823,824],{"class":234},"#C84A0E",[224,826,737],{"class":238},[224,828,783],{"class":238},[224,830,832,835,837,839,842,844,846,849,851,853,856,858,860,863,865,867,870,872],{"class":226,"line":831},55,[224,833,834],{"class":430},"        Hairline",[224,836,279],{"class":238},[224,838,731],{"class":238},[224,840,841],{"class":234},"#E4E4E0",[224,843,737],{"class":238},[224,845,740],{"class":238},[224,847,848],{"class":430}," RowRule",[224,850,279],{"class":238},[224,852,731],{"class":238},[224,854,855],{"class":234},"#EDEDEA",[224,857,737],{"class":238},[224,859,740],{"class":238},[224,861,862],{"class":430}," NoticeBorder",[224,864,279],{"class":238},[224,866,731],{"class":238},[224,868,869],{"class":234},"#D8D8D3",[224,871,737],{"class":238},[224,873,783],{"class":238},[224,875,877,880,882,884,887,889,891,894,896,898,900,902],{"class":226,"line":876},56,[224,878,879],{"class":430},"        Ground",[224,881,279],{"class":238},[224,883,731],{"class":238},[224,885,886],{"class":234},"#F7F7F5",[224,888,737],{"class":238},[224,890,740],{"class":238},[224,892,893],{"class":430}," Canvas",[224,895,279],{"class":238},[224,897,731],{"class":238},[224,899,810],{"class":234},[224,901,737],{"class":238},[224,903,783],{"class":238},[224,905,907,910,912,914,917,919,921,924,926,928,931,933,935,938,940,942,945,947],{"class":226,"line":906},57,[224,908,909],{"class":430},"        WarnBg",[224,911,279],{"class":238},[224,913,731],{"class":238},[224,915,916],{"class":234},"#FEF5E0",[224,918,737],{"class":238},[224,920,740],{"class":238},[224,922,923],{"class":430}," WarnBorder",[224,925,279],{"class":238},[224,927,731],{"class":238},[224,929,930],{"class":234},"#F0AE23",[224,932,737],{"class":238},[224,934,740],{"class":238},[224,936,937],{"class":430}," WarnText",[224,939,279],{"class":238},[224,941,731],{"class":238},[224,943,944],{"class":234},"#5A3D04",[224,946,737],{"class":238},[224,948,783],{"class":238},[224,950,952,955,957,959,962,964,966,969,971,973,976,978,980,983,985,987,990,992],{"class":226,"line":951},58,[224,953,954],{"class":430},"        OutOfStock",[224,956,279],{"class":238},[224,958,731],{"class":238},[224,960,961],{"class":234},"#9D1411",[224,963,737],{"class":238},[224,965,740],{"class":238},[224,967,968],{"class":430}," BannerBg",[224,970,279],{"class":238},[224,972,731],{"class":238},[224,974,975],{"class":234},"#FDF0E8",[224,977,737],{"class":238},[224,979,740],{"class":238},[224,981,982],{"class":430}," BannerText",[224,984,279],{"class":238},[224,986,731],{"class":238},[224,988,989],{"class":234},"#822E09",[224,991,737],{"class":238},[224,993,783],{"class":238},[224,995,997,1000,1002,1004,1007,1009,1011,1014,1016,1018,1021,1023,1025,1028,1030,1032,1035,1037,1039,1042,1044,1046,1049,1051],{"class":226,"line":996},59,[224,998,999],{"class":430},"        Warm",[224,1001,279],{"class":238},[224,1003,731],{"class":238},[224,1005,1006],{"class":234},"#F6EDE6",[224,1008,737],{"class":238},[224,1010,740],{"class":238},[224,1012,1013],{"class":430}," Sea",[224,1015,279],{"class":238},[224,1017,731],{"class":238},[224,1019,1020],{"class":234},"#E3F0EE",[224,1022,737],{"class":238},[224,1024,740],{"class":238},[224,1026,1027],{"class":430}," Map",[224,1029,279],{"class":238},[224,1031,731],{"class":238},[224,1033,1034],{"class":234},"#E8F4F3",[224,1036,737],{"class":238},[224,1038,740],{"class":238},[224,1040,1041],{"class":430}," Sun",[224,1043,279],{"class":238},[224,1045,731],{"class":238},[224,1047,1048],{"class":234},"#062320",[224,1050,737],{"class":238},[224,1052,783],{"class":238},[224,1054,1056],{"class":226,"line":1055},60,[224,1057,1058],{"class":238},"    },\n",[224,1060,1062,1065,1067,1069,1071,1074],{"class":226,"line":1061},61,[224,1063,1064],{"class":430},"    Dark",[224,1066,279],{"class":238},[224,1068,713],{"class":230},[224,1070,471],{"class":238},[224,1072,1073],{"class":230},"Dark",[224,1075,702],{"class":238},[224,1077,1079,1082,1084,1086,1089,1091,1093,1096,1098,1100,1103,1105,1107,1110,1112,1114,1117,1119],{"class":226,"line":1078},62,[224,1080,1081],{"class":430},"        Canvas",[224,1083,279],{"class":238},[224,1085,731],{"class":238},[224,1087,1088],{"class":234},"#121615",[224,1090,737],{"class":238},[224,1092,740],{"class":238},[224,1094,1095],{"class":430}," Footer",[224,1097,279],{"class":238},[224,1099,731],{"class":238},[224,1101,1102],{"class":234},"#1A1F1D",[224,1104,737],{"class":238},[224,1106,740],{"class":238},[224,1108,1109],{"class":430}," Hairline",[224,1111,279],{"class":238},[224,1113,731],{"class":238},[224,1115,1116],{"class":234},"#2A302E",[224,1118,737],{"class":238},[224,1120,783],{"class":238},[224,1122,1124,1127,1129,1131,1134,1136,1138,1140,1142,1144,1147,1149],{"class":226,"line":1123},63,[224,1125,1126],{"class":430},"        Headline",[224,1128,279],{"class":238},[224,1130,731],{"class":238},[224,1132,1133],{"class":234},"#F2F2F0",[224,1135,737],{"class":238},[224,1137,740],{"class":238},[224,1139,743],{"class":430},[224,1141,279],{"class":238},[224,1143,731],{"class":238},[224,1145,1146],{"class":234},"#A8ADAB",[224,1148,737],{"class":238},[224,1150,783],{"class":238},[224,1152,1154,1156,1158,1160,1163,1165,1167,1169,1171,1173,1175,1177],{"class":226,"line":1153},64,[224,1155,789],{"class":430},[224,1157,279],{"class":238},[224,1159,731],{"class":238},[224,1161,1162],{"class":234},"#8BC9C3",[224,1164,737],{"class":238},[224,1166,740],{"class":238},[224,1168,803],{"class":430},[224,1170,279],{"class":238},[224,1172,731],{"class":238},[224,1174,1048],{"class":234},[224,1176,737],{"class":238},[224,1178,783],{"class":238},[224,1180,1182,1185,1187,1189,1192,1194,1196,1199,1201,1203,1206,1208],{"class":226,"line":1181},65,[224,1183,1184],{"class":430},"        CurrentStep",[224,1186,279],{"class":238},[224,1188,731],{"class":238},[224,1190,1191],{"class":234},"#EC8A50",[224,1193,737],{"class":238},[224,1195,740],{"class":238},[224,1197,1198],{"class":430}," AccentText",[224,1200,279],{"class":238},[224,1202,731],{"class":238},[224,1204,1205],{"class":234},"#F4B58C",[224,1207,737],{"class":238},[224,1209,783],{"class":238},[224,1211,1213,1216,1218,1220,1223,1225,1227,1229,1231,1233,1235,1237,1239,1242,1244,1246,1249,1251],{"class":226,"line":1212},66,[224,1214,1215],{"class":430},"        BannerBg",[224,1217,279],{"class":238},[224,1219,731],{"class":238},[224,1221,1222],{"class":234},"#2A1A10",[224,1224,737],{"class":238},[224,1226,740],{"class":238},[224,1228,982],{"class":430},[224,1230,279],{"class":238},[224,1232,731],{"class":238},[224,1234,1205],{"class":234},[224,1236,737],{"class":238},[224,1238,740],{"class":238},[224,1240,1241],{"class":430}," Placeholder",[224,1243,279],{"class":238},[224,1245,731],{"class":238},[224,1247,1248],{"class":234},"#1B201E",[224,1250,737],{"class":238},[224,1252,783],{"class":238},[224,1254,1256,1258,1260,1262,1265,1267,1269,1271,1273,1275,1278,1280,1282,1284,1286,1288,1291,1293],{"class":226,"line":1255},67,[224,1257,909],{"class":430},[224,1259,279],{"class":238},[224,1261,731],{"class":238},[224,1263,1264],{"class":234},"#2A2210",[224,1266,737],{"class":238},[224,1268,740],{"class":238},[224,1270,923],{"class":430},[224,1272,279],{"class":238},[224,1274,731],{"class":238},[224,1276,1277],{"class":234},"#6B5314",[224,1279,737],{"class":238},[224,1281,740],{"class":238},[224,1283,937],{"class":430},[224,1285,279],{"class":238},[224,1287,731],{"class":238},[224,1289,1290],{"class":234},"#F0D9A8",[224,1292,737],{"class":238},[224,1294,783],{"class":238},[224,1296,1298,1300,1302,1304,1307,1309],{"class":226,"line":1297},68,[224,1299,954],{"class":430},[224,1301,279],{"class":238},[224,1303,731],{"class":238},[224,1305,1306],{"class":234},"#F08A85",[224,1308,737],{"class":238},[224,1310,783],{"class":238},[224,1312,1314],{"class":226,"line":1313},69,[224,1315,1058],{"class":238},[224,1317,1319,1322,1324,1326,1328,1331],{"class":226,"line":1318},70,[224,1320,1321],{"class":430},"    Fonts",[224,1323,279],{"class":238},[224,1325,713],{"class":230},[224,1327,471],{"class":238},[224,1329,1330],{"class":230},"Fonts",[224,1332,702],{"class":238},[224,1334,1336,1339,1341,1343,1346,1348],{"class":226,"line":1335},71,[224,1337,1338],{"class":430},"        Serif",[224,1340,279],{"class":238},[224,1342,731],{"class":238},[224,1344,1345],{"class":234},"Georgia,'Times New Roman',serif",[224,1347,737],{"class":238},[224,1349,783],{"class":238},[224,1351,1353,1356,1358,1361,1364,1366],{"class":226,"line":1352},72,[224,1354,1355],{"class":430},"        Sans",[224,1357,279],{"class":238},[224,1359,1360],{"class":238},"  \"",[224,1362,1363],{"class":234},"Arial,Helvetica,sans-serif",[224,1365,737],{"class":238},[224,1367,783],{"class":238},[224,1369,1371,1374,1376,1378,1381,1383],{"class":226,"line":1370},73,[224,1372,1373],{"class":430},"        Mono",[224,1375,279],{"class":238},[224,1377,1360],{"class":238},[224,1379,1380],{"class":234},"'Courier New',Courier,monospace",[224,1382,737],{"class":238},[224,1384,783],{"class":238},[224,1386,1388],{"class":226,"line":1387},74,[224,1389,1058],{"class":238},[224,1391,1393,1396,1398,1400,1402,1405,1408,1411,1413,1415,1418,1420,1422,1425,1427,1429,1432,1434,1436,1439,1441,1443,1446,1448,1450,1453,1455,1459],{"class":226,"line":1392},75,[224,1394,1395],{"class":430},"    Brand",[224,1397,279],{"class":238},[224,1399,713],{"class":230},[224,1401,471],{"class":238},[224,1403,1404],{"class":230},"Brand",[224,1406,1407],{"class":238},"{",[224,1409,1410],{"class":430},"Name",[224,1412,279],{"class":238},[224,1414,731],{"class":238},[224,1416,1417],{"class":234},"Acme",[224,1419,737],{"class":238},[224,1421,740],{"class":238},[224,1423,1424],{"class":430}," Logo",[224,1426,279],{"class":238},[224,1428,731],{"class":238},[224,1430,1431],{"class":234},"logo.png",[224,1433,737],{"class":238},[224,1435,740],{"class":238},[224,1437,1438],{"class":430}," LogoDark",[224,1440,279],{"class":238},[224,1442,731],{"class":238},[224,1444,1445],{"class":234},"logo-dark.png",[224,1447,737],{"class":238},[224,1449,740],{"class":238},[224,1451,1452],{"class":430}," LogoSize",[224,1454,279],{"class":238},[224,1456,1458],{"class":1457},"sbssI"," 36",[224,1460,1461],{"class":238},"},\n",[224,1463,1465],{"class":226,"line":1464},76,[224,1466,503],{"class":238},[224,1468,1470],{"class":226,"line":1469},77,[224,1471,299],{"emptyLinePlaceholder":298},[224,1473,1475],{"class":226,"line":1474},78,[224,1476,1477],{"class":402},"\u002F\u002F families is the consumer's family registry. A family fixes the sender,\n",[224,1479,1481],{"class":226,"line":1480},79,[224,1482,1483],{"class":402},"\u002F\u002F the sending stream, the header and footer chrome and the footer copy.\n",[224,1485,1487],{"class":226,"line":1486},80,[224,1488,1489],{"class":402},"\u002F\u002F Copy uses {name} placeholders that are filled at render time.\n",[224,1491,1493,1495,1498,1500,1502,1504,1507,1510,1513,1515,1518],{"class":226,"line":1492},81,[224,1494,686],{"class":238},[224,1496,1497],{"class":430}," families ",[224,1499,535],{"class":238},[224,1501,694],{"class":430},[224,1503,471],{"class":238},[224,1505,1506],{"class":242},"NewRegistry",[224,1508,1509],{"class":238},"(",[224,1511,1512],{"class":230},"lttr",[224,1514,471],{"class":238},[224,1516,1517],{"class":230},"Family",[224,1519,702],{"class":238},[224,1521,1523,1526,1528,1531,1534,1536],{"class":226,"line":1522},82,[224,1524,1525],{"class":430},"    Name",[224,1527,279],{"class":238},[224,1529,1530],{"class":238},"   \"",[224,1532,1533],{"class":234},"orders",[224,1535,737],{"class":238},[224,1537,783],{"class":238},[224,1539,1541,1544,1546,1549,1551,1554,1556,1558,1560,1562,1564,1566,1568,1571,1573,1575,1578,1580],{"class":226,"line":1540},83,[224,1542,1543],{"class":430},"    From",[224,1545,279],{"class":238},[224,1547,1548],{"class":230},"   mail",[224,1550,471],{"class":238},[224,1552,1553],{"class":230},"Address",[224,1555,1407],{"class":238},[224,1557,1410],{"class":430},[224,1559,279],{"class":238},[224,1561,731],{"class":238},[224,1563,1417],{"class":234},[224,1565,737],{"class":238},[224,1567,740],{"class":238},[224,1569,1570],{"class":430}," Address",[224,1572,279],{"class":238},[224,1574,731],{"class":238},[224,1576,1577],{"class":234},"orders@acme.example",[224,1579,737],{"class":238},[224,1581,1461],{"class":238},[224,1583,1585,1588,1590,1592,1594,1597],{"class":226,"line":1584},84,[224,1586,1587],{"class":430},"    Stream",[224,1589,279],{"class":238},[224,1591,694],{"class":430},[224,1593,471],{"class":238},[224,1595,1596],{"class":430},"Transactional",[224,1598,783],{"class":238},[224,1600,1602,1605,1607,1609,1611,1614],{"class":226,"line":1601},85,[224,1603,1604],{"class":430},"    Header",[224,1606,279],{"class":238},[224,1608,694],{"class":430},[224,1610,471],{"class":238},[224,1612,1613],{"class":430},"H1",[224,1615,783],{"class":238},[224,1617,1619,1622,1624,1626,1628,1631],{"class":226,"line":1618},86,[224,1620,1621],{"class":430},"    Footer",[224,1623,279],{"class":238},[224,1625,694],{"class":430},[224,1627,471],{"class":238},[224,1629,1630],{"class":430},"F2",[224,1632,783],{"class":238},[224,1634,1636,1639,1641,1643,1645,1648],{"class":226,"line":1635},87,[224,1637,1638],{"class":430},"    Copy",[224,1640,279],{"class":238},[224,1642,694],{"class":230},[224,1644,471],{"class":238},[224,1646,1647],{"class":230},"FooterCopy",[224,1649,702],{"class":238},[224,1651,1653,1656,1658,1661,1664,1666],{"class":226,"line":1652},88,[224,1654,1655],{"class":430},"        Note",[224,1657,279],{"class":238},[224,1659,1660],{"class":238},"      \"",[224,1662,1663],{"class":234},"Questions? Reply to this email or visit the [Help Centre]({site}\u002Fhelp).",[224,1665,737],{"class":238},[224,1667,783],{"class":238},[224,1669,1671,1674,1676,1679,1682,1684],{"class":226,"line":1670},89,[224,1672,1673],{"class":430},"        About",[224,1675,279],{"class":238},[224,1677,1678],{"class":238},"     \"",[224,1680,1681],{"class":234},"your order",[224,1683,737],{"class":238},[224,1685,783],{"class":238},[224,1687,1689,1692,1694,1696,1699,1701],{"class":226,"line":1688},90,[224,1690,1691],{"class":430},"        Service",[224,1693,279],{"class":238},[224,1695,1530],{"class":238},[224,1697,1698],{"class":234},"This is a service email about {about}. [Notification settings]({prefs})",[224,1700,737],{"class":238},[224,1702,783],{"class":238},[224,1704,1706,1709,1711,1713,1716,1718],{"class":226,"line":1705},91,[224,1707,1708],{"class":430},"        Address",[224,1710,279],{"class":238},[224,1712,1530],{"class":238},[224,1714,1715],{"class":234},"{brand} · {address}",[224,1717,737],{"class":238},[224,1719,783],{"class":238},[224,1721,1723,1726,1728,1731,1733,1735,1738,1741,1744,1746,1748,1751,1753,1755,1758,1760,1762,1765,1767],{"class":226,"line":1722},92,[224,1724,1725],{"class":430},"        TextLinks",[224,1727,279],{"class":238},[224,1729,1730],{"class":238}," []",[224,1732,1512],{"class":230},[224,1734,471],{"class":238},[224,1736,1737],{"class":230},"TextLink",[224,1739,1740],{"class":238},"{{",[224,1742,1743],{"class":430},"Label",[224,1745,279],{"class":238},[224,1747,731],{"class":238},[224,1749,1750],{"class":234},"Notification settings",[224,1752,737],{"class":238},[224,1754,740],{"class":238},[224,1756,1757],{"class":430}," URL",[224,1759,279],{"class":238},[224,1761,731],{"class":238},[224,1763,1764],{"class":234},"{prefs}",[224,1766,737],{"class":238},[224,1768,1769],{"class":238},"}},\n",[224,1771,1773],{"class":226,"line":1772},93,[224,1774,1058],{"class":238},[224,1776,1778,1781,1783,1787],{"class":226,"line":1777},94,[224,1779,1780],{"class":430},"    Tracking",[224,1782,279],{"class":238},[224,1784,1786],{"class":1785},"sfNiH"," true",[224,1788,783],{"class":238},[224,1790,1792],{"class":226,"line":1791},95,[224,1793,1794],{"class":238},"})\n",[224,1796,1798],{"class":226,"line":1797},96,[224,1799,299],{"emptyLinePlaceholder":298},[224,1801,1803],{"class":226,"line":1802},97,[224,1804,1805],{"class":402},"\u002F\u002F Compile once, at init: a template error panics at startup with\n",[224,1807,1809],{"class":226,"line":1808},98,[224,1810,1811],{"class":402},"\u002F\u002F name:line:col, never at send time.\n",[224,1813,1815,1817,1820,1822,1824,1826,1829,1832,1835,1838,1841,1843,1845,1848,1850,1852,1854,1857,1859,1862],{"class":226,"line":1814},99,[224,1816,686],{"class":238},[224,1818,1819],{"class":430}," orderShipped ",[224,1821,535],{"class":238},[224,1823,694],{"class":430},[224,1825,471],{"class":238},[224,1827,1828],{"class":242},"MustCompile",[224,1830,1831],{"class":238},"[",[224,1833,1834],{"class":230},"OrderShipped",[224,1836,1837],{"class":238},"](",[224,1839,1840],{"class":430},"families",[224,1842,740],{"class":238},[224,1844,731],{"class":238},[224,1846,1847],{"class":234},"order.shipped",[224,1849,737],{"class":238},[224,1851,740],{"class":238},[224,1853,1730],{"class":238},[224,1855,1856],{"class":434},"byte",[224,1858,1509],{"class":238},[224,1860,1861],{"class":430},"orderShippedSrc",[224,1863,1864],{"class":238},"))\n",[224,1866,1868],{"class":226,"line":1867},100,[224,1869,299],{"emptyLinePlaceholder":298},[224,1871,1873,1876,1879,1882],{"class":226,"line":1872},101,[224,1874,1875],{"class":238},"func",[224,1877,1878],{"class":242}," main",[224,1880,1881],{"class":238},"()",[224,1883,424],{"class":238},[224,1885,1887,1890,1892,1895,1898,1900,1902,1905,1907,1909,1911,1914],{"class":226,"line":1886},102,[224,1888,1889],{"class":430},"    r",[224,1891,740],{"class":238},[224,1893,1894],{"class":430}," err ",[224,1896,1897],{"class":238},":=",[224,1899,694],{"class":430},[224,1901,471],{"class":238},[224,1903,1904],{"class":242},"NewRenderer",[224,1906,1509],{"class":238},[224,1908,1512],{"class":230},[224,1910,471],{"class":238},[224,1912,1913],{"class":230},"Config",[224,1915,702],{"class":238},[224,1917,1919,1922,1924,1927,1930,1932],{"class":226,"line":1918},103,[224,1920,1921],{"class":430},"        Domain",[224,1923,279],{"class":238},[224,1925,1926],{"class":238},"        \"",[224,1928,1929],{"class":234},"acme.example",[224,1931,737],{"class":238},[224,1933,783],{"class":238},[224,1935,1937,1940,1942,1945,1948,1950],{"class":226,"line":1936},104,[224,1938,1939],{"class":430},"        SiteURL",[224,1941,279],{"class":238},[224,1943,1944],{"class":238},"       \"",[224,1946,1947],{"class":234},"https:\u002F\u002Facme.example",[224,1949,737],{"class":238},[224,1951,783],{"class":238},[224,1953,1955,1958,1960,1962,1965,1967],{"class":226,"line":1954},105,[224,1956,1957],{"class":430},"        AssetBase",[224,1959,279],{"class":238},[224,1961,1678],{"class":238},[224,1963,1964],{"class":234},"https:\u002F\u002Fcdn.acme.example\u002Femail",[224,1966,737],{"class":238},[224,1968,783],{"class":238},[224,1970,1972,1975,1977,1980],{"class":226,"line":1971},106,[224,1973,1974],{"class":430},"        Theme",[224,1976,279],{"class":238},[224,1978,1979],{"class":430},"         brand",[224,1981,783],{"class":238},[224,1983,1985,1988,1990,1993],{"class":226,"line":1984},107,[224,1986,1987],{"class":430},"        Families",[224,1989,279],{"class":238},[224,1991,1992],{"class":430},"      families",[224,1994,783],{"class":238},[224,1996,1998,2001,2003,2006,2008,2011,2013,2015,2018,2020,2022,2025,2027,2029,2032,2034,2036,2038,2041,2043],{"class":226,"line":1997},108,[224,1999,2000],{"class":430},"        Entities",[224,2002,279],{"class":238},[224,2004,2005],{"class":238},"      map[",[224,2007,435],{"class":434},[224,2009,2010],{"class":238},"]",[224,2012,1512],{"class":230},[224,2014,471],{"class":238},[224,2016,2017],{"class":230},"Entity",[224,2019,1407],{"class":238},[224,2021,737],{"class":238},[224,2023,2024],{"class":234},"default",[224,2026,737],{"class":238},[224,2028,279],{"class":238},[224,2030,2031],{"class":238}," {",[224,2033,1553],{"class":430},[224,2035,279],{"class":238},[224,2037,731],{"class":238},[224,2039,2040],{"class":234},"1 Harbour Street, Springfield",[224,2042,737],{"class":238},[224,2044,1769],{"class":238},[224,2046,2048,2051,2053,2055,2057,2059],{"class":226,"line":2047},109,[224,2049,2050],{"class":430},"        DefaultRegion",[224,2052,279],{"class":238},[224,2054,731],{"class":238},[224,2056,2024],{"class":234},[224,2058,737],{"class":238},[224,2060,783],{"class":238},[224,2062,2064],{"class":226,"line":2063},110,[224,2065,2066],{"class":238},"    })\n",[224,2068,2070,2073,2075,2078,2081],{"class":226,"line":2069},111,[224,2071,2072],{"class":304},"    if",[224,2074,1894],{"class":430},[224,2076,2077],{"class":238},"!=",[224,2079,2080],{"class":238}," nil",[224,2082,424],{"class":238},[224,2084,2086,2089,2091,2094,2096,2099,2102],{"class":226,"line":2085},112,[224,2087,2088],{"class":430},"        log",[224,2090,471],{"class":238},[224,2092,2093],{"class":242},"Fatal",[224,2095,1509],{"class":238},[224,2097,2098],{"class":430},"err",[224,2100,2101],{"class":238},")",[224,2103,2104],{"class":402}," \u002F\u002F every config, theme and family problem at once\n",[224,2106,2108],{"class":226,"line":2107},113,[224,2109,2110],{"class":238},"    }\n",[224,2112,2114],{"class":226,"line":2113},114,[224,2115,299],{"emptyLinePlaceholder":298},[224,2117,2119,2122,2124,2126,2128,2131,2133,2136,2138,2141],{"class":226,"line":2118},115,[224,2120,2121],{"class":430},"    msg",[224,2123,740],{"class":238},[224,2125,1894],{"class":430},[224,2127,1897],{"class":238},[224,2129,2130],{"class":430}," orderShipped",[224,2132,471],{"class":238},[224,2134,2135],{"class":242},"Render",[224,2137,1509],{"class":238},[224,2139,2140],{"class":430},"r",[224,2142,783],{"class":238},[224,2144,2146,2149,2151,2154,2156,2158,2160,2162,2165,2167,2169,2172,2174,2176,2179,2181],{"class":226,"line":2145},116,[224,2147,2148],{"class":230},"        lttr",[224,2150,471],{"class":238},[224,2152,2153],{"class":230},"Recipient",[224,2155,1407],{"class":238},[224,2157,1553],{"class":430},[224,2159,279],{"class":238},[224,2161,731],{"class":238},[224,2163,2164],{"class":234},"kim@example.com",[224,2166,737],{"class":238},[224,2168,740],{"class":238},[224,2170,2171],{"class":430}," FirstName",[224,2173,279],{"class":238},[224,2175,731],{"class":238},[224,2177,2178],{"class":234},"Kim",[224,2180,737],{"class":238},[224,2182,1461],{"class":238},[224,2184,2186,2189],{"class":226,"line":2185},117,[224,2187,2188],{"class":230},"        OrderShipped",[224,2190,702],{"class":238},[224,2192,2194,2197,2199,2201,2204,2206],{"class":226,"line":2193},118,[224,2195,2196],{"class":430},"            OrderID",[224,2198,279],{"class":238},[224,2200,1360],{"class":238},[224,2202,2203],{"class":234},"A-1042",[224,2205,737],{"class":238},[224,2207,783],{"class":238},[224,2209,2211,2214,2216,2218,2221,2223],{"class":226,"line":2210},119,[224,2212,2213],{"class":430},"            ETA",[224,2215,279],{"class":238},[224,2217,1660],{"class":238},[224,2219,2220],{"class":234},"5:30 pm",[224,2222,737],{"class":238},[224,2224,783],{"class":238},[224,2226,2228,2231,2233,2236,2238,2241,2243,2246,2249],{"class":226,"line":2227},120,[224,2229,2230],{"class":430},"            Total",[224,2232,279],{"class":238},[224,2234,2235],{"class":430},"    data",[224,2237,471],{"class":238},[224,2239,2240],{"class":242},"USD",[224,2242,1509],{"class":238},[224,2244,2245],{"class":1457},"4250",[224,2247,2248],{"class":238},"),",[224,2250,2251],{"class":402}," \u002F\u002F US$42.50\n",[224,2253,2255,2258,2260,2262,2265,2267],{"class":226,"line":2254},121,[224,2256,2257],{"class":430},"            TrackURL",[224,2259,279],{"class":238},[224,2261,731],{"class":238},[224,2263,2264],{"class":234},"https:\u002F\u002Facme.example\u002Forders\u002FA-1042",[224,2266,737],{"class":238},[224,2268,783],{"class":238},[224,2270,2272],{"class":226,"line":2271},122,[224,2273,2274],{"class":238},"        })\n",[224,2276,2278,2280,2282,2284,2286],{"class":226,"line":2277},123,[224,2279,2072],{"class":304},[224,2281,1894],{"class":430},[224,2283,2077],{"class":238},[224,2285,2080],{"class":238},[224,2287,424],{"class":238},[224,2289,2291,2293,2295,2297,2299,2301],{"class":226,"line":2290},124,[224,2292,2088],{"class":430},[224,2294,471],{"class":238},[224,2296,2093],{"class":242},[224,2298,1509],{"class":238},[224,2300,2098],{"class":430},[224,2302,391],{"class":238},[224,2304,2306],{"class":226,"line":2305},125,[224,2307,2110],{"class":238},[224,2309,2311,2314,2316,2319,2321,2323,2326,2328,2330,2333,2335,2338,2340,2343],{"class":226,"line":2310},126,[224,2312,2313],{"class":430},"    fmt",[224,2315,471],{"class":238},[224,2317,2318],{"class":242},"Println",[224,2320,1509],{"class":238},[224,2322,737],{"class":238},[224,2324,2325],{"class":234},"From:   ",[224,2327,737],{"class":238},[224,2329,740],{"class":238},[224,2331,2332],{"class":430}," msg",[224,2334,471],{"class":238},[224,2336,2337],{"class":430},"From",[224,2339,471],{"class":238},[224,2341,2342],{"class":242},"String",[224,2344,2345],{"class":238},"())\n",[224,2347,2349,2351,2353,2355,2357,2359,2362,2364,2366,2368,2370,2373,2375,2377],{"class":226,"line":2348},127,[224,2350,2313],{"class":430},[224,2352,471],{"class":238},[224,2354,2318],{"class":242},[224,2356,1509],{"class":238},[224,2358,737],{"class":238},[224,2360,2361],{"class":234},"To:     ",[224,2363,737],{"class":238},[224,2365,740],{"class":238},[224,2367,2332],{"class":430},[224,2369,471],{"class":238},[224,2371,2372],{"class":430},"To",[224,2374,471],{"class":238},[224,2376,2342],{"class":242},[224,2378,2345],{"class":238},[224,2380,2382,2384,2386,2388,2390,2392,2395,2397,2399,2401,2403,2406],{"class":226,"line":2381},128,[224,2383,2313],{"class":430},[224,2385,471],{"class":238},[224,2387,2318],{"class":242},[224,2389,1509],{"class":238},[224,2391,737],{"class":238},[224,2393,2394],{"class":234},"Subject:",[224,2396,737],{"class":238},[224,2398,740],{"class":238},[224,2400,2332],{"class":430},[224,2402,471],{"class":238},[224,2404,2405],{"class":430},"Subject",[224,2407,391],{"class":238},[224,2409,2411,2413,2415,2417],{"class":226,"line":2410},129,[224,2412,2313],{"class":430},[224,2414,471],{"class":238},[224,2416,2318],{"class":242},[224,2418,2419],{"class":238},"()\n",[224,2421,2423,2425,2427,2429,2431,2434,2436,2439],{"class":226,"line":2422},130,[224,2424,2313],{"class":430},[224,2426,471],{"class":238},[224,2428,2318],{"class":242},[224,2430,1509],{"class":238},[224,2432,2433],{"class":430},"msg",[224,2435,471],{"class":238},[224,2437,2438],{"class":430},"Text",[224,2440,391],{"class":238},[224,2442,2444],{"class":226,"line":2443},131,[224,2445,299],{"emptyLinePlaceholder":298},[224,2447,2449],{"class":226,"line":2448},132,[224,2450,2451],{"class":402},"    \u002F\u002F One Sender per stream keeps reputations apart. Point Addr at your\n",[224,2453,2455],{"class":226,"line":2454},133,[224,2456,2457],{"class":402},"    \u002F\u002F relay (and set Auth); localhost:1025 is a local catcher such as Mailpit.\n",[224,2459,2461,2464,2466,2469,2471,2473,2476,2478,2481,2483,2486,2488,2490,2493,2495,2497,2499,2502],{"class":226,"line":2460},134,[224,2462,2463],{"class":430},"    router ",[224,2465,1897],{"class":238},[224,2467,2468],{"class":238}," &",[224,2470,1512],{"class":230},[224,2472,471],{"class":238},[224,2474,2475],{"class":230},"Router",[224,2477,1407],{"class":238},[224,2479,2480],{"class":430},"Streams",[224,2482,279],{"class":238},[224,2484,2485],{"class":238}," map[",[224,2487,1512],{"class":230},[224,2489,471],{"class":238},[224,2491,2492],{"class":230},"Stream",[224,2494,2010],{"class":238},[224,2496,1512],{"class":230},[224,2498,471],{"class":238},[224,2500,2501],{"class":230},"Sender",[224,2503,702],{"class":238},[224,2505,2507,2509,2511,2513,2515,2517,2519,2521,2523,2525,2528,2530,2532,2535,2537],{"class":226,"line":2506},135,[224,2508,2148],{"class":430},[224,2510,471],{"class":238},[224,2512,1596],{"class":430},[224,2514,279],{"class":238},[224,2516,2468],{"class":238},[224,2518,1512],{"class":230},[224,2520,471],{"class":238},[224,2522,120],{"class":230},[224,2524,1407],{"class":238},[224,2526,2527],{"class":430},"Addr",[224,2529,279],{"class":238},[224,2531,731],{"class":238},[224,2533,2534],{"class":234},"localhost:1025",[224,2536,737],{"class":238},[224,2538,1461],{"class":238},[224,2540,2542],{"class":226,"line":2541},136,[224,2543,2544],{"class":238},"    }}\n",[224,2546,2548,2550,2552,2554,2557,2559,2562,2564,2566,2568,2571,2574,2576,2579,2581,2583,2585],{"class":226,"line":2547},137,[224,2549,2072],{"class":304},[224,2551,1894],{"class":430},[224,2553,1897],{"class":238},[224,2555,2556],{"class":430}," router",[224,2558,471],{"class":238},[224,2560,2561],{"class":242},"Send",[224,2563,1509],{"class":238},[224,2565,317],{"class":430},[224,2567,471],{"class":238},[224,2569,2570],{"class":242},"Background",[224,2572,2573],{"class":238},"(),",[224,2575,2332],{"class":430},[224,2577,2578],{"class":238},");",[224,2580,1894],{"class":430},[224,2582,2077],{"class":238},[224,2584,2080],{"class":238},[224,2586,424],{"class":238},[224,2588,2590,2592,2594,2596,2598,2600],{"class":226,"line":2589},138,[224,2591,2088],{"class":430},[224,2593,471],{"class":238},[224,2595,2093],{"class":242},[224,2597,1509],{"class":238},[224,2599,2098],{"class":430},[224,2601,391],{"class":238},[224,2603,2605],{"class":226,"line":2604},139,[224,2606,2110],{"class":238},[224,2608,2610,2612,2614,2616,2618,2620,2623,2625,2627,2629,2631,2633,2635,2637],{"class":226,"line":2609},140,[224,2611,2313],{"class":430},[224,2613,471],{"class":238},[224,2615,2318],{"class":242},[224,2617,1509],{"class":238},[224,2619,737],{"class":238},[224,2621,2622],{"class":234},"sent to",[224,2624,737],{"class":238},[224,2626,740],{"class":238},[224,2628,2332],{"class":430},[224,2630,471],{"class":238},[224,2632,2372],{"class":430},[224,2634,471],{"class":238},[224,2636,1553],{"class":430},[224,2638,391],{"class":238},[224,2640,2642],{"class":226,"line":2641},141,[224,2643,503],{"class":238},[197,2645,2646,2647,2649,2650,2656,2657,2661],{},"The program sends to an SMTP server on ",[221,2648,2534],{},". Start a local catcher such as ",[209,2651,2655],{"href":2652,"rel":2653},"https:\u002F\u002Fmailpit.axllent.org",[2654],"nofollow","Mailpit",", which listens on that port and shows what arrives at ",[209,2658,2659],{"href":2659,"rel":2660},"http:\u002F\u002Flocalhost:8025",[2654],", then run it:",[213,2663,2665],{"className":215,"code":2664,"filename":217,"language":218,"meta":219,"style":219},"mailpit &\ngo run .\n",[221,2666,2667,2675],{"__ignoreMap":219},[224,2668,2669,2672],{"class":226,"line":227},[224,2670,2671],{"class":230},"mailpit",[224,2673,2674],{"class":238}," &\n",[224,2676,2677,2679,2682],{"class":226,"line":249},[224,2678,252],{"class":230},[224,2680,2681],{"class":234}," run",[224,2683,2684],{"class":234}," .\n",[213,2686,2692],{"className":2687,"code":2689,"filename":2690,"language":2691,"meta":219},[2688],"language-text","From:    \"Acme\" \u003Corders@acme.example>\nTo:      \"Kim\" \u003Ckim@example.com>\nSubject: Order A-1042 is on its way\n\nACME\n\nORDER A-1042\n\nOn its way.\n\nHi Kim, your order will reach you by 5:30 pm.\n\nTrack delivery:\nhttps:\u002F\u002Facme.example\u002Forders\u002FA-1042\n\nOrder total ..................... US$42.50\nDelivery ........................ Free\n\nThanks,\nThe Acme team\n\nQuestions? Reply to this email or visit the Help Centre\n(https:\u002F\u002Facme.example\u002Fhelp).\n\n--\nAcme · 1 Harbour Street, Springfield\nNotification settings: https:\u002F\u002Facme.example\u002Fpreferences\n\nsent to kim@example.com\n","Output","text",[221,2693,2689],{"__ignoreMap":219},[197,2695,2696,2697,2700,2701,471],{},"The text part above is one half of the message. The other half, ",[221,2698,2699],{},"msg.HTML",", is the table-based HTML email with the Acme logo, the pill button and the footer, and in Mailpit you can see both. Without a catcher, everything up to the send still runs, and the program exits at the last step with ",[221,2702,2703],{},"smtp: dial localhost:1025: … connection refused",[201,2705,2707],{"id":2706},"define-the-data","Define the data",[197,2709,2710],{},"Each template has a Go data type, and every merge tag in the template must resolve to a field of it.",[213,2712,2714],{"className":282,"code":2713,"filename":278,"language":252,"meta":219,"style":219},"type OrderShipped struct {\n    OrderID  string     `json:\"order_id\"`\n    ETA      string     `json:\"eta\"`\n    Total    data.Money `json:\"total\"`\n    TrackURL string     `json:\"track_url\"`\n}\n",[221,2715,2716,2726,2738,2750,2766,2778],{"__ignoreMap":219},[224,2717,2718,2720,2722,2724],{"class":226,"line":227},[224,2719,415],{"class":238},[224,2721,418],{"class":230},[224,2723,421],{"class":238},[224,2725,424],{"class":238},[224,2727,2728,2730,2732,2734,2736],{"class":226,"line":249},[224,2729,431],{"class":430},[224,2731,435],{"class":434},[224,2733,438],{"class":238},[224,2735,441],{"class":234},[224,2737,444],{"class":238},[224,2739,2740,2742,2744,2746,2748],{"class":226,"line":264},[224,2741,450],{"class":430},[224,2743,435],{"class":434},[224,2745,438],{"class":238},[224,2747,457],{"class":234},[224,2749,444],{"class":238},[224,2751,2752,2754,2756,2758,2760,2762,2764],{"class":226,"line":311},[224,2753,465],{"class":430},[224,2755,468],{"class":230},[224,2757,471],{"class":238},[224,2759,474],{"class":230},[224,2761,477],{"class":238},[224,2763,480],{"class":234},[224,2765,444],{"class":238},[224,2767,2768,2770,2772,2774,2776],{"class":226,"line":323},[224,2769,488],{"class":430},[224,2771,435],{"class":434},[224,2773,438],{"class":238},[224,2775,495],{"class":234},[224,2777,444],{"class":238},[224,2779,2780],{"class":226,"line":333},[224,2781,503],{"class":238},[197,2783,2784,2785,2788,2789,2792,2793,2796,2797,2800,2801,2804,2805,2808,2809,2811,2812,2815,2816,471],{},"A merge tag matches a field by its JSON name, or by its lower-cased Go name when there is no ",[221,2786,2787],{},"json"," tag, so ",[221,2790,2791],{},"{{order_id}}"," is ",[221,2794,2795],{},"OrderID",". A tag must resolve to a scalar: a string or integer kind, ",[221,2798,2799],{},"data.Money",", ",[221,2802,2803],{},"data.Exact"," or any ",[221,2806,2807],{},"fmt.Stringer",". ",[221,2810,2799],{}," holds an amount in minor units and a currency, and formats itself: ",[221,2813,2814],{},"data.USD(4250)"," renders as ",[221,2817,2818],{},"US$42.50",[197,2820,2821,2822,2824,2825,2827,2828,2831,2832,2835,2836,2838],{},"Names your type does not have are looked up on the ",[221,2823,2153],{}," next. ",[221,2826,1834],{}," has no ",[221,2829,2830],{},"first_name",", so ",[221,2833,2834],{},"{{first_name}}"," is the recipient's first name. See ",[209,2837,53],{"href":54}," for paths, fallbacks and structured values.",[201,2840,2842],{"id":2841},"write-the-template","Write the template",[197,2844,2845,2846,2849,2850,471],{},"The template is Markdown with YAML frontmatter. The program keeps it in a string constant; in a service it usually lives in a ",[221,2847,2848],{},".md"," file embedded with ",[221,2851,2852],{},"\u002F\u002Fgo:embed",[213,2854,2859],{"className":2855,"code":2856,"filename":2857,"language":2858,"meta":219,"style":219},"language-markdown shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","---\ntemplate: order.shipped\nfamily: orders\nsubject: \"Order {{order_id}} is on its way\"\npreheader: \"Arriving by {{eta}}.\"\n---\n\n::statement{eyebrow=\"Order {{order_id}}\"}\n# On its way.\n\nHi {{first_name | there}}, your order will reach you by {{eta}}.\n\n:button[Track delivery]{href=\"{{track_url}}\"}\n::\n\n::breakdown\n| Order total | {{total}} |\n| --- | ---: |\n| Delivery | Free |\n::\n\n::signoff\n::\n","templates\u002Forder.md","markdown",[221,2860,2861,2865,2869,2873,2877,2881,2885,2889,2893,2901,2905,2909,2913,2917,2921,2925,2929,2945,2961,2975,2979,2983,2987],{"__ignoreMap":219},[224,2862,2863],{"class":226,"line":227},[224,2864,540],{"class":430},[224,2866,2867],{"class":226,"line":249},[224,2868,546],{"class":430},[224,2870,2871],{"class":226,"line":264},[224,2872,552],{"class":430},[224,2874,2875],{"class":226,"line":311},[224,2876,558],{"class":430},[224,2878,2879],{"class":226,"line":323},[224,2880,564],{"class":430},[224,2882,2883],{"class":226,"line":333},[224,2884,540],{"class":238},[224,2886,2887],{"class":226,"line":343},[224,2888,299],{"emptyLinePlaceholder":298},[224,2890,2891],{"class":226,"line":353},[224,2892,580],{"class":430},[224,2894,2895,2898],{"class":226,"line":358},[224,2896,2897],{"class":238},"# ",[224,2899,2900],{"class":230},"On its way.\n",[224,2902,2903],{"class":226,"line":368},[224,2904,299],{"emptyLinePlaceholder":298},[224,2906,2907],{"class":226,"line":378},[224,2908,597],{"class":430},[224,2910,2911],{"class":226,"line":388},[224,2912,299],{"emptyLinePlaceholder":298},[224,2914,2915],{"class":226,"line":394},[224,2916,608],{"class":430},[224,2918,2919],{"class":226,"line":399},[224,2920,614],{"class":430},[224,2922,2923],{"class":226,"line":406},[224,2924,299],{"emptyLinePlaceholder":298},[224,2926,2927],{"class":226,"line":412},[224,2928,625],{"class":430},[224,2930,2931,2934,2937,2939,2942],{"class":226,"line":427},[224,2932,2933],{"class":238},"|",[224,2935,2936],{"class":430}," Order total ",[224,2938,2933],{"class":238},[224,2940,2941],{"class":430}," {{total}} ",[224,2943,2944],{"class":238},"|\n",[224,2946,2947,2949,2952,2955,2958],{"class":226,"line":447},[224,2948,2933],{"class":238},[224,2950,2951],{"class":238}," ---",[224,2953,2954],{"class":238}," |",[224,2956,2957],{"class":238}," ---:",[224,2959,2960],{"class":238}," |\n",[224,2962,2963,2965,2968,2970,2973],{"class":226,"line":462},[224,2964,2933],{"class":238},[224,2966,2967],{"class":430}," Delivery ",[224,2969,2933],{"class":238},[224,2971,2972],{"class":430}," Free ",[224,2974,2944],{"class":238},[224,2976,2977],{"class":226,"line":485},[224,2978,614],{"class":430},[224,2980,2981],{"class":226,"line":500},[224,2982,299],{"emptyLinePlaceholder":298},[224,2984,2985],{"class":226,"line":506},[224,2986,659],{"class":430},[224,2988,2989],{"class":226,"line":511},[224,2990,614],{"class":430},[2992,2993,2994,3002,3008,3014,3020],"ul",{},[2995,2996,2997,2998,3001],"li",{},"The frontmatter names the template (it must equal the name passed to ",[221,2999,3000],{},"Compile",") and its family, and holds the subject and the preheader, the preview line an inbox shows after the subject.",[2995,3003,3004,3007],{},[221,3005,3006],{},"::statement"," is the hero: an eyebrow, one heading, a paragraph and the email's one primary button.",[2995,3009,3010,3013],{},[221,3011,3012],{},"::breakdown"," is a two-column table. Its header row renders as an ordinary row.",[2995,3015,3016,3019],{},[221,3017,3018],{},"::signoff"," closes the email with the default closing and name, which here read \"Thanks,\" and \"The Acme team\".",[2995,3021,3022,3025],{},[221,3023,3024],{},"{{first_name | there}}"," falls back to \"there\" when the recipient has no first name. A merge tag with no value and no fallback is a render error.",[197,3027,3028,3029,3032,3033,3036,3037,3040],{},"Every tag is checked when the template compiles. Misspell ",[221,3030,3031],{},"{{eta}}"," as ",[221,3034,3035],{},"{{etaa}}"," and the program stops before ",[221,3038,3039],{},"main"," runs:",[213,3042,3045],{"className":3043,"code":3044,"filename":2690,"language":2691,"meta":219},[2688],"panic: order.shipped:11:57: unknown name \"etaa\"\n",[221,3046,3044],{"__ignoreMap":219},[197,3048,3049,3050,3053],{},"The position is the line and column in the template source. The ",[209,3051,3052],{"href":49},"module catalogue"," lists every component you can use.",[201,3055,3057],{"id":3056},"describe-a-family","Describe a family",[197,3059,3060,3061,3064],{},"A family is a kind of email you send. The template names it in ",[221,3062,3063],{},"family: orders",", and the family supplies everything the template does not: the sender, the stream, the header and footer, and the footer copy.",[213,3066,3068],{"className":282,"code":3067,"filename":278,"language":252,"meta":219,"style":219},"var families = lttr.NewRegistry(lttr.Family{\n    Name:   \"orders\",\n    From:   mail.Address{Name: \"Acme\", Address: \"orders@acme.example\"},\n    Stream: lttr.Transactional,\n    Header: lttr.H1,\n    Footer: lttr.F2,\n    Copy: lttr.FooterCopy{\n        Note:      \"Questions? Reply to this email or visit the [Help Centre]({site}\u002Fhelp).\",\n        About:     \"your order\",\n        Service:   \"This is a service email about {about}. [Notification settings]({prefs})\",\n        Address:   \"{brand} · {address}\",\n        TextLinks: []lttr.TextLink{{Label: \"Notification settings\", URL: \"{prefs}\"}},\n    },\n    Tracking: true,\n})\n",[221,3069,3070,3094,3108,3146,3160,3174,3188,3202,3216,3230,3244,3258,3298,3302,3312],{"__ignoreMap":219},[224,3071,3072,3074,3076,3078,3080,3082,3084,3086,3088,3090,3092],{"class":226,"line":227},[224,3073,686],{"class":238},[224,3075,1497],{"class":430},[224,3077,535],{"class":238},[224,3079,694],{"class":430},[224,3081,471],{"class":238},[224,3083,1506],{"class":242},[224,3085,1509],{"class":238},[224,3087,1512],{"class":230},[224,3089,471],{"class":238},[224,3091,1517],{"class":230},[224,3093,702],{"class":238},[224,3095,3096,3098,3100,3102,3104,3106],{"class":226,"line":249},[224,3097,1525],{"class":430},[224,3099,279],{"class":238},[224,3101,1530],{"class":238},[224,3103,1533],{"class":234},[224,3105,737],{"class":238},[224,3107,783],{"class":238},[224,3109,3110,3112,3114,3116,3118,3120,3122,3124,3126,3128,3130,3132,3134,3136,3138,3140,3142,3144],{"class":226,"line":264},[224,3111,1543],{"class":430},[224,3113,279],{"class":238},[224,3115,1548],{"class":230},[224,3117,471],{"class":238},[224,3119,1553],{"class":230},[224,3121,1407],{"class":238},[224,3123,1410],{"class":430},[224,3125,279],{"class":238},[224,3127,731],{"class":238},[224,3129,1417],{"class":234},[224,3131,737],{"class":238},[224,3133,740],{"class":238},[224,3135,1570],{"class":430},[224,3137,279],{"class":238},[224,3139,731],{"class":238},[224,3141,1577],{"class":234},[224,3143,737],{"class":238},[224,3145,1461],{"class":238},[224,3147,3148,3150,3152,3154,3156,3158],{"class":226,"line":311},[224,3149,1587],{"class":430},[224,3151,279],{"class":238},[224,3153,694],{"class":430},[224,3155,471],{"class":238},[224,3157,1596],{"class":430},[224,3159,783],{"class":238},[224,3161,3162,3164,3166,3168,3170,3172],{"class":226,"line":323},[224,3163,1604],{"class":430},[224,3165,279],{"class":238},[224,3167,694],{"class":430},[224,3169,471],{"class":238},[224,3171,1613],{"class":430},[224,3173,783],{"class":238},[224,3175,3176,3178,3180,3182,3184,3186],{"class":226,"line":333},[224,3177,1621],{"class":430},[224,3179,279],{"class":238},[224,3181,694],{"class":430},[224,3183,471],{"class":238},[224,3185,1630],{"class":430},[224,3187,783],{"class":238},[224,3189,3190,3192,3194,3196,3198,3200],{"class":226,"line":343},[224,3191,1638],{"class":430},[224,3193,279],{"class":238},[224,3195,694],{"class":230},[224,3197,471],{"class":238},[224,3199,1647],{"class":230},[224,3201,702],{"class":238},[224,3203,3204,3206,3208,3210,3212,3214],{"class":226,"line":353},[224,3205,1655],{"class":430},[224,3207,279],{"class":238},[224,3209,1660],{"class":238},[224,3211,1663],{"class":234},[224,3213,737],{"class":238},[224,3215,783],{"class":238},[224,3217,3218,3220,3222,3224,3226,3228],{"class":226,"line":358},[224,3219,1673],{"class":430},[224,3221,279],{"class":238},[224,3223,1678],{"class":238},[224,3225,1681],{"class":234},[224,3227,737],{"class":238},[224,3229,783],{"class":238},[224,3231,3232,3234,3236,3238,3240,3242],{"class":226,"line":368},[224,3233,1691],{"class":430},[224,3235,279],{"class":238},[224,3237,1530],{"class":238},[224,3239,1698],{"class":234},[224,3241,737],{"class":238},[224,3243,783],{"class":238},[224,3245,3246,3248,3250,3252,3254,3256],{"class":226,"line":378},[224,3247,1708],{"class":430},[224,3249,279],{"class":238},[224,3251,1530],{"class":238},[224,3253,1715],{"class":234},[224,3255,737],{"class":238},[224,3257,783],{"class":238},[224,3259,3260,3262,3264,3266,3268,3270,3272,3274,3276,3278,3280,3282,3284,3286,3288,3290,3292,3294,3296],{"class":226,"line":388},[224,3261,1725],{"class":430},[224,3263,279],{"class":238},[224,3265,1730],{"class":238},[224,3267,1512],{"class":230},[224,3269,471],{"class":238},[224,3271,1737],{"class":230},[224,3273,1740],{"class":238},[224,3275,1743],{"class":430},[224,3277,279],{"class":238},[224,3279,731],{"class":238},[224,3281,1750],{"class":234},[224,3283,737],{"class":238},[224,3285,740],{"class":238},[224,3287,1757],{"class":430},[224,3289,279],{"class":238},[224,3291,731],{"class":238},[224,3293,1764],{"class":234},[224,3295,737],{"class":238},[224,3297,1769],{"class":238},[224,3299,3300],{"class":226,"line":394},[224,3301,1058],{"class":238},[224,3303,3304,3306,3308,3310],{"class":226,"line":399},[224,3305,1780],{"class":430},[224,3307,279],{"class":238},[224,3309,1786],{"class":1785},[224,3311,783],{"class":238},[224,3313,3314],{"class":226,"line":406},[224,3315,1794],{"class":238},[2992,3317,3318,3329,3337,3366],{},[2995,3319,3320,3322,3323,3325,3326,3328],{},[221,3321,2492],{}," decides which ",[221,3324,2501],{}," the message goes through. ",[221,3327,1596],{}," is mail the recipient triggered.",[2995,3330,3331,3333,3334,3336],{},[221,3332,1613],{}," is the logo header. ",[221,3335,1630],{}," is the service footer: a note, a \"service email about …\" line and the address.",[2995,3338,3339,3340,3343,3344,3347,3348,2800,3351,3354,3355,3358,3359,3361,3362,3365],{},"The copy is Markdown with ",[221,3341,3342],{},"{name}"," placeholders, filled per message: ",[221,3345,3346],{},"{site}"," from ",[221,3349,3350],{},"Config.SiteURL",[221,3352,3353],{},"{brand}"," from the theme, ",[221,3356,3357],{},"{address}"," from the recipient's region, ",[221,3360,1764],{}," from the recipient's preferences URL or ",[221,3363,3364],{},"{site}\u002Fpreferences",". Merge tags are not allowed in copy.",[2995,3367,3368,3371],{},[221,3369,3370],{},"TextLinks"," are the URLs the text part prints under the footer, since plain text cannot link a phrase.",[197,3373,3374,3376,3377,3379],{},[221,3375,3000],{}," applies the family's rules, such as the modules it forbids, so a template that breaks them fails at startup too. ",[209,3378,74],{"href":75}," covers every field.",[201,3381,3383],{"id":3382},"build-the-registry-and-renderer","Build the registry and renderer",[197,3385,3386,3389,3390,3392],{},[221,3387,3388],{},"lttr.NewRegistry"," collects the families, and ",[221,3391,1828],{}," compiles the template against the registry and the data type:",[213,3394,3396],{"className":282,"code":3395,"filename":278,"language":252,"meta":219,"style":219},"var orderShipped = lttr.MustCompile[OrderShipped](families, \"order.shipped\", []byte(orderShippedSrc))\n",[221,3397,3398],{"__ignoreMap":219},[224,3399,3400,3402,3404,3406,3408,3410,3412,3414,3416,3418,3420,3422,3424,3426,3428,3430,3432,3434,3436,3438],{"class":226,"line":227},[224,3401,686],{"class":238},[224,3403,1819],{"class":430},[224,3405,535],{"class":238},[224,3407,694],{"class":430},[224,3409,471],{"class":238},[224,3411,1828],{"class":242},[224,3413,1831],{"class":238},[224,3415,1834],{"class":230},[224,3417,1837],{"class":238},[224,3419,1840],{"class":430},[224,3421,740],{"class":238},[224,3423,731],{"class":238},[224,3425,1847],{"class":234},[224,3427,737],{"class":238},[224,3429,740],{"class":238},[224,3431,1730],{"class":238},[224,3433,1856],{"class":434},[224,3435,1509],{"class":238},[224,3437,1861],{"class":430},[224,3439,1864],{"class":238},[197,3441,3442,3443,3445,3446,3448],{},"Keep it in a package-level ",[221,3444,686],{},", so a broken template panics when the program starts rather than when the first order ships. Use ",[221,3447,3000],{}," instead when the source comes from somewhere you don't control; it returns every error at once.",[197,3450,3451],{},"The renderer holds everything that is the same for every message: your domain and site, where the logo files live, the theme, the families and the legal entity per region.",[213,3453,3455],{"className":282,"code":3454,"filename":278,"language":252,"meta":219,"style":219},"r, err := lttr.NewRenderer(lttr.Config{\n    Domain:        \"acme.example\",\n    SiteURL:       \"https:\u002F\u002Facme.example\",\n    AssetBase:     \"https:\u002F\u002Fcdn.acme.example\u002Femail\",\n    Theme:         brand,\n    Families:      families,\n    Entities:      map[string]lttr.Entity{\"default\": {Address: \"1 Harbour Street, Springfield\"}},\n    DefaultRegion: \"default\",\n})\n",[221,3456,3457,3483,3498,3513,3528,3539,3550,3593,3608],{"__ignoreMap":219},[224,3458,3459,3461,3463,3465,3467,3469,3471,3473,3475,3477,3479,3481],{"class":226,"line":227},[224,3460,2140],{"class":430},[224,3462,740],{"class":238},[224,3464,1894],{"class":430},[224,3466,1897],{"class":238},[224,3468,694],{"class":430},[224,3470,471],{"class":238},[224,3472,1904],{"class":242},[224,3474,1509],{"class":238},[224,3476,1512],{"class":230},[224,3478,471],{"class":238},[224,3480,1913],{"class":230},[224,3482,702],{"class":238},[224,3484,3485,3488,3490,3492,3494,3496],{"class":226,"line":249},[224,3486,3487],{"class":430},"    Domain",[224,3489,279],{"class":238},[224,3491,1926],{"class":238},[224,3493,1929],{"class":234},[224,3495,737],{"class":238},[224,3497,783],{"class":238},[224,3499,3500,3503,3505,3507,3509,3511],{"class":226,"line":264},[224,3501,3502],{"class":430},"    SiteURL",[224,3504,279],{"class":238},[224,3506,1944],{"class":238},[224,3508,1947],{"class":234},[224,3510,737],{"class":238},[224,3512,783],{"class":238},[224,3514,3515,3518,3520,3522,3524,3526],{"class":226,"line":311},[224,3516,3517],{"class":430},"    AssetBase",[224,3519,279],{"class":238},[224,3521,1678],{"class":238},[224,3523,1964],{"class":234},[224,3525,737],{"class":238},[224,3527,783],{"class":238},[224,3529,3530,3533,3535,3537],{"class":226,"line":323},[224,3531,3532],{"class":430},"    Theme",[224,3534,279],{"class":238},[224,3536,1979],{"class":430},[224,3538,783],{"class":238},[224,3540,3541,3544,3546,3548],{"class":226,"line":333},[224,3542,3543],{"class":430},"    Families",[224,3545,279],{"class":238},[224,3547,1992],{"class":430},[224,3549,783],{"class":238},[224,3551,3552,3555,3557,3559,3561,3563,3565,3567,3569,3571,3573,3575,3577,3579,3581,3583,3585,3587,3589,3591],{"class":226,"line":343},[224,3553,3554],{"class":430},"    Entities",[224,3556,279],{"class":238},[224,3558,2005],{"class":238},[224,3560,435],{"class":434},[224,3562,2010],{"class":238},[224,3564,1512],{"class":230},[224,3566,471],{"class":238},[224,3568,2017],{"class":230},[224,3570,1407],{"class":238},[224,3572,737],{"class":238},[224,3574,2024],{"class":234},[224,3576,737],{"class":238},[224,3578,279],{"class":238},[224,3580,2031],{"class":238},[224,3582,1553],{"class":430},[224,3584,279],{"class":238},[224,3586,731],{"class":238},[224,3588,2040],{"class":234},[224,3590,737],{"class":238},[224,3592,1769],{"class":238},[224,3594,3595,3598,3600,3602,3604,3606],{"class":226,"line":353},[224,3596,3597],{"class":430},"    DefaultRegion",[224,3599,279],{"class":238},[224,3601,731],{"class":238},[224,3603,2024],{"class":234},[224,3605,737],{"class":238},[224,3607,783],{"class":238},[224,3609,3610],{"class":226,"line":358},[224,3611,1794],{"class":238},[197,3613,3614,3616,3617,3620,3621,3624,3625,3628,3629,3632,3633,3636,3637,3639,3640,471],{},[221,3615,1904],{}," validates all of it and returns every problem at once: a ",[221,3618,3619],{},"SiteURL"," that is not absolute https, a colour that is not ",[221,3622,3623],{},"#RRGGBB",", a sender outside the family's domain, footer copy with an unknown placeholder. The theme (",[221,3626,3627],{},"brand"," in the program) sets both palettes, the three font stacks and the logo files, which are loaded from ",[221,3630,3631],{},"AssetBase","; every colour must be set. A ",[221,3634,3635],{},"Renderer"," is immutable and safe for concurrent use, so build one and share it. See ",[209,3638,84],{"href":85}," and ",[209,3641,79],{"href":80},[201,3643,3645],{"id":3644},"render-and-send","Render and send",[197,3647,3648,3650,3651,279],{},[221,3649,2135],{}," takes the renderer, the recipient and the data, and returns a ",[221,3652,3653],{},"*lttr.Message",[213,3655,3657],{"className":282,"code":3656,"filename":278,"language":252,"meta":219,"style":219},"msg, err := orderShipped.Render(r,\n    lttr.Recipient{Address: \"kim@example.com\", FirstName: \"Kim\"},\n    OrderShipped{\n        OrderID:  \"A-1042\",\n        ETA:      \"5:30 pm\",\n        Total:    data.USD(4250), \u002F\u002F US$42.50\n        TrackURL: \"https:\u002F\u002Facme.example\u002Forders\u002FA-1042\",\n    })\n",[221,3658,3659,3681,3716,3723,3738,3753,3774,3789],{"__ignoreMap":219},[224,3660,3661,3663,3665,3667,3669,3671,3673,3675,3677,3679],{"class":226,"line":227},[224,3662,2433],{"class":430},[224,3664,740],{"class":238},[224,3666,1894],{"class":430},[224,3668,1897],{"class":238},[224,3670,2130],{"class":430},[224,3672,471],{"class":238},[224,3674,2135],{"class":242},[224,3676,1509],{"class":238},[224,3678,2140],{"class":430},[224,3680,783],{"class":238},[224,3682,3683,3686,3688,3690,3692,3694,3696,3698,3700,3702,3704,3706,3708,3710,3712,3714],{"class":226,"line":249},[224,3684,3685],{"class":230},"    lttr",[224,3687,471],{"class":238},[224,3689,2153],{"class":230},[224,3691,1407],{"class":238},[224,3693,1553],{"class":430},[224,3695,279],{"class":238},[224,3697,731],{"class":238},[224,3699,2164],{"class":234},[224,3701,737],{"class":238},[224,3703,740],{"class":238},[224,3705,2171],{"class":430},[224,3707,279],{"class":238},[224,3709,731],{"class":238},[224,3711,2178],{"class":234},[224,3713,737],{"class":238},[224,3715,1461],{"class":238},[224,3717,3718,3721],{"class":226,"line":264},[224,3719,3720],{"class":230},"    OrderShipped",[224,3722,702],{"class":238},[224,3724,3725,3728,3730,3732,3734,3736],{"class":226,"line":311},[224,3726,3727],{"class":430},"        OrderID",[224,3729,279],{"class":238},[224,3731,1360],{"class":238},[224,3733,2203],{"class":234},[224,3735,737],{"class":238},[224,3737,783],{"class":238},[224,3739,3740,3743,3745,3747,3749,3751],{"class":226,"line":323},[224,3741,3742],{"class":430},"        ETA",[224,3744,279],{"class":238},[224,3746,1660],{"class":238},[224,3748,2220],{"class":234},[224,3750,737],{"class":238},[224,3752,783],{"class":238},[224,3754,3755,3758,3760,3762,3764,3766,3768,3770,3772],{"class":226,"line":333},[224,3756,3757],{"class":430},"        Total",[224,3759,279],{"class":238},[224,3761,2235],{"class":430},[224,3763,471],{"class":238},[224,3765,2240],{"class":242},[224,3767,1509],{"class":238},[224,3769,2245],{"class":1457},[224,3771,2248],{"class":238},[224,3773,2251],{"class":402},[224,3775,3776,3779,3781,3783,3785,3787],{"class":226,"line":343},[224,3777,3778],{"class":430},"        TrackURL",[224,3780,279],{"class":238},[224,3782,731],{"class":238},[224,3784,2264],{"class":234},[224,3786,737],{"class":238},[224,3788,783],{"class":238},[224,3790,3791],{"class":226,"line":353},[224,3792,2066],{"class":238},[197,3794,3795,3796,471],{},"Render checks everything that depends on the data: a merge tag with no value and no fallback, a URL that is invalid or uses a scheme that is not allowed, an empty subject, a recipient with no entity address, HTML of 100 KB or more (Gmail clips at 102 KB). It returns either a complete message or an error, never a partial message. Non-fatal findings, such as HTML over 90 KB, are in ",[221,3797,3798],{},"msg.Warnings",[197,3800,3801,3802,2800,3804,2800,3806,3808,3809,2800,3812,3814,3815,3817,3818,3820],{},"The message carries the envelope (",[221,3803,2337],{},[221,3805,2372],{},[221,3807,2405],{},"), the stream, and both bodies (",[221,3810,3811],{},"HTML",[221,3813,2438],{},"). A ",[221,3816,2475],{}," sends it through the ",[221,3819,2501],{}," for its stream:",[213,3822,3824],{"className":282,"code":3823,"filename":278,"language":252,"meta":219,"style":219},"router := &lttr.Router{Streams: map[lttr.Stream]lttr.Sender{\n    lttr.Transactional: &lttr.SMTP{Addr: \"localhost:1025\"},\n}}\nif err := router.Send(context.Background(), msg); err != nil {\n    log.Fatal(err)\n}\n",[221,3825,3826,3865,3897,3902,3939,3954],{"__ignoreMap":219},[224,3827,3828,3831,3833,3835,3837,3839,3841,3843,3845,3847,3849,3851,3853,3855,3857,3859,3861,3863],{"class":226,"line":227},[224,3829,3830],{"class":430},"router ",[224,3832,1897],{"class":238},[224,3834,2468],{"class":238},[224,3836,1512],{"class":230},[224,3838,471],{"class":238},[224,3840,2475],{"class":230},[224,3842,1407],{"class":238},[224,3844,2480],{"class":430},[224,3846,279],{"class":238},[224,3848,2485],{"class":238},[224,3850,1512],{"class":230},[224,3852,471],{"class":238},[224,3854,2492],{"class":230},[224,3856,2010],{"class":238},[224,3858,1512],{"class":230},[224,3860,471],{"class":238},[224,3862,2501],{"class":230},[224,3864,702],{"class":238},[224,3866,3867,3869,3871,3873,3875,3877,3879,3881,3883,3885,3887,3889,3891,3893,3895],{"class":226,"line":249},[224,3868,3685],{"class":430},[224,3870,471],{"class":238},[224,3872,1596],{"class":430},[224,3874,279],{"class":238},[224,3876,2468],{"class":238},[224,3878,1512],{"class":230},[224,3880,471],{"class":238},[224,3882,120],{"class":230},[224,3884,1407],{"class":238},[224,3886,2527],{"class":430},[224,3888,279],{"class":238},[224,3890,731],{"class":238},[224,3892,2534],{"class":234},[224,3894,737],{"class":238},[224,3896,1461],{"class":238},[224,3898,3899],{"class":226,"line":264},[224,3900,3901],{"class":238},"}}\n",[224,3903,3904,3907,3909,3911,3913,3915,3917,3919,3921,3923,3925,3927,3929,3931,3933,3935,3937],{"class":226,"line":311},[224,3905,3906],{"class":304},"if",[224,3908,1894],{"class":430},[224,3910,1897],{"class":238},[224,3912,2556],{"class":430},[224,3914,471],{"class":238},[224,3916,2561],{"class":242},[224,3918,1509],{"class":238},[224,3920,317],{"class":430},[224,3922,471],{"class":238},[224,3924,2570],{"class":242},[224,3926,2573],{"class":238},[224,3928,2332],{"class":430},[224,3930,2578],{"class":238},[224,3932,1894],{"class":430},[224,3934,2077],{"class":238},[224,3936,2080],{"class":238},[224,3938,424],{"class":238},[224,3940,3941,3944,3946,3948,3950,3952],{"class":226,"line":323},[224,3942,3943],{"class":430},"    log",[224,3945,471],{"class":238},[224,3947,2093],{"class":242},[224,3949,1509],{"class":238},[224,3951,2098],{"class":430},[224,3953,391],{"class":238},[224,3955,3956],{"class":226,"line":333},[224,3957,503],{"class":238},[197,3959,3960,3962,3963,3966,3967,3970,3971,3974],{},[221,3961,120],{}," uses STARTTLS when the server offers it, and authenticates when you set ",[221,3964,3965],{},"Auth",". It writes the message as ",[221,3968,3969],{},"multipart\u002Falternative",", text part first. If you deliver another way, ",[221,3972,3973],{},"msg.MIME(time.Now())"," returns the raw bytes.",[201,3976,3978],{"id":3977},"read-next","Read next",[3980,3981,3982,3995],"table",{},[3983,3984,3985],"thead",{},[3986,3987,3988,3992],"tr",{},[3989,3990,3991],"th",{},"If you want to",[3989,3993,3994],{},"Read",[3996,3997,3998,4008,4017,4026,4035,4044],"tbody",{},[3986,3999,4000,4004],{},[4001,4002,4003],"td",{},"Learn what a template can contain",[4001,4005,4006],{},[209,4007,38],{"href":39},[3986,4009,4010,4013],{},[4001,4011,4012],{},"Pick modules for your email",[4001,4014,4015],{},[209,4016,48],{"href":49},[3986,4018,4019,4022],{},[4001,4020,4021],{},"Understand every compile error",[4001,4023,4024],{},[209,4025,63],{"href":64},[3986,4027,4028,4031],{},[4001,4029,4030],{},"Define your own families and theme",[4001,4032,4033],{},[209,4034,167],{"href":168},[3986,4036,4037,4040],{},[4001,4038,4039],{},"Send marketing, security and internal mail",[4001,4041,4042],{},[209,4043,115],{"href":116},[3986,4045,4046,4049],{},[4001,4047,4048],{},"See nine complete emails",[4001,4050,4051],{},[209,4052,162],{"href":163},[4054,4055,4056],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .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 .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}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":219,"searchDepth":249,"depth":249,"links":4058},[4059,4060,4061,4062,4063,4064,4065],{"id":203,"depth":249,"text":204},{"id":2706,"depth":249,"text":2707},{"id":2841,"depth":249,"text":2842},{"id":3056,"depth":249,"text":3057},{"id":3382,"depth":249,"text":3383},{"id":3644,"depth":249,"text":3645},{"id":3977,"depth":249,"text":3978},"One Go file that defines a data type, compiles a template against it, renders the email and sends it over SMTP.","md",null,{},{"icon":24},{"title":21,"description":4066},"xPE_T5lGD3oTacG7ydcumXGFls0HeFrqsMoIjSWHBrE",[4074,4076],{"title":16,"path":17,"stem":18,"description":4075,"icon":19,"children":-1},"Add lttr to a Go module, set up access to the private repository, and install the CLI.",{"title":26,"path":27,"stem":28,"description":4077,"icon":29,"children":-1},"Install the lttr agent skill so Claude Code, Cursor, and other coding agents write lttr templates and wiring correctly the first time.",1790309825446]