[{"data":1,"prerenderedAt":3072},["ShallowReactive",2],{"navigation_docs":3,"-guides-the-quiet-example":191,"-guides-the-quiet-example-surround":3067},[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":162,"body":193,"description":3060,"extension":3061,"links":3062,"meta":3063,"navigation":3064,"path":163,"seo":3065,"stem":164,"__hash__":3066},"docs\u002F6.guides\u002F1.the-quiet-example.md",{"type":194,"value":195,"toc":3051},"minimark",[196,204,218,234,239,441,445,461,474,776,791,795,831,1077,1080,1389,1419,1423,1437,1683,1700,1707,1712,1719,1722,1727,1731,1734,1968,1986,2186,2195,2251,2260,2794,2803,2816,2844,2848,2858,2970,2982,2986,2989,3044,3047],[197,198,199,203],"p",{},[200,201,202],"code",{},"examples\u002Fquiet"," is the Quiet email design from handoff 11, built with lttr for CaribHubs, a Caribbean marketplace. It has everything a consumer writes: a theme, a family registry with footer copy, a config, nine templates and typed sample data for each one.",[197,205,206,207,210,211,210,214,217],{},"It is also lttr's conformance suite. The golden files, the structural HTML lint, ",[200,208,209],{},"lttr preview",", ",[200,212,213],{},"lttr serve",[200,215,216],{},"make shoot"," and the release workflow's consume check all run against these nine emails. When a renderer change moves a pixel, it shows up here first.",[219,220,221,222,225,226,229,230,233],"note",{},"The example is there to copy from, not to import. Its brand, sender domain, entity addresses and copy belong to CaribHubs, and two of its three entity addresses are marked ",[200,223,224],{},"\u002F\u002F PLACEHOLDER"," in ",[200,227,228],{},"config.go",". Build your own theme and families the same way. ",[231,232,167],"a",{"href":168}," walks through it.",[235,236,238],"h2",{"id":237},"tour-the-files","Tour the files",[240,241,242,255],"table",{},[243,244,245],"thead",{},[246,247,248,252],"tr",{},[249,250,251],"th",{},"File",[249,253,254],{},"What it holds",[256,257,258,283,297,313,334,352,377,395,414,431],"tbody",{},[246,259,260,266],{},[261,262,263],"td",{},[200,264,265],{},"theme.go",[261,267,268,271,272,210,275,278,279,282],{},[200,269,270],{},"Theme()",": the Quiet light and dark palettes, the three font stacks (Georgia, Arial, Courier New) and the brand mark (",[200,273,274],{},"CaribHubs",[200,276,277],{},"logo.png"," and ",[200,280,281],{},"logo-dark.png",", shown at 36px).",[246,284,285,290],{},[261,286,287],{},[200,288,289],{},"families.go",[261,291,292,293,296],{},"The shared footer copy, a few helpers that build it, and ",[200,294,295],{},"Families",", the registry of nine families.",[246,298,299,303],{},[261,300,301],{},[200,302,228],{},[261,304,305,308,309,312],{},[200,306,307],{},"Config(assetBase)",": domain ",[200,310,311],{},"caribhubs.com",", the site URL, the theme, the families, three entity addresses and the default region.",[246,314,315,320],{},[261,316,317],{},[200,318,319],{},"assets.go",[261,321,322,325,326,329,330,333],{},[200,323,324],{},"Assets",", the two logo PNGs embedded with ",[200,327,328],{},"\u002F\u002Fgo:embed",", and ",[200,331,332],{},"AssetBase",", the production URL they are served from.",[246,335,336,341],{},[261,337,338],{},[200,339,340],{},"templates\u002F",[261,342,343,344,347,348,351],{},"The nine templates, ",[200,345,346],{},"01-order-shipped.md"," to ",[200,349,350],{},"09-internal-update.md",".",[246,353,354,359],{},[261,355,356],{},[200,357,358],{},"templates.go",[261,360,361,362,365,366,369,370,210,373,376],{},"Embeds ",[200,363,364],{},"templates\u002F*.md"," and compiles each one with ",[200,367,368],{},"lttr.MustCompile"," into a package-level variable (",[200,371,372],{},"OrderShipped",[200,374,375],{},"PayoutSent",", …).",[246,378,379,384],{},[261,380,381],{},[200,382,383],{},"samples.go",[261,385,386,387,390,391,394],{},"One data type per template (",[200,388,389],{},"OrderShippedData",", …) and a ",[200,392,393],{},"Sample…()"," function for each that returns the data and a recipient.",[246,396,397,402],{},[261,398,399],{},[200,400,401],{},"examples.go",[261,403,404,210,407,278,410,413],{},[200,405,406],{},"Example",[200,408,409],{},"Examples()",[200,411,412],{},"ByName(name)",": the nine emails behind one untyped interface, for tools that do not know the data types.",[246,415,416,421],{},[261,417,418],{},[200,419,420],{},"mapbox.go",[261,422,423,426,427,430],{},[200,424,425],{},"Mapbox(token, style)",": a ",[200,428,429],{},"mapbox.Static"," builder with the pin and route colours read from the theme.",[246,432,433,438],{},[261,434,435],{},[200,436,437],{},"*_test.go",[261,439,440],{},"The compile checks, the goldens, the structural lint and the Mapbox colour test.",[235,442,444],{"id":443},"read-the-theme-and-config","Read the theme and config",[197,446,447,449,450,453,454,457,458,460],{},[200,448,270],{}," returns a ",[200,451,452],{},"lttr.Theme"," literal. Every colour is a ",[200,455,456],{},"#RRGGBB"," string and every font stack is a plain CSS list. The library holds no brand values of its own, so these are the only place the Quiet colours live. See ",[231,459,79],{"href":80}," for what each token colours.",[197,462,463,465,466,469,470,473],{},[200,464,307],{}," takes the asset base as an argument because the same theme is served from different places. The CLI's preview passes a relative path, and real sends use ",[200,467,468],{},"quiet.AssetBase"," (",[200,471,472],{},"https:\u002F\u002Fcaribhubs.com\u002Fassets\u002Femail","):",[475,476,482],"pre",{"className":477,"code":478,"filename":479,"language":480,"meta":481,"style":481},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","func Config(assetBase string) lttr.Config {\n    return lttr.Config{\n        Domain:    \"caribhubs.com\",\n        SiteURL:   \"https:\u002F\u002Fcaribhubs.com\",\n        AssetBase: assetBase,\n        Theme:     Theme(),\n        Families:  Families,\n        Entities: map[string]lttr.Entity{\n            \"St Kitts & Nevis\":  {Address: \"Basseterre, St Kitts\"},\n            \"Antigua & Barbuda\": {Address: \"St John's, Antigua\"},   \u002F\u002F PLACEHOLDER\n            \"Anguilla\":          {Address: \"The Valley, Anguilla\"}, \u002F\u002F PLACEHOLDER\n        },\n        DefaultRegion: \"St Kitts & Nevis\",\n    }\n}\n","examples\u002Fquiet\u002Fconfig.go","go","",[200,483,484,523,539,561,579,592,606,619,646,678,711,742,748,764,770],{"__ignoreMap":481},[485,486,489,493,497,500,504,508,511,515,517,520],"span",{"class":487,"line":488},"line",1,[485,490,492],{"class":491},"sMK4o","func",[485,494,496],{"class":495},"s2Zo4"," Config",[485,498,499],{"class":491},"(",[485,501,503],{"class":502},"sHdIc","assetBase",[485,505,507],{"class":506},"spNyl"," string",[485,509,510],{"class":491},")",[485,512,514],{"class":513},"sBMFI"," lttr",[485,516,351],{"class":491},[485,518,519],{"class":513},"Config",[485,521,522],{"class":491}," {\n",[485,524,526,530,532,534,536],{"class":487,"line":525},2,[485,527,529],{"class":528},"s7zQu","    return",[485,531,514],{"class":513},[485,533,351],{"class":491},[485,535,519],{"class":513},[485,537,538],{"class":491},"{\n",[485,540,542,546,549,552,555,558],{"class":487,"line":541},3,[485,543,545],{"class":544},"sTEyZ","        Domain",[485,547,548],{"class":491},":",[485,550,551],{"class":491},"    \"",[485,553,311],{"class":554},"sfazB",[485,556,557],{"class":491},"\"",[485,559,560],{"class":491},",\n",[485,562,564,567,569,572,575,577],{"class":487,"line":563},4,[485,565,566],{"class":544},"        SiteURL",[485,568,548],{"class":491},[485,570,571],{"class":491},"   \"",[485,573,574],{"class":554},"https:\u002F\u002Fcaribhubs.com",[485,576,557],{"class":491},[485,578,560],{"class":491},[485,580,582,585,587,590],{"class":487,"line":581},5,[485,583,584],{"class":544},"        AssetBase",[485,586,548],{"class":491},[485,588,589],{"class":544}," assetBase",[485,591,560],{"class":491},[485,593,595,598,600,603],{"class":487,"line":594},6,[485,596,597],{"class":544},"        Theme",[485,599,548],{"class":491},[485,601,602],{"class":495},"     Theme",[485,604,605],{"class":491},"(),\n",[485,607,609,612,614,617],{"class":487,"line":608},7,[485,610,611],{"class":544},"        Families",[485,613,548],{"class":491},[485,615,616],{"class":544},"  Families",[485,618,560],{"class":491},[485,620,622,625,627,630,633,636,639,641,644],{"class":487,"line":621},8,[485,623,624],{"class":544},"        Entities",[485,626,548],{"class":491},[485,628,629],{"class":491}," map[",[485,631,632],{"class":506},"string",[485,634,635],{"class":491},"]",[485,637,638],{"class":513},"lttr",[485,640,351],{"class":491},[485,642,643],{"class":513},"Entity",[485,645,538],{"class":491},[485,647,649,652,655,657,659,662,665,667,670,673,675],{"class":487,"line":648},9,[485,650,651],{"class":491},"            \"",[485,653,654],{"class":554},"St Kitts & Nevis",[485,656,557],{"class":491},[485,658,548],{"class":491},[485,660,661],{"class":491},"  {",[485,663,664],{"class":544},"Address",[485,666,548],{"class":491},[485,668,669],{"class":491}," \"",[485,671,672],{"class":554},"Basseterre, St Kitts",[485,674,557],{"class":491},[485,676,677],{"class":491},"},\n",[485,679,681,683,686,688,690,693,695,697,699,702,704,707],{"class":487,"line":680},10,[485,682,651],{"class":491},[485,684,685],{"class":554},"Antigua & Barbuda",[485,687,557],{"class":491},[485,689,548],{"class":491},[485,691,692],{"class":491}," {",[485,694,664],{"class":544},[485,696,548],{"class":491},[485,698,669],{"class":491},[485,700,701],{"class":554},"St John's, Antigua",[485,703,557],{"class":491},[485,705,706],{"class":491},"},",[485,708,710],{"class":709},"sHwdD","   \u002F\u002F PLACEHOLDER\n",[485,712,714,716,719,721,723,726,728,730,732,735,737,739],{"class":487,"line":713},11,[485,715,651],{"class":491},[485,717,718],{"class":554},"Anguilla",[485,720,557],{"class":491},[485,722,548],{"class":491},[485,724,725],{"class":491},"          {",[485,727,664],{"class":544},[485,729,548],{"class":491},[485,731,669],{"class":491},[485,733,734],{"class":554},"The Valley, Anguilla",[485,736,557],{"class":491},[485,738,706],{"class":491},[485,740,741],{"class":709}," \u002F\u002F PLACEHOLDER\n",[485,743,745],{"class":487,"line":744},12,[485,746,747],{"class":491},"        },\n",[485,749,751,754,756,758,760,762],{"class":487,"line":750},13,[485,752,753],{"class":544},"        DefaultRegion",[485,755,548],{"class":491},[485,757,669],{"class":491},[485,759,654],{"class":554},[485,761,557],{"class":491},[485,763,560],{"class":491},[485,765,767],{"class":487,"line":766},14,[485,768,769],{"class":491},"    }\n",[485,771,773],{"class":487,"line":772},15,[485,774,775],{"class":491},"}\n",[197,777,778,779,782,783,786,787,790],{},"Entities are keyed by region. The footer's ",[200,780,781],{},"{address}"," placeholder is the recipient's ",[200,784,785],{},"EntityAddress"," if one is set, and otherwise the address of their region, or of ",[200,788,789],{},"DefaultRegion"," when they have no region.",[235,792,794],{"id":793},"read-the-families","Read the families",[197,796,797,799,800,803,804,807,808,811,812,815,816,210,819,210,822,210,825,278,828,351],{},[200,798,289],{}," keeps its footer copy in four constants and builds each family's ",[200,801,802],{},"FooterCopy"," with two helpers: ",[200,805,806],{},"serviceCopy(note, about)"," for the F2 service footer and ",[200,809,810],{},"marketingCopy(reason, nav)"," for the F1 marketing footer. ",[200,813,814],{},"restricted()"," lists the modules that the security, b2b and internal families may not use: ",[200,817,818],{},"image",[200,820,821],{},"stories",[200,823,824],{},"products",[200,826,827],{},"offer",[200,829,830],{},"quote",[240,832,833,855],{},[243,834,835],{},[246,836,837,840,843,846,849,852],{},[249,838,839],{},"Family",[249,841,842],{},"Sender",[249,844,845],{},"Stream",[249,847,848],{},"Header",[249,850,851],{},"Footer",[249,853,854],{},"Also",[256,856,857,881,902,923,945,972,998,1021,1049],{},[246,858,859,864,869,872,875,878],{},[261,860,861],{},[200,862,863],{},"buyer",[261,865,866],{},[200,867,868],{},"CaribHubs \u003Corders@caribhubs.com>",[261,870,871],{},"Transactional",[261,873,874],{},"H1",[261,876,877],{},"F2",[261,879,880],{},"About \"your order\"; tracking",[246,882,883,888,893,895,897,899],{},[261,884,885],{},[200,886,887],{},"seller",[261,889,890],{},[200,891,892],{},"CaribHubs Sellers \u003Csellers@…>",[261,894,871],{},[261,896,874],{},[261,898,877],{},[261,900,901],{},"Its own note; tracking",[246,903,904,909,914,916,918,920],{},[261,905,906],{},[200,907,908],{},"driver",[261,910,911],{},[200,912,913],{},"CaribHubs Drivers \u003Cdrivers@…>",[261,915,871],{},[261,917,874],{},[261,919,877],{},[261,921,922],{},"About \"your driver account\"; tracking",[246,924,925,930,935,938,940,942],{},[261,926,927],{},[200,928,929],{},"security",[261,931,932],{},[200,933,934],{},"CaribHubs Security \u003Csecurity@…>",[261,936,937],{},"Security",[261,939,874],{},[261,941,877],{},[261,943,944],{},"Empty About, so no service line; restricted",[246,946,947,952,957,960,962,965],{},[261,948,949],{},[200,950,951],{},"announcement",[261,953,954],{},[200,955,956],{},"CaribHubs \u003Chello@…>",[261,958,959],{},"Marketing",[261,961,874],{},[261,963,964],{},"F1",[261,966,967,968,971],{},"No nav row; a ",[200,969,970],{},"Legal"," override to Transactional with F2; tracking",[246,973,974,979,984,986,989,991],{},[261,975,976],{},[200,977,978],{},"newsletter",[261,980,981],{},[200,982,983],{},"Hub Journal \u003Cjournal@…>",[261,985,959],{},[261,987,988],{},"H3",[261,990,964],{},[261,992,993,994,997],{},"Masthead ",[200,995,996],{},"Hub Journal · No. {issue}","; nav row; tracking",[246,999,1000,1005,1009,1011,1013,1015],{},[261,1001,1002],{},[200,1003,1004],{},"promo",[261,1006,1007],{},[200,1008,956],{},[261,1010,959],{},[261,1012,874],{},[261,1014,964],{},[261,1016,1017,1018,997],{},"Reason uses ",[200,1019,1020],{},"{region}",[246,1022,1023,1028,1038,1041,1043,1046],{},[261,1024,1025],{},[200,1026,1027],{},"b2b",[261,1029,1030,1031,1034,1035],{},"frontmatter ",[200,1032,1033],{},"from",", on ",[200,1036,1037],{},"partners.{domain}",[261,1039,1040],{},"Outreach",[261,1042,874],{},[261,1044,1045],{},"F3",[261,1047,1048],{},"Opt-out line; restricted",[246,1050,1051,1056,1061,1064,1067,1070],{},[261,1052,1053],{},[200,1054,1055],{},"internal",[261,1057,1058],{},[200,1059,1060],{},"CaribHubs Ops \u003Cteam@…>",[261,1062,1063],{},"Internal",[261,1065,1066],{},"H2",[261,1068,1069],{},"F3Internal",[261,1071,1072,1073,1076],{},"Banner ",[200,1074,1075],{},"Internal · Do not forward","; restricted",[197,1078,1079],{},"Two of them show family options the others don't use:",[475,1081,1084],{"className":477,"code":1082,"filename":1083,"language":480,"meta":481,"style":481},"lttr.Family{\n    Name: \"b2b\", FromFrontmatter: true, SenderDomain: \"partners.{domain}\", Stream: lttr.Outreach,\n    Header: lttr.H1, Footer: lttr.F3,\n    Copy:      lttr.FooterCopy{OptOut: `Not the right contact? Reply \"no thanks\" and we won't follow up.`, Address: address},\n    Forbidden: restricted(),\n},\nlttr.Family{\n    Name: \"internal\", From: from(\"CaribHubs Ops\", \"team\"), Stream: lttr.Internal,\n    Header: lttr.H2, Banner: \"Internal · Do not forward\", Footer: lttr.F3Internal,\n    Copy:      lttr.FooterCopy{Internal: \"Internal. Do not forward outside CaribHubs.\", Address: address},\n    Forbidden: restricted(),\n},\n","examples\u002Fquiet\u002Ffamilies.go",[200,1085,1086,1096,1149,1177,1220,1232,1236,1246,1301,1340,1375,1385],{"__ignoreMap":481},[485,1087,1088,1090,1092,1094],{"class":487,"line":488},[485,1089,638],{"class":513},[485,1091,351],{"class":491},[485,1093,839],{"class":513},[485,1095,538],{"class":491},[485,1097,1098,1101,1103,1105,1107,1109,1112,1115,1117,1121,1123,1126,1128,1130,1132,1134,1136,1139,1141,1143,1145,1147],{"class":487,"line":525},[485,1099,1100],{"class":544},"    Name",[485,1102,548],{"class":491},[485,1104,669],{"class":491},[485,1106,1027],{"class":554},[485,1108,557],{"class":491},[485,1110,1111],{"class":491},",",[485,1113,1114],{"class":544}," FromFrontmatter",[485,1116,548],{"class":491},[485,1118,1120],{"class":1119},"sfNiH"," true",[485,1122,1111],{"class":491},[485,1124,1125],{"class":544}," SenderDomain",[485,1127,548],{"class":491},[485,1129,669],{"class":491},[485,1131,1037],{"class":554},[485,1133,557],{"class":491},[485,1135,1111],{"class":491},[485,1137,1138],{"class":544}," Stream",[485,1140,548],{"class":491},[485,1142,514],{"class":544},[485,1144,351],{"class":491},[485,1146,1040],{"class":544},[485,1148,560],{"class":491},[485,1150,1151,1154,1156,1158,1160,1162,1164,1167,1169,1171,1173,1175],{"class":487,"line":541},[485,1152,1153],{"class":544},"    Header",[485,1155,548],{"class":491},[485,1157,514],{"class":544},[485,1159,351],{"class":491},[485,1161,874],{"class":544},[485,1163,1111],{"class":491},[485,1165,1166],{"class":544}," Footer",[485,1168,548],{"class":491},[485,1170,514],{"class":544},[485,1172,351],{"class":491},[485,1174,1045],{"class":544},[485,1176,560],{"class":491},[485,1178,1179,1182,1184,1187,1189,1191,1194,1197,1199,1202,1205,1208,1210,1213,1215,1218],{"class":487,"line":563},[485,1180,1181],{"class":544},"    Copy",[485,1183,548],{"class":491},[485,1185,1186],{"class":513},"      lttr",[485,1188,351],{"class":491},[485,1190,802],{"class":513},[485,1192,1193],{"class":491},"{",[485,1195,1196],{"class":544},"OptOut",[485,1198,548],{"class":491},[485,1200,1201],{"class":491}," `",[485,1203,1204],{"class":554},"Not the right contact? Reply \"no thanks\" and we won't follow up.",[485,1206,1207],{"class":491},"`",[485,1209,1111],{"class":491},[485,1211,1212],{"class":544}," Address",[485,1214,548],{"class":491},[485,1216,1217],{"class":544}," address",[485,1219,677],{"class":491},[485,1221,1222,1225,1227,1230],{"class":487,"line":581},[485,1223,1224],{"class":544},"    Forbidden",[485,1226,548],{"class":491},[485,1228,1229],{"class":495}," restricted",[485,1231,605],{"class":491},[485,1233,1234],{"class":487,"line":594},[485,1235,677],{"class":491},[485,1237,1238,1240,1242,1244],{"class":487,"line":608},[485,1239,638],{"class":513},[485,1241,351],{"class":491},[485,1243,839],{"class":513},[485,1245,538],{"class":491},[485,1247,1248,1250,1252,1254,1256,1258,1260,1263,1265,1268,1270,1272,1275,1277,1279,1281,1284,1286,1289,1291,1293,1295,1297,1299],{"class":487,"line":621},[485,1249,1100],{"class":544},[485,1251,548],{"class":491},[485,1253,669],{"class":491},[485,1255,1055],{"class":554},[485,1257,557],{"class":491},[485,1259,1111],{"class":491},[485,1261,1262],{"class":544}," From",[485,1264,548],{"class":491},[485,1266,1267],{"class":495}," from",[485,1269,499],{"class":491},[485,1271,557],{"class":491},[485,1273,1274],{"class":554},"CaribHubs Ops",[485,1276,557],{"class":491},[485,1278,1111],{"class":491},[485,1280,669],{"class":491},[485,1282,1283],{"class":554},"team",[485,1285,557],{"class":491},[485,1287,1288],{"class":491},"),",[485,1290,1138],{"class":544},[485,1292,548],{"class":491},[485,1294,514],{"class":544},[485,1296,351],{"class":491},[485,1298,1063],{"class":544},[485,1300,560],{"class":491},[485,1302,1303,1305,1307,1309,1311,1313,1315,1318,1320,1322,1324,1326,1328,1330,1332,1334,1336,1338],{"class":487,"line":648},[485,1304,1153],{"class":544},[485,1306,548],{"class":491},[485,1308,514],{"class":544},[485,1310,351],{"class":491},[485,1312,1066],{"class":544},[485,1314,1111],{"class":491},[485,1316,1317],{"class":544}," Banner",[485,1319,548],{"class":491},[485,1321,669],{"class":491},[485,1323,1075],{"class":554},[485,1325,557],{"class":491},[485,1327,1111],{"class":491},[485,1329,1166],{"class":544},[485,1331,548],{"class":491},[485,1333,514],{"class":544},[485,1335,351],{"class":491},[485,1337,1069],{"class":544},[485,1339,560],{"class":491},[485,1341,1342,1344,1346,1348,1350,1352,1354,1356,1358,1360,1363,1365,1367,1369,1371,1373],{"class":487,"line":680},[485,1343,1181],{"class":544},[485,1345,548],{"class":491},[485,1347,1186],{"class":513},[485,1349,351],{"class":491},[485,1351,802],{"class":513},[485,1353,1193],{"class":491},[485,1355,1063],{"class":544},[485,1357,548],{"class":491},[485,1359,669],{"class":491},[485,1361,1362],{"class":554},"Internal. Do not forward outside CaribHubs.",[485,1364,557],{"class":491},[485,1366,1111],{"class":491},[485,1368,1212],{"class":544},[485,1370,548],{"class":491},[485,1372,1217],{"class":544},[485,1374,677],{"class":491},[485,1376,1377,1379,1381,1383],{"class":487,"line":713},[485,1378,1224],{"class":544},[485,1380,548],{"class":491},[485,1382,1229],{"class":495},[485,1384,605],{"class":491},[485,1386,1387],{"class":487,"line":744},[485,1388,677],{"class":491},[197,1390,1391,1393,1394,1397,1398,1401,1402,1404,1405,1408,1409,1412,1413,1416,1417,351],{},[200,1392,1027],{}," has no fixed sender. Each template must set ",[200,1395,1396],{},"from:"," in its frontmatter, and at render time that address must be on ",[200,1399,1400],{},"partners.caribhubs.com",". ",[200,1403,1055],{}," uses the H2 header, which requires a ",[200,1406,1407],{},"Banner",", and sends on the Internal stream, which a ",[200,1410,1411],{},"Router"," delivers only to addresses its ",[200,1414,1415],{},"InternalAllowed"," function accepts. See ",[231,1418,74],{"href":75},[235,1420,1422],{"id":1421},"map-the-nine-emails-to-the-handoff","Map the nine emails to the handoff",[197,1424,1425,1426,1429,1430,347,1433,1436],{},"The handoff's ",[200,1427,1428],{},"design\u002Fhandoff-11\u002Fdesign\u002FCaribHubs · Email Quiet.html"," has one frame per email, labelled ",[200,1431,1432],{},"Q1 Order shipped",[200,1434,1435],{},"Q9 Internal update",", plus mobile frames for Q1, Q3, Q5 and Q6. The file numbers match the frame numbers.",[240,1438,1439,1459],{},[243,1440,1441],{},[246,1442,1443,1446,1449,1452,1454,1456],{},[249,1444,1445],{},"#",[249,1447,1448],{},"Handoff frame",[249,1450,1451],{},"Template",[249,1453,839],{},[249,1455,48],{},[249,1457,1458],{},"Data type",[256,1460,1461,1484,1509,1534,1559,1584,1609,1634,1659],{},[246,1462,1463,1466,1468,1473,1477,1480],{},[261,1464,1465],{},"01",[261,1467,1432],{},[261,1469,1470],{},[200,1471,1472],{},"order.out_for_delivery",[261,1474,1475],{},[200,1476,863],{},[261,1478,1479],{},"statement, progress, receipt, meta",[261,1481,1482],{},[200,1483,389],{},[246,1485,1486,1489,1492,1497,1501,1504],{},[261,1487,1488],{},"02",[261,1490,1491],{},"Q2 Payout sent",[261,1493,1494],{},[200,1495,1496],{},"payout.sent",[261,1498,1499],{},[200,1500,887],{},[261,1502,1503],{},"figure, breakdown, actions, signoff",[261,1505,1506],{},[200,1507,1508],{},"PayoutSentData",[246,1510,1511,1514,1517,1522,1526,1529],{},[261,1512,1513],{},"03",[261,1515,1516],{},"Q3 Password reset",[261,1518,1519],{},[200,1520,1521],{},"auth.reset",[261,1523,1524],{},[200,1525,929],{},[261,1527,1528],{},"statement, code, notice",[261,1530,1531],{},[200,1532,1533],{},"PasswordResetData",[246,1535,1536,1539,1542,1547,1551,1554],{},[261,1537,1538],{},"04",[261,1540,1541],{},"Q4 Hub Journal",[261,1543,1544],{},[200,1545,1546],{},"journal.digest",[261,1548,1549],{},[200,1550,978],{},[261,1552,1553],{},"statement, image, stories, divider, quote",[261,1555,1556],{},[200,1557,1558],{},"JournalDigestData",[246,1560,1561,1564,1567,1572,1576,1579],{},[261,1562,1563],{},"05",[261,1565,1566],{},"Q5 Campaign",[261,1568,1569],{},[200,1570,1571],{},"campaign.heritage_week",[261,1573,1574],{},[200,1575,1004],{},[261,1577,1578],{},"statement, image, products, divider, offer",[261,1580,1581],{},[200,1582,1583],{},"CampaignData",[246,1585,1586,1589,1592,1597,1601,1604],{},[261,1587,1588],{},"06",[261,1590,1591],{},"Q6 Driver job offer",[261,1593,1594],{},[200,1595,1596],{},"job.offered",[261,1598,1599],{},[200,1600,908],{},[261,1602,1603],{},"statement, map, meta, breakdown",[261,1605,1606],{},[200,1607,1608],{},"JobOfferedData",[246,1610,1611,1614,1617,1622,1626,1629],{},[261,1612,1613],{},"07",[261,1615,1616],{},"Q7 Fee change",[261,1618,1619],{},[200,1620,1621],{},"fees.change",[261,1623,1624],{},[200,1625,951],{},[261,1627,1628],{},"statement, compare, divider, letter, signoff",[261,1630,1631],{},[200,1632,1633],{},"FeesChangeData",[246,1635,1636,1639,1642,1647,1651,1654],{},[261,1637,1638],{},"08",[261,1640,1641],{},"Q8 Partner outreach",[261,1643,1644],{},[200,1645,1646],{},"outreach.partner",[261,1648,1649],{},[200,1650,1027],{},[261,1652,1653],{},"letter, signature",[261,1655,1656],{},[200,1657,1658],{},"PartnerOutreachData",[246,1660,1661,1664,1666,1671,1675,1678],{},[261,1662,1663],{},"09",[261,1665,1435],{},[261,1667,1668],{},[200,1669,1670],{},"internal.ops_update",[261,1672,1673],{},[200,1674,1055],{},[261,1676,1677],{},"statement, table, notice, signoff",[261,1679,1680],{},[200,1681,1682],{},"OpsUpdateData",[197,1684,1685,1688,1689,1692,1693,1695,1696,1699],{},[200,1686,1687],{},"compile_test.go"," pins this table: each example must compile with no warnings, to exactly this family, the family's stream and this module list. Where the rendered spacing differs from SPEC §8, the handoff frame wins, and the layout rules name the frame they come from (",[200,1690,1691],{},"Source: \"Q2 (D10)\"","). ",[200,1694,216],{}," puts each render next to its frame, pairing them by the ",[200,1697,1698],{},"Q"," number in the frame label.",[197,1701,1702,1703,1706],{},"Q1 is the most complete transactional email: a hero with an action, a progress tracker, a receipt bound to a ",[200,1704,1705],{},"data.Receipt",", and a two-column meta block.",[1708,1709],"email-preview",{"name":1710,"width":1711},"01-order.out_for_delivery",375,[197,1713,1714,1715,1718],{},"Q4 shows the newsletter chrome: the H3 masthead fills ",[200,1716,1717],{},"{issue}"," from the frontmatter, and the F1 footer carries the nav row and the unsubscribe links.",[1708,1720],{"name":1721,"width":1711},"04-journal.digest",[197,1723,1724,1725,351],{},"Every email is in the ",[231,1726,187],{"href":188},[235,1728,1730],{"id":1729},"follow-one-template-from-source-to-message","Follow one template from source to message",[197,1732,1733],{},"Each template is a Markdown file whose frontmatter names the template and its family:",[475,1735,1740],{"className":1736,"code":1737,"filename":1738,"language":1739,"meta":481,"style":481},"language-markdown shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","---\ntemplate: payout.sent\nfamily: seller\nsubject: \"Payout sent: {{amount}}\"\npreheader: \"{{order_count}} orders, {{period}}. In your bank within 48 hours.\"\nfooter:\n  note: Questions about this payout? Reply to this email.\n---\n\n::figure{eyebrow=\"Weekly payout · {{period}}\" amount=\"{{amount}}\" usd=\"≈ {{amount_usd}}\"}\nIt's on its way to your bank account ending {{account_last4}} and should arrive within 48 hours.\n::\n\n::breakdown\n| Sales · {{order_count}} orders | {{sales}} |\n| --- | ---: |\n| Commission · {{commission_rate}} | {{commission}} |\n| [Reference]{.small .muted} | [`{{reference}}`]{.small .muted} |\n::\n\n::actions\n:button[View payout]{href=\"{{payout_url}}\"} :link[See orders]{href=\"{{orders_url}}\"}\n::\n\n::signoff{closing=\"Thanks for selling with us,\"}\n::\n","examples\u002Fquiet\u002Ftemplates\u002F02-payout-sent.md","markdown",[200,1741,1742,1747,1758,1768,1783,1797,1805,1815,1819,1825,1830,1835,1840,1844,1849,1865,1882,1897,1925,1930,1935,1941,1947,1952,1957,1963],{"__ignoreMap":481},[485,1743,1744],{"class":487,"line":488},[485,1745,1746],{"class":491},"---\n",[485,1748,1749,1753,1755],{"class":487,"line":525},[485,1750,1752],{"class":1751},"swJcz","template",[485,1754,548],{"class":491},[485,1756,1757],{"class":554}," payout.sent\n",[485,1759,1760,1763,1765],{"class":487,"line":541},[485,1761,1762],{"class":1751},"family",[485,1764,548],{"class":491},[485,1766,1767],{"class":554}," seller\n",[485,1769,1770,1773,1775,1777,1780],{"class":487,"line":563},[485,1771,1772],{"class":1751},"subject",[485,1774,548],{"class":491},[485,1776,669],{"class":491},[485,1778,1779],{"class":554},"Payout sent: {{amount}}",[485,1781,1782],{"class":491},"\"\n",[485,1784,1785,1788,1790,1792,1795],{"class":487,"line":581},[485,1786,1787],{"class":1751},"preheader",[485,1789,548],{"class":491},[485,1791,669],{"class":491},[485,1793,1794],{"class":554},"{{order_count}} orders, {{period}}. In your bank within 48 hours.",[485,1796,1782],{"class":491},[485,1798,1799,1802],{"class":487,"line":594},[485,1800,1801],{"class":1751},"footer",[485,1803,1804],{"class":491},":\n",[485,1806,1807,1810,1812],{"class":487,"line":608},[485,1808,1809],{"class":1751},"  note",[485,1811,548],{"class":491},[485,1813,1814],{"class":554}," Questions about this payout? Reply to this email.\n",[485,1816,1817],{"class":487,"line":621},[485,1818,1746],{"class":491},[485,1820,1821],{"class":487,"line":648},[485,1822,1824],{"emptyLinePlaceholder":1823},true,"\n",[485,1826,1827],{"class":487,"line":680},[485,1828,1829],{"class":544},"::figure{eyebrow=\"Weekly payout · {{period}}\" amount=\"{{amount}}\" usd=\"≈ {{amount_usd}}\"}\n",[485,1831,1832],{"class":487,"line":713},[485,1833,1834],{"class":544},"It's on its way to your bank account ending {{account_last4}} and should arrive within 48 hours.\n",[485,1836,1837],{"class":487,"line":744},[485,1838,1839],{"class":544},"::\n",[485,1841,1842],{"class":487,"line":750},[485,1843,1824],{"emptyLinePlaceholder":1823},[485,1845,1846],{"class":487,"line":766},[485,1847,1848],{"class":544},"::breakdown\n",[485,1850,1851,1854,1857,1859,1862],{"class":487,"line":772},[485,1852,1853],{"class":491},"|",[485,1855,1856],{"class":544}," Sales · {{order_count}} orders ",[485,1858,1853],{"class":491},[485,1860,1861],{"class":544}," {{sales}} ",[485,1863,1864],{"class":491},"|\n",[485,1866,1868,1870,1873,1876,1879],{"class":487,"line":1867},16,[485,1869,1853],{"class":491},[485,1871,1872],{"class":491}," ---",[485,1874,1875],{"class":491}," |",[485,1877,1878],{"class":491}," ---:",[485,1880,1881],{"class":491}," |\n",[485,1883,1885,1887,1890,1892,1895],{"class":487,"line":1884},17,[485,1886,1853],{"class":491},[485,1888,1889],{"class":544}," Commission · {{commission_rate}} ",[485,1891,1853],{"class":491},[485,1893,1894],{"class":544}," {{commission}} ",[485,1896,1864],{"class":491},[485,1898,1900,1902,1905,1907,1909,1912,1914,1916,1919,1921,1923],{"class":487,"line":1899},18,[485,1901,1853],{"class":491},[485,1903,1904],{"class":491}," [",[485,1906,176],{"class":554},[485,1908,635],{"class":491},[485,1910,1911],{"class":544},"{.small .muted} ",[485,1913,1853],{"class":491},[485,1915,1904],{"class":491},[485,1917,1918],{"class":554},"`{{reference}}`",[485,1920,635],{"class":491},[485,1922,1911],{"class":544},[485,1924,1864],{"class":491},[485,1926,1928],{"class":487,"line":1927},19,[485,1929,1839],{"class":544},[485,1931,1933],{"class":487,"line":1932},20,[485,1934,1824],{"emptyLinePlaceholder":1823},[485,1936,1938],{"class":487,"line":1937},21,[485,1939,1940],{"class":544},"::actions\n",[485,1942,1944],{"class":487,"line":1943},22,[485,1945,1946],{"class":544},":button[View payout]{href=\"{{payout_url}}\"} :link[See orders]{href=\"{{orders_url}}\"}\n",[485,1948,1950],{"class":487,"line":1949},23,[485,1951,1839],{"class":544},[485,1953,1955],{"class":487,"line":1954},24,[485,1956,1824],{"emptyLinePlaceholder":1823},[485,1958,1960],{"class":487,"line":1959},25,[485,1961,1962],{"class":544},"::signoff{closing=\"Thanks for selling with us,\"}\n",[485,1964,1966],{"class":487,"line":1965},26,[485,1967,1839],{"class":544},[197,1969,1970,1971,1973,1974,1977,1978,1981,1982,1985],{},"Its data type sits in ",[200,1972,383],{},". Every merge tag above resolves to one of these fields through its JSON name. ",[200,1975,1976],{},"sales"," is a ",[200,1979,1980],{},"data.Exact",", so it always shows two decimals (",[200,1983,1984],{},"EC$1,085.00","), as the handoff's breakdown does:",[475,1987,1990],{"className":477,"code":1988,"filename":1989,"language":480,"meta":481,"style":481},"type PayoutSentData struct {\n    Amount         data.Money `json:\"amount\"`\n    AmountUSD      data.Money `json:\"amount_usd\"`\n    Period         string     `json:\"period\"`\n    OrderCount     int        `json:\"order_count\"`\n    AccountLast4   string     `json:\"account_last4\"`\n    Sales          data.Exact `json:\"sales\"`\n    CommissionRate string     `json:\"commission_rate\"`\n    Commission     data.Money `json:\"commission\"`\n    Reference      string     `json:\"reference\"`\n    PayoutURL      string     `json:\"payout_url\"`\n    OrdersURL      string     `json:\"orders_url\"`\n}\n","examples\u002Fquiet\u002Fsamples.go",[200,1991,1992,2005,2026,2044,2059,2075,2089,2108,2122,2140,2154,2168,2182],{"__ignoreMap":481},[485,1993,1994,1997,2000,2003],{"class":487,"line":488},[485,1995,1996],{"class":491},"type",[485,1998,1999],{"class":513}," PayoutSentData",[485,2001,2002],{"class":491}," struct",[485,2004,522],{"class":491},[485,2006,2007,2010,2013,2015,2018,2020,2023],{"class":487,"line":525},[485,2008,2009],{"class":544},"    Amount         ",[485,2011,2012],{"class":513},"data",[485,2014,351],{"class":491},[485,2016,2017],{"class":513},"Money",[485,2019,1201],{"class":491},[485,2021,2022],{"class":554},"json:\"amount\"",[485,2024,2025],{"class":491},"`\n",[485,2027,2028,2031,2033,2035,2037,2039,2042],{"class":487,"line":541},[485,2029,2030],{"class":544},"    AmountUSD      ",[485,2032,2012],{"class":513},[485,2034,351],{"class":491},[485,2036,2017],{"class":513},[485,2038,1201],{"class":491},[485,2040,2041],{"class":554},"json:\"amount_usd\"",[485,2043,2025],{"class":491},[485,2045,2046,2049,2051,2054,2057],{"class":487,"line":563},[485,2047,2048],{"class":544},"    Period         ",[485,2050,632],{"class":506},[485,2052,2053],{"class":491},"     `",[485,2055,2056],{"class":554},"json:\"period\"",[485,2058,2025],{"class":491},[485,2060,2061,2064,2067,2070,2073],{"class":487,"line":581},[485,2062,2063],{"class":544},"    OrderCount     ",[485,2065,2066],{"class":506},"int",[485,2068,2069],{"class":491},"        `",[485,2071,2072],{"class":554},"json:\"order_count\"",[485,2074,2025],{"class":491},[485,2076,2077,2080,2082,2084,2087],{"class":487,"line":594},[485,2078,2079],{"class":544},"    AccountLast4   ",[485,2081,632],{"class":506},[485,2083,2053],{"class":491},[485,2085,2086],{"class":554},"json:\"account_last4\"",[485,2088,2025],{"class":491},[485,2090,2091,2094,2096,2098,2101,2103,2106],{"class":487,"line":608},[485,2092,2093],{"class":544},"    Sales          ",[485,2095,2012],{"class":513},[485,2097,351],{"class":491},[485,2099,2100],{"class":513},"Exact",[485,2102,1201],{"class":491},[485,2104,2105],{"class":554},"json:\"sales\"",[485,2107,2025],{"class":491},[485,2109,2110,2113,2115,2117,2120],{"class":487,"line":621},[485,2111,2112],{"class":544},"    CommissionRate ",[485,2114,632],{"class":506},[485,2116,2053],{"class":491},[485,2118,2119],{"class":554},"json:\"commission_rate\"",[485,2121,2025],{"class":491},[485,2123,2124,2127,2129,2131,2133,2135,2138],{"class":487,"line":648},[485,2125,2126],{"class":544},"    Commission     ",[485,2128,2012],{"class":513},[485,2130,351],{"class":491},[485,2132,2017],{"class":513},[485,2134,1201],{"class":491},[485,2136,2137],{"class":554},"json:\"commission\"",[485,2139,2025],{"class":491},[485,2141,2142,2145,2147,2149,2152],{"class":487,"line":680},[485,2143,2144],{"class":544},"    Reference      ",[485,2146,632],{"class":506},[485,2148,2053],{"class":491},[485,2150,2151],{"class":554},"json:\"reference\"",[485,2153,2025],{"class":491},[485,2155,2156,2159,2161,2163,2166],{"class":487,"line":713},[485,2157,2158],{"class":544},"    PayoutURL      ",[485,2160,632],{"class":506},[485,2162,2053],{"class":491},[485,2164,2165],{"class":554},"json:\"payout_url\"",[485,2167,2025],{"class":491},[485,2169,2170,2173,2175,2177,2180],{"class":487,"line":744},[485,2171,2172],{"class":544},"    OrdersURL      ",[485,2174,632],{"class":506},[485,2176,2053],{"class":491},[485,2178,2179],{"class":554},"json:\"orders_url\"",[485,2181,2025],{"class":491},[485,2183,2184],{"class":487,"line":750},[485,2185,775],{"class":491},[197,2187,2188,2190,2191,2194],{},[200,2189,358],{}," compiles it once, when the package initialises. A broken template therefore fails every ",[200,2192,2193],{},"go test"," and every program that imports the package:",[475,2196,2199],{"className":477,"code":2197,"filename":2198,"language":480,"meta":481,"style":481},"PayoutSent = lttr.MustCompile[PayoutSentData](Families, \"payout.sent\", mustSource(\"02-payout-sent.md\"))\n","examples\u002Fquiet\u002Ftemplates.go",[200,2200,2201],{"__ignoreMap":481},[485,2202,2203,2206,2209,2211,2213,2216,2219,2221,2224,2226,2228,2230,2232,2234,2236,2239,2241,2243,2246,2248],{"class":487,"line":488},[485,2204,2205],{"class":544},"PayoutSent ",[485,2207,2208],{"class":491},"=",[485,2210,514],{"class":544},[485,2212,351],{"class":491},[485,2214,2215],{"class":495},"MustCompile",[485,2217,2218],{"class":491},"[",[485,2220,1508],{"class":513},[485,2222,2223],{"class":491},"](",[485,2225,295],{"class":544},[485,2227,1111],{"class":491},[485,2229,669],{"class":491},[485,2231,1496],{"class":554},[485,2233,557],{"class":491},[485,2235,1111],{"class":491},[485,2237,2238],{"class":495}," mustSource",[485,2240,499],{"class":491},[485,2242,557],{"class":491},[485,2244,2245],{"class":554},"02-payout-sent.md",[485,2247,557],{"class":491},[485,2249,2250],{"class":491},"))\n",[197,2252,2253,2254,2257,2258,548],{},"To render it, build a ",[200,2255,2256],{},"Renderer"," from the config and pass a recipient and the data. This program renders Q2 through its typed variable, then all nine through ",[200,2259,409],{},[475,2261,2264],{"className":477,"code":2262,"filename":2263,"language":480,"meta":481,"style":481},"package main\n\nimport (\n    \"fmt\"\n    \"log\"\n\n    \"github.com\u002Fsulv-io\u002Flttr\"\n    \"github.com\u002Fsulv-io\u002Flttr\u002Fexamples\u002Fquiet\"\n)\n\nfunc main() {\n    r, err := lttr.NewRenderer(quiet.Config(quiet.AssetBase))\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    \u002F\u002F One template, typed: the data and recipient come from its sample.\n    v, to := quiet.SamplePayoutSent()\n    m, err := quiet.PayoutSent.Render(r, to, v)\n    if err != nil {\n        log.Fatal(err)\n    }\n    fmt.Printf(\"%s → %s: %s\\n\\n\", m.From.Address, m.To.Address, m.Subject)\n\n    \u002F\u002F All nine, untyped: the view the CLI, goldens and lint use.\n    for _, ex := range quiet.Examples() {\n        m, err := ex.Render(r, nil)\n        if err != nil {\n            log.Fatalf(\"%s: %v\", ex.Name, err)\n        }\n        fmt.Printf(\"%02d %-24s %-13s %s\\n\", ex.Number, ex.Name, m.Stream, m.Subject)\n    }\n}\n","main.go",[200,2265,2266,2274,2278,2286,2295,2304,2308,2317,2326,2331,2335,2347,2386,2401,2418,2422,2426,2431,2453,2492,2504,2518,2522,2592,2596,2601,2630,2658,2672,2712,2718,2784,2789],{"__ignoreMap":481},[485,2267,2268,2271],{"class":487,"line":488},[485,2269,2270],{"class":491},"package",[485,2272,2273],{"class":513}," main\n",[485,2275,2276],{"class":487,"line":525},[485,2277,1824],{"emptyLinePlaceholder":1823},[485,2279,2280,2283],{"class":487,"line":541},[485,2281,2282],{"class":528},"import",[485,2284,2285],{"class":491}," (\n",[485,2287,2288,2290,2293],{"class":487,"line":563},[485,2289,551],{"class":491},[485,2291,2292],{"class":513},"fmt",[485,2294,1782],{"class":491},[485,2296,2297,2299,2302],{"class":487,"line":581},[485,2298,551],{"class":491},[485,2300,2301],{"class":513},"log",[485,2303,1782],{"class":491},[485,2305,2306],{"class":487,"line":594},[485,2307,1824],{"emptyLinePlaceholder":1823},[485,2309,2310,2312,2315],{"class":487,"line":608},[485,2311,551],{"class":491},[485,2313,2314],{"class":513},"github.com\u002Fsulv-io\u002Flttr",[485,2316,1782],{"class":491},[485,2318,2319,2321,2324],{"class":487,"line":621},[485,2320,551],{"class":491},[485,2322,2323],{"class":513},"github.com\u002Fsulv-io\u002Flttr\u002Fexamples\u002Fquiet",[485,2325,1782],{"class":491},[485,2327,2328],{"class":487,"line":648},[485,2329,2330],{"class":491},")\n",[485,2332,2333],{"class":487,"line":680},[485,2334,1824],{"emptyLinePlaceholder":1823},[485,2336,2337,2339,2342,2345],{"class":487,"line":713},[485,2338,492],{"class":491},[485,2340,2341],{"class":495}," main",[485,2343,2344],{"class":491},"()",[485,2346,522],{"class":491},[485,2348,2349,2352,2354,2357,2360,2362,2364,2367,2369,2372,2374,2376,2378,2380,2382,2384],{"class":487,"line":744},[485,2350,2351],{"class":544},"    r",[485,2353,1111],{"class":491},[485,2355,2356],{"class":544}," err ",[485,2358,2359],{"class":491},":=",[485,2361,514],{"class":544},[485,2363,351],{"class":491},[485,2365,2366],{"class":495},"NewRenderer",[485,2368,499],{"class":491},[485,2370,2371],{"class":544},"quiet",[485,2373,351],{"class":491},[485,2375,519],{"class":495},[485,2377,499],{"class":491},[485,2379,2371],{"class":544},[485,2381,351],{"class":491},[485,2383,332],{"class":544},[485,2385,2250],{"class":491},[485,2387,2388,2391,2393,2396,2399],{"class":487,"line":750},[485,2389,2390],{"class":528},"    if",[485,2392,2356],{"class":544},[485,2394,2395],{"class":491},"!=",[485,2397,2398],{"class":491}," nil",[485,2400,522],{"class":491},[485,2402,2403,2406,2408,2411,2413,2416],{"class":487,"line":766},[485,2404,2405],{"class":544},"        log",[485,2407,351],{"class":491},[485,2409,2410],{"class":495},"Fatal",[485,2412,499],{"class":491},[485,2414,2415],{"class":544},"err",[485,2417,2330],{"class":491},[485,2419,2420],{"class":487,"line":772},[485,2421,769],{"class":491},[485,2423,2424],{"class":487,"line":1867},[485,2425,1824],{"emptyLinePlaceholder":1823},[485,2427,2428],{"class":487,"line":1884},[485,2429,2430],{"class":709},"    \u002F\u002F One template, typed: the data and recipient come from its sample.\n",[485,2432,2433,2436,2438,2440,2442,2445,2447,2450],{"class":487,"line":1899},[485,2434,2435],{"class":544},"    v",[485,2437,1111],{"class":491},[485,2439,347],{"class":544},[485,2441,2359],{"class":491},[485,2443,2444],{"class":544}," quiet",[485,2446,351],{"class":491},[485,2448,2449],{"class":495},"SamplePayoutSent",[485,2451,2452],{"class":491},"()\n",[485,2454,2455,2458,2460,2462,2464,2466,2468,2470,2472,2475,2477,2480,2482,2485,2487,2490],{"class":487,"line":1927},[485,2456,2457],{"class":544},"    m",[485,2459,1111],{"class":491},[485,2461,2356],{"class":544},[485,2463,2359],{"class":491},[485,2465,2444],{"class":544},[485,2467,351],{"class":491},[485,2469,375],{"class":544},[485,2471,351],{"class":491},[485,2473,2474],{"class":495},"Render",[485,2476,499],{"class":491},[485,2478,2479],{"class":544},"r",[485,2481,1111],{"class":491},[485,2483,2484],{"class":544}," to",[485,2486,1111],{"class":491},[485,2488,2489],{"class":544}," v",[485,2491,2330],{"class":491},[485,2493,2494,2496,2498,2500,2502],{"class":487,"line":1932},[485,2495,2390],{"class":528},[485,2497,2356],{"class":544},[485,2499,2395],{"class":491},[485,2501,2398],{"class":491},[485,2503,522],{"class":491},[485,2505,2506,2508,2510,2512,2514,2516],{"class":487,"line":1937},[485,2507,2405],{"class":544},[485,2509,351],{"class":491},[485,2511,2410],{"class":495},[485,2513,499],{"class":491},[485,2515,2415],{"class":544},[485,2517,2330],{"class":491},[485,2519,2520],{"class":487,"line":1943},[485,2521,769],{"class":491},[485,2523,2524,2527,2529,2532,2534,2536,2539,2542,2544,2547,2549,2552,2554,2556,2559,2561,2564,2566,2568,2570,2572,2574,2577,2579,2581,2583,2585,2587,2590],{"class":487,"line":1949},[485,2525,2526],{"class":544},"    fmt",[485,2528,351],{"class":491},[485,2530,2531],{"class":495},"Printf",[485,2533,499],{"class":491},[485,2535,557],{"class":491},[485,2537,2538],{"class":1751},"%s",[485,2540,2541],{"class":554}," → ",[485,2543,2538],{"class":1751},[485,2545,2546],{"class":554},": ",[485,2548,2538],{"class":1751},[485,2550,2551],{"class":544},"\\n\\n",[485,2553,557],{"class":491},[485,2555,1111],{"class":491},[485,2557,2558],{"class":544}," m",[485,2560,351],{"class":491},[485,2562,2563],{"class":544},"From",[485,2565,351],{"class":491},[485,2567,664],{"class":544},[485,2569,1111],{"class":491},[485,2571,2558],{"class":544},[485,2573,351],{"class":491},[485,2575,2576],{"class":544},"To",[485,2578,351],{"class":491},[485,2580,664],{"class":544},[485,2582,1111],{"class":491},[485,2584,2558],{"class":544},[485,2586,351],{"class":491},[485,2588,2589],{"class":544},"Subject",[485,2591,2330],{"class":491},[485,2593,2594],{"class":487,"line":1954},[485,2595,1824],{"emptyLinePlaceholder":1823},[485,2597,2598],{"class":487,"line":1959},[485,2599,2600],{"class":709},"    \u002F\u002F All nine, untyped: the view the CLI, goldens and lint use.\n",[485,2602,2603,2606,2609,2611,2614,2616,2619,2621,2623,2626,2628],{"class":487,"line":1965},[485,2604,2605],{"class":528},"    for",[485,2607,2608],{"class":544}," _",[485,2610,1111],{"class":491},[485,2612,2613],{"class":544}," ex ",[485,2615,2359],{"class":491},[485,2617,2618],{"class":528}," range",[485,2620,2444],{"class":544},[485,2622,351],{"class":491},[485,2624,2625],{"class":495},"Examples",[485,2627,2344],{"class":491},[485,2629,522],{"class":491},[485,2631,2633,2636,2638,2640,2642,2645,2647,2649,2651,2653,2655],{"class":487,"line":2632},27,[485,2634,2635],{"class":544},"        m",[485,2637,1111],{"class":491},[485,2639,2356],{"class":544},[485,2641,2359],{"class":491},[485,2643,2644],{"class":544}," ex",[485,2646,351],{"class":491},[485,2648,2474],{"class":495},[485,2650,499],{"class":491},[485,2652,2479],{"class":544},[485,2654,1111],{"class":491},[485,2656,2657],{"class":491}," nil)\n",[485,2659,2661,2664,2666,2668,2670],{"class":487,"line":2660},28,[485,2662,2663],{"class":528},"        if",[485,2665,2356],{"class":544},[485,2667,2395],{"class":491},[485,2669,2398],{"class":491},[485,2671,522],{"class":491},[485,2673,2675,2678,2680,2683,2685,2687,2689,2691,2694,2696,2698,2700,2702,2705,2707,2710],{"class":487,"line":2674},29,[485,2676,2677],{"class":544},"            log",[485,2679,351],{"class":491},[485,2681,2682],{"class":495},"Fatalf",[485,2684,499],{"class":491},[485,2686,557],{"class":491},[485,2688,2538],{"class":1751},[485,2690,2546],{"class":554},[485,2692,2693],{"class":1751},"%v",[485,2695,557],{"class":491},[485,2697,1111],{"class":491},[485,2699,2644],{"class":544},[485,2701,351],{"class":491},[485,2703,2704],{"class":544},"Name",[485,2706,1111],{"class":491},[485,2708,2709],{"class":544}," err",[485,2711,2330],{"class":491},[485,2713,2715],{"class":487,"line":2714},30,[485,2716,2717],{"class":491},"        }\n",[485,2719,2721,2724,2726,2728,2730,2732,2735,2738,2741,2744,2747,2749,2751,2753,2755,2758,2760,2762,2764,2766,2768,2770,2772,2774,2776,2778,2780,2782],{"class":487,"line":2720},31,[485,2722,2723],{"class":544},"        fmt",[485,2725,351],{"class":491},[485,2727,2531],{"class":495},[485,2729,499],{"class":491},[485,2731,557],{"class":491},[485,2733,2734],{"class":1751},"%02d",[485,2736,2737],{"class":1751}," %-24s",[485,2739,2740],{"class":1751}," %-13s",[485,2742,2743],{"class":1751}," %s",[485,2745,2746],{"class":544},"\\n",[485,2748,557],{"class":491},[485,2750,1111],{"class":491},[485,2752,2644],{"class":544},[485,2754,351],{"class":491},[485,2756,2757],{"class":544},"Number",[485,2759,1111],{"class":491},[485,2761,2644],{"class":544},[485,2763,351],{"class":491},[485,2765,2704],{"class":544},[485,2767,1111],{"class":491},[485,2769,2558],{"class":544},[485,2771,351],{"class":491},[485,2773,845],{"class":544},[485,2775,1111],{"class":491},[485,2777,2558],{"class":544},[485,2779,351],{"class":491},[485,2781,2589],{"class":544},[485,2783,2330],{"class":491},[485,2785,2787],{"class":487,"line":2786},32,[485,2788,769],{"class":491},[485,2790,2792],{"class":487,"line":2791},33,[485,2793,775],{"class":491},[475,2795,2801],{"className":2796,"code":2798,"filename":2799,"language":2800,"meta":481},[2797],"language-text","sellers@caribhubs.com → dwayne@example.com: Payout sent: EC$1,019.90\n\n01 order.out_for_delivery   transactional Your order is on its way\n02 payout.sent              transactional Payout sent: EC$1,019.90\n03 auth.reset               security      Your CaribHubs reset code\n04 journal.digest           marketing     The woodworkers of Old Road\n05 campaign.heritage_week   marketing     Heritage Week: 48 hours of island makers\n06 job.offered              transactional New job: Basseterre to Frigate Bay · EC$15\n07 fees.change              marketing     Lower commission on services from 1 November\n08 outreach.partner         outreach      Delivery partnership on Nevis routes\n09 internal.ops_update      internal      Q4 driver onboarding schedule\n","Output","text",[200,2802,2798],{"__ignoreMap":481},[197,2804,2805,2808,2809,2812,2813,2815],{},[200,2806,2807],{},"Example.Render(r, nil)"," renders the precompiled template. Pass a source instead of ",[200,2810,2811],{},"nil"," and it compiles that source first against the same data type, which is how ",[200,2814,213],{}," previews your edits without a rebuild.",[2817,2818,2819,2822,2823,2826,2827,2830,2831,2834,2835,2838,2839,2841,2842,351],"tip",{},[200,2820,2821],{},"SampleJobOffered"," leaves ",[200,2824,2825],{},"MapURL"," empty on purpose. The ",[200,2828,2829],{},"map"," module's ",[200,2832,2833],{},"src"," is optional, so Q6 renders its placeholder ground instead of calling Mapbox. In production you would fetch the image with ",[200,2836,2837],{},"quiet.Mapbox(token, style)",", upload it to your CDN and put that URL in ",[200,2840,2825],{},". See ",[231,2843,125],{"href":126},[235,2845,2847],{"id":2846},"run-the-tools-against-it","Run the tools against it",[197,2849,2850,2851,2853,2854,2857],{},"The ",[200,2852,638],{}," CLI and the ",[200,2855,2856],{},"make"," targets are wired to this package. They are how you look at the design and check a library change:",[240,2859,2860,2870],{},[243,2861,2862],{},[246,2863,2864,2867],{},[249,2865,2866],{},"Command",[249,2868,2869],{},"Uses",[256,2871,2872,2888,2904,2918,2931,2944,2961],{},[246,2873,2874,2879],{},[261,2875,2876],{},[200,2877,2878],{},"make serve",[261,2880,2881,2884,2885,2887],{},[200,2882,2883],{},"quiet.Examples()",", recompiling ",[200,2886,364],{}," from disk on every request",[246,2889,2890,2895],{},[261,2891,2892],{},[200,2893,2894],{},"make preview",[261,2896,2897,2900,2901],{},[200,2898,2899],{},"quiet.Config"," with relative URLs, rendering every example to ",[200,2902,2903],{},"preview\u002F",[246,2905,2906,2911],{},[261,2907,2908],{},[200,2909,2910],{},"lttr lint [files…]",[261,2912,2913,2914,2917],{},"The example whose ",[200,2915,2916],{},"template:"," name the file declares, compiled against its data type",[246,2919,2920,2925],{},[261,2921,2922],{},[200,2923,2924],{},"lttr tags -t name",[261,2926,2927,2930],{},[200,2928,2929],{},"quiet.ByName(name)"," and its template's merge tags",[246,2932,2933,2938],{},[261,2934,2935],{},[200,2936,2937],{},"lttr render -t name",[261,2939,2940,2943],{},[200,2941,2942],{},"quiet.Config(quiet.AssetBase)"," and the example's sample data",[246,2945,2946,2951],{},[261,2947,2948],{},[200,2949,2950],{},"make golden",[261,2952,2953,2954,278,2957,2960],{},"Rewrites ",[200,2955,2956],{},"testdata\u002Fgolden\u002F*.html",[200,2958,2959],{},"*.txt"," from the nine renders",[246,2962,2963,2967],{},[261,2964,2965],{},[200,2966,216],{},[261,2968,2969],{},"The preview, screenshotted next to the handoff frames",[197,2971,2972,2973,210,2976,210,2978,278,2980,351],{},"See ",[231,2974,2975],{"href":137},"CLI",[231,2977,141],{"href":142},[231,2979,146],{"href":147},[231,2981,151],{"href":152},[235,2983,2985],{"id":2984},"copy-the-patterns-not-the-brand","Copy the patterns, not the brand",[197,2987,2988],{},"What carries over to your own service:",[2990,2991,2992,3007,3021,3036],"ul",{},[2993,2994,2995,2999,3000,3003,3004,3006],"li",{},[2996,2997,2998],"strong",{},"Keep templates as files and compile them at init."," ",[200,3001,3002],{},"\u002F\u002Fgo:embed templates\u002F*.md"," plus ",[200,3005,2215],{}," into package-level variables means a broken template stops the build's tests, never a send.",[2993,3008,3009,3012,3013,3016,3017,3020],{},[2996,3010,3011],{},"Build footer copy with helpers."," Most families share their copy. A ",[200,3014,3015],{},"serviceCopy"," or ",[200,3018,3019],{},"marketingCopy"," function keeps the wording in one place.",[2993,3022,3023,3026,3027,3029,3030,278,3033,351],{},[2996,3024,3025],{},"Give each template a sample."," A ",[200,3028,393],{}," function per template returns realistic data and a recipient, so one test can render everything. See ",[200,3031,3032],{},"golden_test.go",[200,3034,3035],{},"lint_test.go",[2993,3037,3038,3026,3041,3043],{},[2996,3039,3040],{},"Restrict modules per family.",[200,3042,814],{}," list for the security-sensitive and internal families turns \"no promotional blocks in a password reset\" into a compile error.",[197,3045,3046],{},"What doesn't carry over: the CaribHubs name, colours, senders, addresses and copy. They are example data.",[3048,3049,3050],"style",{},"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 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}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":481,"searchDepth":525,"depth":525,"links":3052},[3053,3054,3055,3056,3057,3058,3059],{"id":237,"depth":525,"text":238},{"id":443,"depth":525,"text":444},{"id":793,"depth":525,"text":794},{"id":1421,"depth":525,"text":1422},{"id":1729,"depth":525,"text":1730},{"id":2846,"depth":525,"text":2847},{"id":2984,"depth":525,"text":2985},"A tour of examples\u002Fquiet, the worked example that doubles as lttr's conformance suite, and how its nine emails map to the design handoff.","md",null,{},{"icon":165},{"title":162,"description":3060},"7f4dJThYtxH7rfQT8RxnhTF396zHoYBebDBdXa8dyXc",[3068,3070],{"title":151,"path":152,"stem":153,"description":3069,"icon":154,"children":-1},"make golden and reviewing its diffs, the structural lint, make check, fuzzing, the coverage floor, and testing your own templates.",{"title":167,"path":168,"stem":169,"description":3071,"icon":82,"children":-1},"Set lttr up for your own brand, step by step, from a theme and a family registry to a first template and a test that renders it.",1790309828324]