[{"data":1,"prerenderedAt":2960},["ShallowReactive",2],{"navigation_docs":3,"-rendering-families-and-streams":191,"-rendering-families-and-streams-surround":2955},[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":74,"body":193,"description":2948,"extension":2949,"links":2950,"meta":2951,"navigation":2952,"path":75,"seo":2953,"stem":76,"__hash__":2954},"docs\u002F3.rendering\u002F1.families-and-streams.md",{"type":194,"value":195,"toc":2935},"minimark",[196,205,221,226,573,859,864,868,881,1010,1027,1033,1037,1113,1136,1140,1145,1328,1340,1343,1441,1472,1493,1497,1508,1637,1650,1653,1694,1710,1714,1717,1763,1767,1773,1961,1977,1981,1986,2055,2069,2073,2205,2220,2514,2523,2532,2535,2584,2588,2594,2638,2656,2660,2674,2920,2926,2931],[197,198,199,200,204],"p",{},"A family is a kind of email you define: who sends it, which sending stream it belongs to, which header and footer it wears, what the footer says, and which modules its templates may not use. Every template names one in its frontmatter (",[201,202,203],"code",{},"family: buyer","), and lttr applies the family's rules when the template compiles.",[197,206,207,208,211,212,215,216,220],{},"lttr ships no families. They are data you build with ",[201,209,210],{},"lttr.Family"," and collect in a ",[201,213,214],{},"*lttr.Registry",". ",[217,218,162],"a",{"href":219},"#read-the-quiet-families"," has nine you can copy from.",[222,223,225],"h2",{"id":224},"define-a-family","Define a family",[227,228,234],"pre",{"className":229,"code":230,"filename":231,"language":232,"meta":233,"style":233},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","var Families = lttr.NewRegistry(\n    lttr.Family{\n        Name:   \"buyer\",\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","families.go","go","",[201,235,236,265,280,302,352,369,386,403,420,438,456,473,490,541,547,561,567],{"__ignoreMap":233},[237,238,241,245,249,252,255,258,262],"span",{"class":239,"line":240},"line",1,[237,242,244],{"class":243},"sMK4o","var",[237,246,248],{"class":247},"sTEyZ"," Families ",[237,250,251],{"class":243},"=",[237,253,254],{"class":247}," lttr",[237,256,257],{"class":243},".",[237,259,261],{"class":260},"s2Zo4","NewRegistry",[237,263,264],{"class":243},"(\n",[237,266,268,272,274,277],{"class":239,"line":267},2,[237,269,271],{"class":270},"sBMFI","    lttr",[237,273,257],{"class":243},[237,275,276],{"class":270},"Family",[237,278,279],{"class":243},"{\n",[237,281,283,286,289,292,296,299],{"class":239,"line":282},3,[237,284,285],{"class":247},"        Name",[237,287,288],{"class":243},":",[237,290,291],{"class":243},"   \"",[237,293,295],{"class":294},"sfazB","buyer",[237,297,298],{"class":243},"\"",[237,300,301],{"class":243},",\n",[237,303,305,308,310,313,315,318,321,324,326,329,332,334,337,340,342,344,347,349],{"class":239,"line":304},4,[237,306,307],{"class":247},"        From",[237,309,288],{"class":243},[237,311,312],{"class":270},"   mail",[237,314,257],{"class":243},[237,316,317],{"class":270},"Address",[237,319,320],{"class":243},"{",[237,322,323],{"class":247},"Name",[237,325,288],{"class":243},[237,327,328],{"class":243}," \"",[237,330,331],{"class":294},"Acme",[237,333,298],{"class":243},[237,335,336],{"class":243},",",[237,338,339],{"class":247}," Address",[237,341,288],{"class":243},[237,343,328],{"class":243},[237,345,346],{"class":294},"orders@acme.example",[237,348,298],{"class":243},[237,350,351],{"class":243},"},\n",[237,353,355,358,360,362,364,367],{"class":239,"line":354},5,[237,356,357],{"class":247},"        Stream",[237,359,288],{"class":243},[237,361,254],{"class":247},[237,363,257],{"class":243},[237,365,366],{"class":247},"Transactional",[237,368,301],{"class":243},[237,370,372,375,377,379,381,384],{"class":239,"line":371},6,[237,373,374],{"class":247},"        Header",[237,376,288],{"class":243},[237,378,254],{"class":247},[237,380,257],{"class":243},[237,382,383],{"class":247},"H1",[237,385,301],{"class":243},[237,387,389,392,394,396,398,401],{"class":239,"line":388},7,[237,390,391],{"class":247},"        Footer",[237,393,288],{"class":243},[237,395,254],{"class":247},[237,397,257],{"class":243},[237,399,400],{"class":247},"F2",[237,402,301],{"class":243},[237,404,406,409,411,413,415,418],{"class":239,"line":405},8,[237,407,408],{"class":247},"        Copy",[237,410,288],{"class":243},[237,412,254],{"class":270},[237,414,257],{"class":243},[237,416,417],{"class":270},"FooterCopy",[237,419,279],{"class":243},[237,421,423,426,428,431,434,436],{"class":239,"line":422},9,[237,424,425],{"class":247},"            Note",[237,427,288],{"class":243},[237,429,430],{"class":243},"      \"",[237,432,433],{"class":294},"Questions? Reply to this email or visit the [Help Centre]({site}\u002Fhelp).",[237,435,298],{"class":243},[237,437,301],{"class":243},[237,439,441,444,446,449,452,454],{"class":239,"line":440},10,[237,442,443],{"class":247},"            About",[237,445,288],{"class":243},[237,447,448],{"class":243},"     \"",[237,450,451],{"class":294},"your order",[237,453,298],{"class":243},[237,455,301],{"class":243},[237,457,459,462,464,466,469,471],{"class":239,"line":458},11,[237,460,461],{"class":247},"            Service",[237,463,288],{"class":243},[237,465,291],{"class":243},[237,467,468],{"class":294},"This is a service email about {about}. [Notification settings]({prefs})",[237,470,298],{"class":243},[237,472,301],{"class":243},[237,474,476,479,481,483,486,488],{"class":239,"line":475},12,[237,477,478],{"class":247},"            Address",[237,480,288],{"class":243},[237,482,291],{"class":243},[237,484,485],{"class":294},"{brand} · {address}",[237,487,298],{"class":243},[237,489,301],{"class":243},[237,491,493,496,498,501,504,506,509,512,515,517,519,522,524,526,529,531,533,536,538],{"class":239,"line":492},13,[237,494,495],{"class":247},"            TextLinks",[237,497,288],{"class":243},[237,499,500],{"class":243}," []",[237,502,503],{"class":270},"lttr",[237,505,257],{"class":243},[237,507,508],{"class":270},"TextLink",[237,510,511],{"class":243},"{{",[237,513,514],{"class":247},"Label",[237,516,288],{"class":243},[237,518,328],{"class":243},[237,520,521],{"class":294},"Notification settings",[237,523,298],{"class":243},[237,525,336],{"class":243},[237,527,528],{"class":247}," URL",[237,530,288],{"class":243},[237,532,328],{"class":243},[237,534,535],{"class":294},"{prefs}",[237,537,298],{"class":243},[237,539,540],{"class":243},"}},\n",[237,542,544],{"class":239,"line":543},14,[237,545,546],{"class":243},"        },\n",[237,548,550,553,555,559],{"class":239,"line":549},15,[237,551,552],{"class":247},"        Tracking",[237,554,288],{"class":243},[237,556,558],{"class":557},"sfNiH"," true",[237,560,301],{"class":243},[237,562,564],{"class":239,"line":563},16,[237,565,566],{"class":243},"    },\n",[237,568,570],{"class":239,"line":569},17,[237,571,572],{"class":243},")\n",[574,575,576,592],"table",{},[577,578,579],"thead",{},[580,581,582,586,589],"tr",{},[583,584,585],"th",{},"Field",[583,587,588],{},"Type",[583,590,591],{},"Meaning",[593,594,595,614,633,651,676,696,720,745,762,782,801,827,842],"tbody",{},[580,596,597,602,607],{},[598,599,600],"td",{},[201,601,323],{},[598,603,604],{},[201,605,606],{},"string",[598,608,609,610,613],{},"What templates write in ",[201,611,612],{},"family:",". Must be non-empty and unique in the registry.",[580,615,616,621,626],{},[598,617,618],{},[201,619,620],{},"From",[598,622,623],{},[201,624,625],{},"mail.Address",[598,627,628,629,632],{},"The fixed sender. Must be zero when ",[201,630,631],{},"FromFrontmatter"," is set.",[580,634,635,639,644],{},[598,636,637],{},[201,638,631],{},[598,640,641],{},[201,642,643],{},"bool",[598,645,646,647,650],{},"The template's frontmatter ",[201,648,649],{},"from"," is required and becomes the sender.",[580,652,653,658,662],{},[598,654,655],{},[201,656,657],{},"SenderDomain",[598,659,660],{},[201,661,606],{},[598,663,664,665,668,669,672,673,257],{},"The domain the sender must use. Empty means ",[201,666,667],{},"Config.Domain",". May use only ",[201,670,671],{},"{domain}",", as in ",[201,674,675],{},"\"partners.{domain}\"",[580,677,678,683,688],{},[598,679,680],{},[201,681,682],{},"Stream",[598,684,685],{},[201,686,687],{},"lttr.Stream",[598,689,690,691,695],{},"The sending stream (see ",[217,692,694],{"href":693},"#choose-a-stream","below",").",[580,697,698,703,708],{},[598,699,700],{},[201,701,702],{},"Header",[598,704,705],{},[201,706,707],{},"lttr.HeaderVariant",[598,709,710,712,713,716,717,257],{},[201,711,383],{},", ",[201,714,715],{},"H2"," or ",[201,718,719],{},"H3",[580,721,722,727,732],{},[598,723,724],{},[201,725,726],{},"Footer",[598,728,729],{},[201,730,731],{},"lttr.FooterVariant",[598,733,734,712,737,712,739,716,742,257],{},[201,735,736],{},"F1",[201,738,400],{},[201,740,741],{},"F3",[201,743,744],{},"F3Internal",[580,746,747,752,757],{},[598,748,749],{},[201,750,751],{},"Copy",[598,753,754],{},[201,755,756],{},"lttr.FooterCopy",[598,758,759,760,257],{},"The footer copy for ",[201,761,726],{},[580,763,764,769,773],{},[598,765,766],{},[201,767,768],{},"Masthead",[598,770,771],{},[201,772,606],{},[598,774,775,776,779,780,257],{},"The H3 masthead, e.g. ",[201,777,778],{},"\"Journal · No. {issue}\"",". Required for ",[201,781,719],{},[580,783,784,789,793],{},[598,785,786],{},[201,787,788],{},"Banner",[598,790,791],{},[201,792,606],{},[598,794,795,796,779,799,257],{},"The H2 banner, e.g. ",[201,797,798],{},"\"Internal · Do not forward\"",[201,800,715],{},[580,802,803,808,813],{},[598,804,805],{},[201,806,807],{},"Legal",[598,809,810],{},[201,811,812],{},"*lttr.LegalOverride",[598,814,815,816,819,820,823,824,257],{},"What frontmatter ",[201,817,818],{},"legal: true"," switches to. ",[201,821,822],{},"nil"," means templates may not set ",[201,825,826],{},"legal",[580,828,829,834,839],{},[598,830,831],{},[201,832,833],{},"Forbidden",[598,835,836],{},[201,837,838],{},"[]ir.Kind",[598,840,841],{},"Modules templates of this family may not use.",[580,843,844,849,853],{},[598,845,846],{},[201,847,848],{},"Tracking",[598,850,851],{},[201,852,643],{},[598,854,855,856,257],{},"Whether your sending service may track opens and clicks. Copied to ",[201,857,858],{},"Message.Tracking",[197,860,861,863],{},[201,862,261],{}," deep-copies every family, so changing your slices or pointers afterwards does not change the registry.",[222,865,867],{"id":866},"choose-a-stream","Choose a stream",[197,869,870,871,874,875,878,879,695],{},"A stream keeps one kind of mail's sending reputation apart from another's. The ",[201,872,873],{},"Router"," sends each stream through its own ",[201,876,877],{},"Sender"," (see ",[217,880,115],{"href":116},[574,882,883,898],{},[577,884,885],{},[580,886,887,889,892,895],{},[583,888,682],{},[583,890,891],{},"Constant",[583,893,894],{},"For",[583,896,897],{},"What lttr does with it",[593,899,900,918,935,968,985],{},[580,901,902,907,912,915],{},[598,903,904],{},[201,905,906],{},"transactional",[598,908,909],{},[201,910,911],{},"lttr.Transactional",[598,913,914],{},"Mail the recipient triggered: receipts, orders, payouts.",[598,916,917],{},"Nothing extra.",[580,919,920,925,930,933],{},[598,921,922],{},[201,923,924],{},"security",[598,926,927],{},[201,928,929],{},"lttr.Security",[598,931,932],{},"Account security: sign-in codes, password resets.",[598,934,917],{},[580,936,937,942,947,950],{},[598,938,939],{},[201,940,941],{},"marketing",[598,943,944],{},[201,945,946],{},"lttr.Marketing",[598,948,949],{},"Opted-in promotional mail.",[598,951,952,955,956,959,960,963,964,967],{},[201,953,954],{},"Render"," sets ",[201,957,958],{},"List-Unsubscribe: \u003Curl>"," and ",[201,961,962],{},"List-Unsubscribe-Post: List-Unsubscribe=One-Click"," from ",[201,965,966],{},"Recipient.UnsubscribeURL",", which must be an https URL.",[580,969,970,975,980,983],{},[598,971,972],{},[201,973,974],{},"outreach",[598,976,977],{},[201,978,979],{},"lttr.Outreach",[598,981,982],{},"Business-to-business mail, kept apart from marketing.",[598,984,917],{},[580,986,987,992,997,1000],{},[598,988,989],{},[201,990,991],{},"internal",[598,993,994],{},[201,995,996],{},"lttr.Internal",[598,998,999],{},"Mail to your own staff only.",[598,1001,1002,1005,1006,1009],{},[201,1003,1004],{},"Router.Send"," refuses it unless ",[201,1007,1008],{},"Router.InternalAllowed"," accepts the address.",[197,1011,1012,1013,1015,1016,1019,1020,1023,1024,257],{},"Because ",[201,1014,954],{}," sets the one-click headers on every marketing message, a marketing render fails without an https ",[201,1017,1018],{},"UnsubscribeURL"," on the recipient, whatever the footer. With an F1 footer the error comes first and reads ",[201,1021,1022],{},"render: marketing mail needs an unsubscribe url","; with any other footer it is ",[201,1025,1026],{},"render: list-unsubscribe url \"\" is not https",[197,1028,1029,1030,1032],{},"Tracking belongs to the family, not the stream. lttr never rewrites links for tracking: ",[201,1031,858],{}," is a flag for your sending service to read.",[222,1034,1036],{"id":1035},"pick-a-header-variant","Pick a header variant",[574,1038,1039,1054],{},[577,1040,1041],{},[580,1042,1043,1046,1049,1051],{},[583,1044,1045],{},"Variant",[583,1047,1048],{},"HTML",[583,1050,99],{},[583,1052,1053],{},"Requires",[593,1055,1056,1072,1090],{},[580,1057,1058,1063,1066,1069],{},[598,1059,1060],{},[201,1061,1062],{},"lttr.H1",[598,1064,1065],{},"The logo, centred.",[598,1067,1068],{},"The brand name in capitals.",[598,1070,1071],{},"—",[580,1073,1074,1079,1082,1085],{},[598,1075,1076],{},[201,1077,1078],{},"lttr.H2",[598,1080,1081],{},"A banner row above the logo.",[598,1083,1084],{},"The banner in capitals on the line above the brand.",[598,1086,1087],{},[201,1088,1089],{},"Family.Banner",[580,1091,1092,1097,1100,1103],{},[598,1093,1094],{},[201,1095,1096],{},"lttr.H3",[598,1098,1099],{},"A masthead eyebrow 14px under the logo.",[598,1101,1102],{},"The masthead in capitals on the line below the brand.",[598,1104,1105,1108,1109,1112],{},[201,1106,1107],{},"Family.Masthead",", and ",[201,1110,1111],{},"issue:"," in every template",[197,1114,1115,1116,1119,1120,1123,1124,1127,1128,1131,1132,1135],{},"The masthead is where ",[201,1117,1118],{},"{issue}"," goes: ",[201,1121,1122],{},"Masthead: \"Journal · No. {issue}\""," and a template with ",[201,1125,1126],{},"issue: \"{{issue}}\""," render as ",[201,1129,1130],{},"JOURNAL · NO. 014",". A template of an H3 family without ",[201,1133,1134],{},"issue"," fails to compile, and so does a template of any other family that sets it.",[222,1137,1139],{"id":1138},"write-the-footer-copy","Write the footer copy",[197,1141,1142,1144],{},[201,1143,417],{}," holds every string a footer can show. Which fields appear depends on the footer variant.",[574,1146,1147,1161],{},[577,1148,1149],{},[580,1150,1151,1153,1156,1159],{},[583,1152,585],{},[583,1154,1155],{},"Format",[583,1157,1158],{},"Shown by",[583,1160,591],{},[593,1162,1163,1180,1195,1212,1226,1245,1262,1276,1291,1308],{},[580,1164,1165,1170,1175,1177],{},[598,1166,1167],{},[201,1168,1169],{},"Nav",[598,1171,1172],{},[201,1173,1174],{},"[]NavLink{Label, Href}",[598,1176,736],{},[598,1178,1179],{},"The nav row. Empty means no row.",[580,1181,1182,1187,1190,1192],{},[598,1183,1184],{},[201,1185,1186],{},"Reason",[598,1188,1189],{},"Markdown",[598,1191,736],{},[598,1193,1194],{},"Why the recipient gets this mail.",[580,1196,1197,1202,1204,1206],{},[598,1198,1199],{},[201,1200,1201],{},"Links",[598,1203,1189],{},[598,1205,736],{},[598,1207,1208,1209,257],{},"The links after the reason, e.g. ",[201,1210,1211],{},"\"[Unsubscribe]({unsubscribe}) · [Preferences]({prefs})\"",[580,1213,1214,1219,1221,1223],{},[598,1215,1216],{},[201,1217,1218],{},"Note",[598,1220,1189],{},[598,1222,400],{},[598,1224,1225],{},"The lead line.",[580,1227,1228,1233,1236,1238],{},[598,1229,1230],{},[201,1231,1232],{},"About",[598,1234,1235],{},"plain text",[598,1237,400],{},[598,1239,1240,1241,1244],{},"The value of ",[201,1242,1243],{},"{about}",". Empty drops the service line.",[580,1246,1247,1252,1254,1256],{},[598,1248,1249],{},[201,1250,1251],{},"Service",[598,1253,1189],{},[598,1255,400],{},[598,1257,1258,1259,257],{},"The service line, e.g. ",[201,1260,1261],{},"\"This is a service email about {about}. [Notification settings]({prefs})\"",[580,1263,1264,1269,1271,1273],{},[598,1265,1266],{},[201,1267,1268],{},"OptOut",[598,1270,1189],{},[598,1272,741],{},[598,1274,1275],{},"The opt-out line.",[580,1277,1278,1283,1285,1288],{},[598,1279,1280],{},[201,1281,1282],{},"Internal",[598,1284,1189],{},[598,1286,1287],{},"F3·i",[598,1289,1290],{},"The internal-only line.",[580,1292,1293,1297,1299,1302],{},[598,1294,1295],{},[201,1296,317],{},[598,1298,1235],{},[598,1300,1301],{},"all",[598,1303,1304,1305,257],{},"Usually ",[201,1306,1307],{},"\"{brand} · {address}\"",[580,1309,1310,1315,1320,1322],{},[598,1311,1312],{},[201,1313,1314],{},"TextLinks",[598,1316,1317],{},[201,1318,1319],{},"[]TextLink{Label, URL}",[598,1321,1301],{},[598,1323,1324,1325,257],{},"Lines of the plain-text footer, written ",[201,1326,1327],{},"Label: URL",[197,1329,1330,1331,1335,1336,1339],{},"Markdown fields are one paragraph. Every string is copy: it may use ",[217,1332,1334],{"href":1333},"#use-placeholders","placeholders"," but never merge tags, and ",[201,1337,1338],{},"NewRenderer"," compiles every field whatever the variant, so a mistake in a field the footer does not show is still reported.",[197,1341,1342],{},"The HTML footer writes its paragraphs in this order:",[574,1344,1345,1358],{},[577,1346,1347],{},[580,1348,1349,1351,1353,1355],{},[583,1350,1045],{},[583,1352,891],{},[583,1354,894],{},[583,1356,1357],{},"Paragraphs",[593,1359,1360,1382,1406,1424],{},[580,1361,1362,1364,1369,1372],{},[598,1363,736],{},[598,1365,1366],{},[201,1367,1368],{},"lttr.F1",[598,1370,1371],{},"Marketing",[598,1373,1374,1375,959,1377,1379,1380],{},"Nav row, then ",[201,1376,1186],{},[201,1378,1201],{}," in one paragraph, then ",[201,1381,317],{},[580,1383,1384,1386,1391,1393],{},[598,1385,400],{},[598,1387,1388],{},[201,1389,1390],{},"lttr.F2",[598,1392,1251],{},[598,1394,1395,1397,1398,1400,1401,1403,1404],{},[201,1396,1218],{},", then ",[201,1399,1251],{}," (when ",[201,1402,1243],{}," has a value), then ",[201,1405,317],{},[580,1407,1408,1410,1415,1418],{},[598,1409,741],{},[598,1411,1412],{},[201,1413,1414],{},"lttr.F3",[598,1416,1417],{},"Outreach",[598,1419,1420,1397,1422],{},[201,1421,317],{},[201,1423,1268],{},[580,1425,1426,1428,1433,1435],{},[598,1427,1287],{},[598,1429,1430],{},[201,1431,1432],{},"lttr.F3Internal",[598,1434,1282],{},[598,1436,1437,1397,1439],{},[201,1438,1282],{},[201,1440,317],{},[197,1442,1443,1444,712,1446,712,1448,716,1450,1452,1453,1456,1457,1459,1460,1462,1463,1465,1466,1468,1469,1471],{},"The plain-text footer is shorter: the lead (",[201,1445,1186],{},[201,1447,1218],{},[201,1449,1268],{},[201,1451,1282],{},"), a blank line, ",[201,1454,1455],{},"--",", the address, then one ",[201,1458,1327],{}," line per ",[201,1461,1314],{}," entry whose URL is not empty. The nav row, ",[201,1464,1201],{}," and the F2 service line have no plain-text form, which is why ",[201,1467,1314],{}," exists. When an F2 footer drops its service line, it drops its ",[201,1470,1314],{}," too, so the text part only carries URLs the variant shows.",[197,1473,1474,1475,712,1478,712,1481,712,1484,959,1487,1490,1491,695],{},"A template can replace some of this copy with ",[201,1476,1477],{},"footer.note",[201,1479,1480],{},"footer.about",[201,1482,1483],{},"footer.reason",[201,1485,1486],{},"footer.nav",[201,1488,1489],{},"footer.optout",", but only the keys its footer shows (see ",[217,1492,43],{"href":44},[222,1494,1496],{"id":1495},"use-placeholders","Use placeholders",[197,1498,1499,1500,1503,1504,1507],{},"Copy uses ",[201,1501,1502],{},"{name}"," placeholders from ",[201,1505,1506],{},"lttr.Vars",". The renderer fills them for each message.",[574,1509,1510,1520],{},[577,1511,1512],{},[580,1513,1514,1517],{},[583,1515,1516],{},"Placeholder",[583,1518,1519],{},"Value",[593,1521,1522,1534,1546,1556,1573,1586,1601,1615,1626],{},[580,1523,1524,1529],{},[598,1525,1526],{},[201,1527,1528],{},"{site}",[598,1530,1531],{},[201,1532,1533],{},"Config.SiteURL",[580,1535,1536,1541],{},[598,1537,1538],{},[201,1539,1540],{},"{brand}",[598,1542,1543],{},[201,1544,1545],{},"Theme.Brand.Name",[580,1547,1548,1552],{},[598,1549,1550],{},[201,1551,671],{},[598,1553,1554],{},[201,1555,667],{},[580,1557,1558,1563],{},[598,1559,1560],{},[201,1561,1562],{},"{region}",[598,1564,1565,1566,1569,1570],{},"The recipient's ",[201,1567,1568],{},"Region",", or ",[201,1571,1572],{},"Config.DefaultRegion",[580,1574,1575,1580],{},[598,1576,1577],{},[201,1578,1579],{},"{address}",[598,1581,1565,1582,1585],{},[201,1583,1584],{},"EntityAddress",", or the address of the region's entity",[580,1587,1588,1592],{},[598,1589,1590],{},[201,1591,1243],{},[598,1593,1594,1595,1597,1598],{},"The F2 about value: ",[201,1596,1480],{}," from the template, or ",[201,1599,1600],{},"Copy.About",[580,1602,1603,1607],{},[598,1604,1605],{},[201,1606,535],{},[598,1608,1565,1609,1569,1612],{},[201,1610,1611],{},"PreferencesURL",[201,1613,1614],{},"{site}\u002Fpreferences",[580,1616,1617,1622],{},[598,1618,1619],{},[201,1620,1621],{},"{unsubscribe}",[598,1623,1565,1624],{},[201,1625,1018],{},[580,1627,1628,1632],{},[598,1629,1630],{},[201,1631,1118],{},[598,1633,1634,1635],{},"The template's evaluated ",[201,1636,1111],{},[197,1638,1639,1640,1643,1644,1647,1648,257],{},"Placeholders belong to family copy and the ",[201,1641,1642],{},"footer.*"," frontmatter keys. Template bodies use merge tags (",[201,1645,1646],{},"{{first_name}}",") instead; see ",[217,1649,53],{"href":54},[197,1651,1652],{},"The copy rules are checked when the registry is validated:",[1654,1655,1656,1663,1669,1675,1687],"ul",{},[1657,1658,1659,1660,257],"li",{},"An unknown placeholder is an error: ",[201,1661,1662],{},"unknown placeholder \"{nope}\"",[1657,1664,1665,1666,257],{},"A merge tag in copy is an error: ",[201,1667,1668],{},"merge tags are not allowed in copy",[1657,1670,1671,1672,257],{},"A Markdown field with more than one paragraph is an error: ",[201,1673,1674],{},"copy must be one paragraph",[1657,1676,1677,1679,1680,1108,1682,1684,1685,257],{},[201,1678,1118],{}," is allowed only in ",[201,1681,768],{},[201,1683,1243],{}," cannot be used in ",[201,1686,1232],{},[1657,1688,1689,1691,1692,257],{},[201,1690,657],{}," may use only ",[201,1693,671],{},[197,1695,1696,1697,712,1700,1703,1704,959,1707,1709],{},"In URLs (",[201,1698,1699],{},"NavLink.Href",[201,1701,1702],{},"TextLink.URL",", link targets) a placeholder that opens the URL is inserted as it is, so ",[201,1705,1706],{},"{site}\u002Fhelp",[201,1708,535],{}," work. A value later in the URL is percent-escaped (D34).",[222,1711,1713],{"id":1712},"set-the-sender","Set the sender",[197,1715,1716],{},"A family either has a fixed sender or takes one from each template:",[1654,1718,1719,1734],{},[1657,1720,1721,1725,1726,1728,1729,1569,1731,1733],{},[1722,1723,1724],"strong",{},"Fixed",": set ",[201,1727,620],{},". Its address must parse and be on the family's sender domain (",[201,1730,657],{},[201,1732,667],{}," when that is empty).",[1657,1735,1736,1725,1739,1742,1743,1745,1746,1749,1750,1752,1753,1755,1756,1759,1760,257],{},[1722,1737,1738],{},"From the template",[201,1740,1741],{},"FromFrontmatter: true"," and leave ",[201,1744,620],{}," zero. Every template of the family must then set ",[201,1747,1748],{},"from:",", and a template of any other family must not. ",[201,1751,954],{}," checks that the evaluated ",[201,1754,649],{}," is a plain address on the sender domain, e.g. ",[201,1757,1758],{},"from: \"Marisa Hodge \u003Cmarisa@partners.acme.example>\""," for ",[201,1761,1762],{},"SenderDomain: \"partners.{domain}\"",[222,1764,1766],{"id":1765},"switch-to-a-legal-variant","Switch to a legal variant",[197,1768,1769,1770,1772],{},"Some mail is marketing most of the time but occasionally carries a legal notice that every user must receive. ",[201,1771,807],{}," describes what such a template switches to:",[227,1774,1776],{"className":229,"code":1775,"filename":231,"language":232,"meta":233,"style":233},"lttr.Family{\n    Name: \"announcement\", From: mail.Address{Name: \"Acme\", Address: \"hello@acme.example\"},\n    Stream: lttr.Marketing, Header: lttr.H1, Footer: lttr.F1, Copy: marketingCopy,\n    Legal: &lttr.LegalOverride{\n        Stream: lttr.Transactional,\n        Footer: lttr.F2,\n        Copy:   serviceCopy,\n    },\n}\n",[201,1777,1778,1788,1843,1894,1913,1927,1941,1952,1956],{"__ignoreMap":233},[237,1779,1780,1782,1784,1786],{"class":239,"line":240},[237,1781,503],{"class":270},[237,1783,257],{"class":243},[237,1785,276],{"class":270},[237,1787,279],{"class":243},[237,1789,1790,1793,1795,1797,1800,1802,1804,1807,1809,1812,1814,1816,1818,1820,1822,1824,1826,1828,1830,1832,1834,1836,1839,1841],{"class":239,"line":267},[237,1791,1792],{"class":247},"    Name",[237,1794,288],{"class":243},[237,1796,328],{"class":243},[237,1798,1799],{"class":294},"announcement",[237,1801,298],{"class":243},[237,1803,336],{"class":243},[237,1805,1806],{"class":247}," From",[237,1808,288],{"class":243},[237,1810,1811],{"class":270}," mail",[237,1813,257],{"class":243},[237,1815,317],{"class":270},[237,1817,320],{"class":243},[237,1819,323],{"class":247},[237,1821,288],{"class":243},[237,1823,328],{"class":243},[237,1825,331],{"class":294},[237,1827,298],{"class":243},[237,1829,336],{"class":243},[237,1831,339],{"class":247},[237,1833,288],{"class":243},[237,1835,328],{"class":243},[237,1837,1838],{"class":294},"hello@acme.example",[237,1840,298],{"class":243},[237,1842,351],{"class":243},[237,1844,1845,1848,1850,1852,1854,1856,1858,1861,1863,1865,1867,1869,1871,1874,1876,1878,1880,1882,1884,1887,1889,1892],{"class":239,"line":282},[237,1846,1847],{"class":247},"    Stream",[237,1849,288],{"class":243},[237,1851,254],{"class":247},[237,1853,257],{"class":243},[237,1855,1371],{"class":247},[237,1857,336],{"class":243},[237,1859,1860],{"class":247}," Header",[237,1862,288],{"class":243},[237,1864,254],{"class":247},[237,1866,257],{"class":243},[237,1868,383],{"class":247},[237,1870,336],{"class":243},[237,1872,1873],{"class":247}," Footer",[237,1875,288],{"class":243},[237,1877,254],{"class":247},[237,1879,257],{"class":243},[237,1881,736],{"class":247},[237,1883,336],{"class":243},[237,1885,1886],{"class":247}," Copy",[237,1888,288],{"class":243},[237,1890,1891],{"class":247}," marketingCopy",[237,1893,301],{"class":243},[237,1895,1896,1899,1901,1904,1906,1908,1911],{"class":239,"line":304},[237,1897,1898],{"class":247},"    Legal",[237,1900,288],{"class":243},[237,1902,1903],{"class":243}," &",[237,1905,503],{"class":270},[237,1907,257],{"class":243},[237,1909,1910],{"class":270},"LegalOverride",[237,1912,279],{"class":243},[237,1914,1915,1917,1919,1921,1923,1925],{"class":239,"line":354},[237,1916,357],{"class":247},[237,1918,288],{"class":243},[237,1920,254],{"class":247},[237,1922,257],{"class":243},[237,1924,366],{"class":247},[237,1926,301],{"class":243},[237,1928,1929,1931,1933,1935,1937,1939],{"class":239,"line":371},[237,1930,391],{"class":247},[237,1932,288],{"class":243},[237,1934,254],{"class":247},[237,1936,257],{"class":243},[237,1938,400],{"class":247},[237,1940,301],{"class":243},[237,1942,1943,1945,1947,1950],{"class":239,"line":388},[237,1944,408],{"class":247},[237,1946,288],{"class":243},[237,1948,1949],{"class":247},"   serviceCopy",[237,1951,301],{"class":243},[237,1953,1954],{"class":239,"line":405},[237,1955,566],{"class":243},[237,1957,1958],{"class":239,"line":422},[237,1959,1960],{"class":243},"}\n",[197,1962,1963,1964,1966,1967,1970,1971,1973,1974,1976],{},"A template with ",[201,1965,818],{}," then uses the override's stream, footer variant and copy. The header, sender and tracking flag stay the family's. ",[201,1968,1969],{},"Template.Meta().Stream"," reports the stream the template will actually use. ",[201,1972,818],{}," in a template whose family has no ",[201,1975,807],{}," fails to compile.",[222,1978,1980],{"id":1979},"forbid-modules","Forbid modules",[197,1982,1983,1985],{},[201,1984,833],{}," lists the modules a family's templates may not use, by their canonical kind:",[227,1987,1989],{"className":229,"code":1988,"filename":231,"language":232,"meta":233,"style":233},"Forbidden: []ir.Kind{ir.KindImage, ir.KindStories, ir.KindProducts, ir.KindOffer, ir.KindQuote},\n",[201,1990,1991],{"__ignoreMap":233},[237,1992,1993,1995,1997,1999,2002,2004,2007,2009,2011,2013,2016,2018,2021,2023,2026,2028,2030,2032,2035,2037,2039,2041,2044,2046,2048,2050,2053],{"class":239,"line":240},[237,1994,833],{"class":247},[237,1996,288],{"class":243},[237,1998,500],{"class":243},[237,2000,2001],{"class":270},"ir",[237,2003,257],{"class":243},[237,2005,2006],{"class":270},"Kind",[237,2008,320],{"class":243},[237,2010,2001],{"class":247},[237,2012,257],{"class":243},[237,2014,2015],{"class":247},"KindImage",[237,2017,336],{"class":243},[237,2019,2020],{"class":247}," ir",[237,2022,257],{"class":243},[237,2024,2025],{"class":247},"KindStories",[237,2027,336],{"class":243},[237,2029,2020],{"class":247},[237,2031,257],{"class":243},[237,2033,2034],{"class":247},"KindProducts",[237,2036,336],{"class":243},[237,2038,2020],{"class":247},[237,2040,257],{"class":243},[237,2042,2043],{"class":247},"KindOffer",[237,2045,336],{"class":243},[237,2047,2020],{"class":247},[237,2049,257],{"class":243},[237,2051,2052],{"class":247},"KindQuote",[237,2054,351],{"class":243},[197,2056,2057,2058,2061,2062,2065,2066,257],{},"A template that uses one fails to compile with ",[201,2059,2060],{},"module \"image\" is not allowed in family \"security\"",", positioned at the module. Handoff aliases such as ",[201,2063,2064],{},"k3"," are not kinds: the registry reports ",[201,2067,2068],{},"unknown module \"k3\" in Forbidden",[222,2070,2072],{"id":2071},"build-the-registry","Build the registry",[227,2074,2077],{"className":229,"code":2075,"filename":2076,"language":232,"meta":233,"style":233},"func NewRegistry(families ...Family) *Registry\nfunc (r *Registry) Lookup(name string) (Family, bool)\nfunc (r *Registry) Names() []string\nfunc (r *Registry) Validate(domain string) error\n","registry.go",[201,2078,2079,2108,2151,2176],{"__ignoreMap":233},[237,2080,2081,2084,2087,2090,2094,2097,2099,2102,2105],{"class":239,"line":240},[237,2082,2083],{"class":243},"func",[237,2085,2086],{"class":260}," NewRegistry",[237,2088,2089],{"class":243},"(",[237,2091,2093],{"class":2092},"sHdIc","families",[237,2095,2096],{"class":243}," ...",[237,2098,276],{"class":270},[237,2100,2101],{"class":243},")",[237,2103,2104],{"class":243}," *",[237,2106,2107],{"class":270},"Registry\n",[237,2109,2110,2112,2115,2118,2121,2124,2126,2129,2131,2134,2138,2140,2142,2144,2146,2149],{"class":239,"line":267},[237,2111,2083],{"class":243},[237,2113,2114],{"class":243}," (",[237,2116,2117],{"class":2092},"r ",[237,2119,2120],{"class":243},"*",[237,2122,2123],{"class":270},"Registry",[237,2125,2101],{"class":243},[237,2127,2128],{"class":260}," Lookup",[237,2130,2089],{"class":243},[237,2132,2133],{"class":2092},"name",[237,2135,2137],{"class":2136},"spNyl"," string",[237,2139,2101],{"class":243},[237,2141,2114],{"class":243},[237,2143,276],{"class":270},[237,2145,336],{"class":243},[237,2147,2148],{"class":2136}," bool",[237,2150,572],{"class":243},[237,2152,2153,2155,2157,2159,2161,2163,2165,2168,2171,2173],{"class":239,"line":282},[237,2154,2083],{"class":243},[237,2156,2114],{"class":243},[237,2158,2117],{"class":2092},[237,2160,2120],{"class":243},[237,2162,2123],{"class":270},[237,2164,2101],{"class":243},[237,2166,2167],{"class":260}," Names",[237,2169,2170],{"class":243},"()",[237,2172,500],{"class":243},[237,2174,2175],{"class":2136},"string\n",[237,2177,2178,2180,2182,2184,2186,2188,2190,2193,2195,2198,2200,2202],{"class":239,"line":304},[237,2179,2083],{"class":243},[237,2181,2114],{"class":243},[237,2183,2117],{"class":2092},[237,2185,2120],{"class":243},[237,2187,2123],{"class":270},[237,2189,2101],{"class":243},[237,2191,2192],{"class":260}," Validate",[237,2194,2089],{"class":243},[237,2196,2197],{"class":2092},"domain",[237,2199,2137],{"class":2136},[237,2201,2101],{"class":243},[237,2203,2204],{"class":2136}," error\n",[197,2206,2207,2209,2210,2213,2214,2216,2217,2219],{},[201,2208,261],{}," never fails. Problems are reported by ",[201,2211,2212],{},"Validate",", which ",[201,2215,1338],{}," calls with ",[201,2218,667],{},", and which returns every problem at once, one per line. This registry has most of the mistakes you can make:",[227,2221,2223],{"className":229,"code":2222,"filename":231,"language":232,"meta":233,"style":233},"reg := lttr.NewRegistry(\n    lttr.Family{\n        Name: \"news\", From: mail.Address{Address: \"news@example.com\"},\n        Stream: lttr.Marketing, Header: lttr.H3, Footer: lttr.F1,\n        Copy:      lttr.FooterCopy{Reason: \"Hi {{name}} and {nope}\", Address: \"{brand} {issue}\"},\n        Forbidden: []ir.Kind{\"k3\"},\n    },\n    lttr.Family{Name: \"news\", From: mail.Address{Address: \"a@other.com\"}, Stream: \"bulk\", Header: lttr.H2, Footer: lttr.F2},\n)\nerr := reg.Validate(\"acme.example\")\n",[201,2224,2225,2241,2251,2291,2329,2370,2395,2399,2485,2489],{"__ignoreMap":233},[237,2226,2227,2230,2233,2235,2237,2239],{"class":239,"line":240},[237,2228,2229],{"class":247},"reg ",[237,2231,2232],{"class":243},":=",[237,2234,254],{"class":247},[237,2236,257],{"class":243},[237,2238,261],{"class":260},[237,2240,264],{"class":243},[237,2242,2243,2245,2247,2249],{"class":239,"line":267},[237,2244,271],{"class":270},[237,2246,257],{"class":243},[237,2248,276],{"class":270},[237,2250,279],{"class":243},[237,2252,2253,2255,2257,2259,2262,2264,2266,2268,2270,2272,2274,2276,2278,2280,2282,2284,2287,2289],{"class":239,"line":282},[237,2254,285],{"class":247},[237,2256,288],{"class":243},[237,2258,328],{"class":243},[237,2260,2261],{"class":294},"news",[237,2263,298],{"class":243},[237,2265,336],{"class":243},[237,2267,1806],{"class":247},[237,2269,288],{"class":243},[237,2271,1811],{"class":270},[237,2273,257],{"class":243},[237,2275,317],{"class":270},[237,2277,320],{"class":243},[237,2279,317],{"class":247},[237,2281,288],{"class":243},[237,2283,328],{"class":243},[237,2285,2286],{"class":294},"news@example.com",[237,2288,298],{"class":243},[237,2290,351],{"class":243},[237,2292,2293,2295,2297,2299,2301,2303,2305,2307,2309,2311,2313,2315,2317,2319,2321,2323,2325,2327],{"class":239,"line":304},[237,2294,357],{"class":247},[237,2296,288],{"class":243},[237,2298,254],{"class":247},[237,2300,257],{"class":243},[237,2302,1371],{"class":247},[237,2304,336],{"class":243},[237,2306,1860],{"class":247},[237,2308,288],{"class":243},[237,2310,254],{"class":247},[237,2312,257],{"class":243},[237,2314,719],{"class":247},[237,2316,336],{"class":243},[237,2318,1873],{"class":247},[237,2320,288],{"class":243},[237,2322,254],{"class":247},[237,2324,257],{"class":243},[237,2326,736],{"class":247},[237,2328,301],{"class":243},[237,2330,2331,2333,2335,2338,2340,2342,2344,2346,2348,2350,2353,2355,2357,2359,2361,2363,2366,2368],{"class":239,"line":354},[237,2332,408],{"class":247},[237,2334,288],{"class":243},[237,2336,2337],{"class":270},"      lttr",[237,2339,257],{"class":243},[237,2341,417],{"class":270},[237,2343,320],{"class":243},[237,2345,1186],{"class":247},[237,2347,288],{"class":243},[237,2349,328],{"class":243},[237,2351,2352],{"class":294},"Hi {{name}} and {nope}",[237,2354,298],{"class":243},[237,2356,336],{"class":243},[237,2358,339],{"class":247},[237,2360,288],{"class":243},[237,2362,328],{"class":243},[237,2364,2365],{"class":294},"{brand} {issue}",[237,2367,298],{"class":243},[237,2369,351],{"class":243},[237,2371,2372,2375,2377,2379,2381,2383,2385,2387,2389,2391,2393],{"class":239,"line":371},[237,2373,2374],{"class":247},"        Forbidden",[237,2376,288],{"class":243},[237,2378,500],{"class":243},[237,2380,2001],{"class":270},[237,2382,257],{"class":243},[237,2384,2006],{"class":270},[237,2386,320],{"class":243},[237,2388,298],{"class":243},[237,2390,2064],{"class":294},[237,2392,298],{"class":243},[237,2394,351],{"class":243},[237,2396,2397],{"class":239,"line":388},[237,2398,566],{"class":243},[237,2400,2401,2403,2405,2407,2409,2411,2413,2415,2417,2419,2421,2423,2425,2427,2429,2431,2433,2435,2437,2439,2442,2444,2447,2450,2452,2454,2457,2459,2461,2463,2465,2467,2469,2471,2473,2475,2477,2479,2481,2483],{"class":239,"line":405},[237,2402,271],{"class":270},[237,2404,257],{"class":243},[237,2406,276],{"class":270},[237,2408,320],{"class":243},[237,2410,323],{"class":247},[237,2412,288],{"class":243},[237,2414,328],{"class":243},[237,2416,2261],{"class":294},[237,2418,298],{"class":243},[237,2420,336],{"class":243},[237,2422,1806],{"class":247},[237,2424,288],{"class":243},[237,2426,1811],{"class":270},[237,2428,257],{"class":243},[237,2430,317],{"class":270},[237,2432,320],{"class":243},[237,2434,317],{"class":247},[237,2436,288],{"class":243},[237,2438,328],{"class":243},[237,2440,2441],{"class":294},"a@other.com",[237,2443,298],{"class":243},[237,2445,2446],{"class":243},"},",[237,2448,2449],{"class":247}," Stream",[237,2451,288],{"class":243},[237,2453,328],{"class":243},[237,2455,2456],{"class":294},"bulk",[237,2458,298],{"class":243},[237,2460,336],{"class":243},[237,2462,1860],{"class":247},[237,2464,288],{"class":243},[237,2466,254],{"class":247},[237,2468,257],{"class":243},[237,2470,715],{"class":247},[237,2472,336],{"class":243},[237,2474,1873],{"class":247},[237,2476,288],{"class":243},[237,2478,254],{"class":247},[237,2480,257],{"class":243},[237,2482,400],{"class":247},[237,2484,351],{"class":243},[237,2486,2487],{"class":239,"line":422},[237,2488,572],{"class":243},[237,2490,2491,2494,2496,2499,2501,2503,2505,2507,2510,2512],{"class":239,"line":440},[237,2492,2493],{"class":247},"err ",[237,2495,2232],{"class":243},[237,2497,2498],{"class":247}," reg",[237,2500,257],{"class":243},[237,2502,2212],{"class":260},[237,2504,2089],{"class":243},[237,2506,298],{"class":243},[237,2508,2509],{"class":294},"acme.example",[237,2511,298],{"class":243},[237,2513,572],{"class":243},[227,2515,2521],{"className":2516,"code":2518,"filename":2519,"language":2520,"meta":233},[2517],"language-text","family \"news\": header H3 requires a masthead\nfamily \"news\": unknown module \"k3\" in Forbidden\nfamily \"news\": sender \"news@example.com\" is outside its domain \"acme.example\"\nfamily \"news\" Copy.Reason:1:4: merge tags are not allowed in copy\nfamily \"news\" Copy.Reason:1:17: unknown placeholder \"{nope}\"\nfamily \"news\" Copy.Address:1:9: {issue} is only allowed in Masthead\nfamily \"news\": duplicate name\n","Error","text",[201,2522,2518],{"__ignoreMap":233},[197,2524,2525,2526,2528,2529,2531],{},"The second ",[201,2527,2261],{}," is reported only as a duplicate: its own mistakes (the ",[201,2530,2456],{}," stream, the missing banner) are not checked until it has a name of its own.",[197,2533,2534],{},"It refuses:",[1654,2536,2537,2544,2550,2561,2566,2574],{},[1657,2538,2539,2540,2543],{},"an empty or duplicate name (",[201,2541,2542],{},"Lookup"," returns the first of a duplicate, but the registry never validates);",[1657,2545,2546,2547,2549],{},"an invalid stream, header variant or footer variant, and an invalid stream or footer variant in ",[201,2548,807],{},";",[1657,2551,2552,2554,2555,712,2557,2554,2559,2549],{},[201,2553,719],{}," without a ",[201,2556,768],{},[201,2558,715],{},[201,2560,788],{},[1657,2562,2563,2564,2549],{},"an unknown kind in ",[201,2565,833],{},[1657,2567,2568,2569,2571,2572,2549],{},"no sender, a sender that does not parse, a sender outside its domain, or ",[201,2570,620],{}," set together with ",[201,2573,631],{},[1657,2575,2576,2577,2580,2581,257],{},"copy that does not compile. These errors are ",[201,2578,2579],{},"*ir.Error"," values named after the field, such as ",[201,2582,2583],{},"family \"promo\" Copy.Reason",[222,2585,2587],{"id":2586},"know-what-compile-checks","Know what Compile checks",[197,2589,2590,2593],{},[201,2591,2592],{},"lttr.Compile"," takes the registry because family rules are compile-time (D2). Besides the template itself, it checks that:",[1654,2595,2596,2602,2605,2613,2618,2623],{},[1657,2597,2598,2599,2549],{},"the family exists: ",[201,2600,2601],{},"frontmatter: unknown family \"x\"",[1657,2603,2604],{},"no module is one the family forbids;",[1657,2606,2607,2609,2610,2612],{},[201,2608,649],{}," is present exactly when the family takes it, and a literal ",[201,2611,649],{}," is an address;",[1657,2614,2615,2617],{},[201,2616,1134],{}," is present exactly when the family has an H3 masthead;",[1657,2619,2620,2622],{},[201,2621,818],{}," is used only with a family that has a legal variant;",[1657,2624,2625,2626,2628,2629,2631,2632,2634,2635,2637],{},"each ",[201,2627,1642],{}," key is one the footer shows (after ",[201,2630,826],{},"), such as ",[201,2633,1477],{}," for F2 or ",[201,2636,1483],{}," for F1.",[197,2639,2640,2641,2644,2645,2648,2649,2651,2652,2655],{},"The registry passed to ",[201,2642,2643],{},"Compile"," and the one in ",[201,2646,2647],{},"Config.Families"," should be the same. ",[201,2650,954],{}," looks the family up again by name and fails with ",[201,2653,2654],{},"render: family \"x\" is not in this renderer's registry"," if the renderer does not have it.",[222,2657,2659],{"id":2658},"read-the-quiet-families","Read the Quiet families",[197,2661,2662,2663,2666,2667,2670,2671,257],{},"The ",[217,2664,2665],{"href":163},"Quiet example"," defines nine families in ",[201,2668,2669],{},"examples\u002Fquiet\u002Ffamilies.go",". Its sender domain is ",[201,2672,2673],{},"caribhubs.com",[574,2675,2676,2694],{},[577,2677,2678],{},[580,2679,2680,2682,2684,2686,2688,2690,2692],{},[583,2681,276],{},[583,2683,620],{},[583,2685,682],{},[583,2687,702],{},[583,2689,726],{},[583,2691,833],{},[583,2693,848],{},[593,2695,2696,2720,2744,2768,2793,2819,2847,2868,2894],{},[580,2697,2698,2702,2708,2710,2712,2715,2717],{},[598,2699,2700],{},[201,2701,295],{},[598,2703,2704,2705],{},"CaribHubs ",[201,2706,2707],{},"orders@",[598,2709,906],{},[598,2711,383],{},[598,2713,2714],{},"F2, about \"your order\"",[598,2716,1071],{},[598,2718,2719],{},"on",[580,2721,2722,2727,2733,2735,2737,2740,2742],{},[598,2723,2724],{},[201,2725,2726],{},"seller",[598,2728,2729,2730],{},"CaribHubs Sellers ",[201,2731,2732],{},"sellers@",[598,2734,906],{},[598,2736,383],{},[598,2738,2739],{},"F2, about \"your seller account\"",[598,2741,1071],{},[598,2743,2719],{},[580,2745,2746,2751,2757,2759,2761,2764,2766],{},[598,2747,2748],{},[201,2749,2750],{},"driver",[598,2752,2753,2754],{},"CaribHubs Drivers ",[201,2755,2756],{},"drivers@",[598,2758,906],{},[598,2760,383],{},[598,2762,2763],{},"F2, about \"your driver account\"",[598,2765,1071],{},[598,2767,2719],{},[580,2769,2770,2774,2780,2782,2784,2787,2790],{},[598,2771,2772],{},[201,2773,924],{},[598,2775,2776,2777],{},"CaribHubs Security ",[201,2778,2779],{},"security@",[598,2781,924],{},[598,2783,383],{},[598,2785,2786],{},"F2, no about line",[598,2788,2789],{},"image, stories, products, offer, quote",[598,2791,2792],{},"off",[580,2794,2795,2799,2804,2810,2812,2815,2817],{},[598,2796,2797],{},[201,2798,1799],{},[598,2800,2704,2801],{},[201,2802,2803],{},"hello@",[598,2805,2806,2807,2809],{},"marketing (",[201,2808,826],{}," → transactional, F2)",[598,2811,383],{},[598,2813,2814],{},"F1, no nav",[598,2816,1071],{},[598,2818,2719],{},[580,2820,2821,2826,2832,2834,2840,2843,2845],{},[598,2822,2823],{},[201,2824,2825],{},"newsletter",[598,2827,2828,2829],{},"Hub Journal ",[201,2830,2831],{},"journal@",[598,2833,941],{},[598,2835,2836,2837],{},"H3, ",[201,2838,2839],{},"Hub Journal · No. {issue}",[598,2841,2842],{},"F1 with nav",[598,2844,1071],{},[598,2846,2719],{},[580,2848,2849,2854,2858,2860,2862,2864,2866],{},[598,2850,2851],{},[201,2852,2853],{},"promo",[598,2855,2704,2856],{},[201,2857,2803],{},[598,2859,941],{},[598,2861,383],{},[598,2863,2842],{},[598,2865,1071],{},[598,2867,2719],{},[580,2869,2870,2875,2884,2886,2888,2890,2892],{},[598,2871,2872],{},[201,2873,2874],{},"b2b",[598,2876,2877,2878,2880,2881],{},"frontmatter ",[201,2879,649],{},", on ",[201,2882,2883],{},"partners.{domain}",[598,2885,974],{},[598,2887,383],{},[598,2889,741],{},[598,2891,2789],{},[598,2893,2792],{},[580,2895,2896,2900,2906,2908,2914,2916,2918],{},[598,2897,2898],{},[201,2899,991],{},[598,2901,2902,2903],{},"CaribHubs Ops ",[201,2904,2905],{},"team@",[598,2907,991],{},[598,2909,2910,2911],{},"H2, ",[201,2912,2913],{},"Internal · Do not forward",[598,2915,1287],{},[598,2917,2789],{},[598,2919,2792],{},[197,2921,2922,2923,2925],{},"Here is the ",[201,2924,2853],{}," family's F1 footer, with its nav row, reason, links and address:",[2927,2928],"email-preview",{"name":2929,"width":2930},"05-campaign.heritage_week",375,[2932,2933,2934],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":233,"searchDepth":267,"depth":267,"links":2936},[2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947],{"id":224,"depth":267,"text":225},{"id":866,"depth":267,"text":867},{"id":1035,"depth":267,"text":1036},{"id":1138,"depth":267,"text":1139},{"id":1495,"depth":267,"text":1496},{"id":1712,"depth":267,"text":1713},{"id":1765,"depth":267,"text":1766},{"id":1979,"depth":267,"text":1980},{"id":2071,"depth":267,"text":2072},{"id":2586,"depth":267,"text":2587},{"id":2658,"depth":267,"text":2659},"Define the kinds of email you send, with their sender, stream, header and footer chrome, footer copy and the modules they may not use.","md",null,{},{"icon":77},{"title":74,"description":2948},"IxED11UdiTekex2eXGkTLncSlxJqPPEWjVw-L201R3Q",[2956,2958],{"title":63,"path":64,"stem":65,"description":2957,"icon":66,"children":-1},"What lttr.Compile reports, how to read it in Go, the warnings, and the common errors with their fixes.",{"title":79,"path":80,"stem":81,"description":2959,"icon":82,"children":-1},"Give lttr your colours, font stacks and logo with theme.Theme, and see where each value ends up in the email.",1790309827537]