[{"data":1,"prerenderedAt":2395},["ShallowReactive",2],{"navigation_docs":3,"-authoring-compile-errors":191,"-authoring-compile-errors-surround":2390},[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":63,"body":193,"description":2383,"extension":2384,"links":2385,"meta":2386,"navigation":2387,"path":64,"seo":2388,"stem":65,"__hash__":2389},"docs\u002F2.authoring\u002F6.compile-errors.md",{"type":194,"value":195,"toc":2369},"minimark",[196,204,209,224,235,238,284,288,294,363,369,1167,1173,1187,1196,1200,1210,1279,1371,1374,1378,1381,1386,1617,1620,1729,1732,2005,2008,2098,2101,2224,2249,2253,2275,2299,2305,2308,2314,2344,2348,2365],[197,198,199,203],"p",{},[200,201,202],"code",{},"lttr.Compile"," checks everything about a template that doesn't depend on data: the Comark source, the frontmatter, every module and its attributes, every merge tag and binding against your Go type, and the family rules. It reports every problem it finds at once, each with the template name, line and column.",[205,206,208],"h2",{"id":207},"read-an-error","Read an error",[197,210,211,212,215,216,219,220,223],{},"Each error is one line: ",[200,213,214],{},"name:line:col: message",". Lines and columns start at 1, and columns count bytes. When there are several, ",[200,217,218],{},"Compile"," joins them with ",[200,221,222],{},"errors.Join",", so printing the error prints one per line:",[225,226,233],"pre",{"className":227,"code":229,"filename":230,"language":231,"meta":232},[228],"language-text","auth.reset:7:15: unknown name \"cod\"\nauth.reset:11:1: notice: tone must be \"warn\"\n","Output","text","",[200,234,229],{"__ignoreMap":232},[197,236,237],{},"A few things decide what you see:",[239,240,241,249,269,279],"ul",{},[242,243,244,248],"li",{},[245,246,247],"strong",{},"A parse error stops early."," If the Comark itself can't be parsed (an unclosed frontmatter, an invalid attribute list, bad props YAML, invalid UTF-8), you get that one error, the earliest in the file.",[242,250,251,254,255,258,259,258,262,258,265,268],{},[245,252,253],{},"Template errors come before family errors."," The family rules (",[200,256,257],{},"from",", ",[200,260,261],{},"issue",[200,263,264],{},"legal",[200,266,267],{},"footer.*",", forbidden modules) run only once the template compiles on its own. Fix the first batch and the family errors appear on the next compile (D28).",[242,270,271,274,275,278],{},[245,272,273],{},"Module errors point at the module."," An unknown attribute or a wrong count is reported at the first ",[200,276,277],{},":"," of the component, not at the attribute.",[242,280,281],{},[245,282,283],{},"Exact duplicates are dropped.",[205,285,287],{"id":286},"handle-errors-in-go","Handle errors in Go",[197,289,290,291,277],{},"Every positioned error is an ",[200,292,293],{},"*ir.Error",[225,295,300],{"className":296,"code":297,"filename":298,"language":299,"meta":232,"style":232},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","type Error struct {\n    Name string \u002F\u002F template (or copy) name\n    Pos  Pos    \u002F\u002F Pos{Line, Col}, 1-based\n    Msg  string\n}\n","ir\u002Ferrors.go","go",[200,301,302,321,336,348,357],{"__ignoreMap":232},[303,304,307,311,315,318],"span",{"class":305,"line":306},"line",1,[303,308,310],{"class":309},"sMK4o","type",[303,312,314],{"class":313},"sBMFI"," Error",[303,316,317],{"class":309}," struct",[303,319,320],{"class":309}," {\n",[303,322,324,328,332],{"class":305,"line":323},2,[303,325,327],{"class":326},"sTEyZ","    Name ",[303,329,331],{"class":330},"spNyl","string",[303,333,335],{"class":334},"sHwdD"," \u002F\u002F template (or copy) name\n",[303,337,339,342,345],{"class":305,"line":338},3,[303,340,341],{"class":326},"    Pos  ",[303,343,344],{"class":313},"Pos",[303,346,347],{"class":334},"    \u002F\u002F Pos{Line, Col}, 1-based\n",[303,349,351,354],{"class":305,"line":350},4,[303,352,353],{"class":326},"    Msg  ",[303,355,356],{"class":330},"string\n",[303,358,360],{"class":305,"line":359},5,[303,361,362],{"class":309},"}\n",[197,364,365,368],{},[200,366,367],{},"errors.As"," finds the first one. To walk all of them, unwrap the joined error:",[225,370,373],{"className":296,"code":371,"filename":372,"language":299,"meta":232,"style":232},"package main\n\nimport (\n    \"errors\"\n    \"fmt\"\n    \"net\u002Fmail\"\n\n    \"github.com\u002Fsulv-io\u002Flttr\"\n    \"github.com\u002Fsulv-io\u002Flttr\u002Fir\"\n)\n\ntype Reset struct {\n    Code      string `json:\"code\"`\n    ExpiresIn string `json:\"expires_in\"`\n}\n\nvar families = lttr.NewRegistry(lttr.Family{\n    Name:   \"security\",\n    From:   mail.Address{Name: \"Acme Security\", Address: \"security@acme.example\"},\n    Stream: lttr.Security,\n    Header: lttr.H1,\n    Footer: lttr.F2,\n})\n\nconst src = `---\ntemplate: auth.reset\nfamily: security\nsubject: Your reset code\n---\n\n::code{value=\"{{cod}}\"}\nIt expires in {{expires_in}}.\n::\n\n::notice{tone=\"red\"}\nDidn't ask for this? You can ignore this email.\n::\n`\n\nfunc main() {\n    _, err := lttr.Compile[Reset](families, \"auth.reset\", []byte(src))\n    if err == nil {\n        return\n    }\n\n    \u002F\u002F The whole error: one \"name:line:col: message\" per line.\n    fmt.Println(err)\n\n    \u002F\u002F Each joined error is an *ir.Error with its own position.\n    errs := []error{err}\n    if j, ok := err.(interface{ Unwrap() []error }); ok {\n        errs = j.Unwrap()\n    }\n    for _, e := range errs {\n        var ce *ir.Error\n        if errors.As(e, &ce) {\n            fmt.Printf(\"line %d, col %d: %s\\n\", ce.Pos.Line, ce.Pos.Col, ce.Msg)\n        }\n    }\n}\n","main.go",[200,374,375,383,389,398,409,418,428,433,443,453,459,464,476,494,509,514,519,555,575,625,642,659,676,682,687,703,709,715,721,726,731,737,743,749,754,760,766,771,776,781,795,852,868,874,880,885,891,909,914,920,939,976,994,999,1023,1043,1075,1151,1157,1162],{"__ignoreMap":232},[303,376,377,380],{"class":305,"line":306},[303,378,379],{"class":309},"package",[303,381,382],{"class":313}," main\n",[303,384,385],{"class":305,"line":323},[303,386,388],{"emptyLinePlaceholder":387},true,"\n",[303,390,391,395],{"class":305,"line":338},[303,392,394],{"class":393},"s7zQu","import",[303,396,397],{"class":309}," (\n",[303,399,400,403,406],{"class":305,"line":350},[303,401,402],{"class":309},"    \"",[303,404,405],{"class":313},"errors",[303,407,408],{"class":309},"\"\n",[303,410,411,413,416],{"class":305,"line":359},[303,412,402],{"class":309},[303,414,415],{"class":313},"fmt",[303,417,408],{"class":309},[303,419,421,423,426],{"class":305,"line":420},6,[303,422,402],{"class":309},[303,424,425],{"class":313},"net\u002Fmail",[303,427,408],{"class":309},[303,429,431],{"class":305,"line":430},7,[303,432,388],{"emptyLinePlaceholder":387},[303,434,436,438,441],{"class":305,"line":435},8,[303,437,402],{"class":309},[303,439,440],{"class":313},"github.com\u002Fsulv-io\u002Flttr",[303,442,408],{"class":309},[303,444,446,448,451],{"class":305,"line":445},9,[303,447,402],{"class":309},[303,449,450],{"class":313},"github.com\u002Fsulv-io\u002Flttr\u002Fir",[303,452,408],{"class":309},[303,454,456],{"class":305,"line":455},10,[303,457,458],{"class":309},")\n",[303,460,462],{"class":305,"line":461},11,[303,463,388],{"emptyLinePlaceholder":387},[303,465,467,469,472,474],{"class":305,"line":466},12,[303,468,310],{"class":309},[303,470,471],{"class":313}," Reset",[303,473,317],{"class":309},[303,475,320],{"class":309},[303,477,479,482,484,487,491],{"class":305,"line":478},13,[303,480,481],{"class":326},"    Code      ",[303,483,331],{"class":330},[303,485,486],{"class":309}," `",[303,488,490],{"class":489},"sfazB","json:\"code\"",[303,492,493],{"class":309},"`\n",[303,495,497,500,502,504,507],{"class":305,"line":496},14,[303,498,499],{"class":326},"    ExpiresIn ",[303,501,331],{"class":330},[303,503,486],{"class":309},[303,505,506],{"class":489},"json:\"expires_in\"",[303,508,493],{"class":309},[303,510,512],{"class":305,"line":511},15,[303,513,362],{"class":309},[303,515,517],{"class":305,"line":516},16,[303,518,388],{"emptyLinePlaceholder":387},[303,520,522,525,528,531,534,537,541,544,547,549,552],{"class":305,"line":521},17,[303,523,524],{"class":309},"var",[303,526,527],{"class":326}," families ",[303,529,530],{"class":309},"=",[303,532,533],{"class":326}," lttr",[303,535,536],{"class":309},".",[303,538,540],{"class":539},"s2Zo4","NewRegistry",[303,542,543],{"class":309},"(",[303,545,546],{"class":313},"lttr",[303,548,536],{"class":309},[303,550,551],{"class":313},"Family",[303,553,554],{"class":309},"{\n",[303,556,558,561,563,566,569,572],{"class":305,"line":557},18,[303,559,560],{"class":326},"    Name",[303,562,277],{"class":309},[303,564,565],{"class":309},"   \"",[303,567,568],{"class":489},"security",[303,570,571],{"class":309},"\"",[303,573,574],{"class":309},",\n",[303,576,578,581,583,586,588,591,594,597,599,602,605,607,610,613,615,617,620,622],{"class":305,"line":577},19,[303,579,580],{"class":326},"    From",[303,582,277],{"class":309},[303,584,585],{"class":313},"   mail",[303,587,536],{"class":309},[303,589,590],{"class":313},"Address",[303,592,593],{"class":309},"{",[303,595,596],{"class":326},"Name",[303,598,277],{"class":309},[303,600,601],{"class":309}," \"",[303,603,604],{"class":489},"Acme Security",[303,606,571],{"class":309},[303,608,609],{"class":309},",",[303,611,612],{"class":326}," Address",[303,614,277],{"class":309},[303,616,601],{"class":309},[303,618,619],{"class":489},"security@acme.example",[303,621,571],{"class":309},[303,623,624],{"class":309},"},\n",[303,626,628,631,633,635,637,640],{"class":305,"line":627},20,[303,629,630],{"class":326},"    Stream",[303,632,277],{"class":309},[303,634,533],{"class":326},[303,636,536],{"class":309},[303,638,639],{"class":326},"Security",[303,641,574],{"class":309},[303,643,645,648,650,652,654,657],{"class":305,"line":644},21,[303,646,647],{"class":326},"    Header",[303,649,277],{"class":309},[303,651,533],{"class":326},[303,653,536],{"class":309},[303,655,656],{"class":326},"H1",[303,658,574],{"class":309},[303,660,662,665,667,669,671,674],{"class":305,"line":661},22,[303,663,664],{"class":326},"    Footer",[303,666,277],{"class":309},[303,668,533],{"class":326},[303,670,536],{"class":309},[303,672,673],{"class":326},"F2",[303,675,574],{"class":309},[303,677,679],{"class":305,"line":678},23,[303,680,681],{"class":309},"})\n",[303,683,685],{"class":305,"line":684},24,[303,686,388],{"emptyLinePlaceholder":387},[303,688,690,693,696,698,700],{"class":305,"line":689},25,[303,691,692],{"class":309},"const",[303,694,695],{"class":326}," src ",[303,697,530],{"class":309},[303,699,486],{"class":309},[303,701,702],{"class":489},"---\n",[303,704,706],{"class":305,"line":705},26,[303,707,708],{"class":489},"template: auth.reset\n",[303,710,712],{"class":305,"line":711},27,[303,713,714],{"class":489},"family: security\n",[303,716,718],{"class":305,"line":717},28,[303,719,720],{"class":489},"subject: Your reset code\n",[303,722,724],{"class":305,"line":723},29,[303,725,702],{"class":489},[303,727,729],{"class":305,"line":728},30,[303,730,388],{"emptyLinePlaceholder":387},[303,732,734],{"class":305,"line":733},31,[303,735,736],{"class":489},"::code{value=\"{{cod}}\"}\n",[303,738,740],{"class":305,"line":739},32,[303,741,742],{"class":489},"It expires in {{expires_in}}.\n",[303,744,746],{"class":305,"line":745},33,[303,747,748],{"class":489},"::\n",[303,750,752],{"class":305,"line":751},34,[303,753,388],{"emptyLinePlaceholder":387},[303,755,757],{"class":305,"line":756},35,[303,758,759],{"class":489},"::notice{tone=\"red\"}\n",[303,761,763],{"class":305,"line":762},36,[303,764,765],{"class":489},"Didn't ask for this? You can ignore this email.\n",[303,767,769],{"class":305,"line":768},37,[303,770,748],{"class":489},[303,772,774],{"class":305,"line":773},38,[303,775,493],{"class":309},[303,777,779],{"class":305,"line":778},39,[303,780,388],{"emptyLinePlaceholder":387},[303,782,784,787,790,793],{"class":305,"line":783},40,[303,785,786],{"class":309},"func",[303,788,789],{"class":539}," main",[303,791,792],{"class":309},"()",[303,794,320],{"class":309},[303,796,798,801,803,806,809,811,813,815,818,821,824,827,829,831,834,836,838,841,844,846,849],{"class":305,"line":797},41,[303,799,800],{"class":326},"    _",[303,802,609],{"class":309},[303,804,805],{"class":326}," err ",[303,807,808],{"class":309},":=",[303,810,533],{"class":326},[303,812,536],{"class":309},[303,814,218],{"class":539},[303,816,817],{"class":309},"[",[303,819,820],{"class":313},"Reset",[303,822,823],{"class":309},"](",[303,825,826],{"class":326},"families",[303,828,609],{"class":309},[303,830,601],{"class":309},[303,832,833],{"class":489},"auth.reset",[303,835,571],{"class":309},[303,837,609],{"class":309},[303,839,840],{"class":309}," []",[303,842,843],{"class":330},"byte",[303,845,543],{"class":309},[303,847,848],{"class":326},"src",[303,850,851],{"class":309},"))\n",[303,853,855,858,860,863,866],{"class":305,"line":854},42,[303,856,857],{"class":393},"    if",[303,859,805],{"class":326},[303,861,862],{"class":309},"==",[303,864,865],{"class":309}," nil",[303,867,320],{"class":309},[303,869,871],{"class":305,"line":870},43,[303,872,873],{"class":393},"        return\n",[303,875,877],{"class":305,"line":876},44,[303,878,879],{"class":309},"    }\n",[303,881,883],{"class":305,"line":882},45,[303,884,388],{"emptyLinePlaceholder":387},[303,886,888],{"class":305,"line":887},46,[303,889,890],{"class":334},"    \u002F\u002F The whole error: one \"name:line:col: message\" per line.\n",[303,892,894,897,899,902,904,907],{"class":305,"line":893},47,[303,895,896],{"class":326},"    fmt",[303,898,536],{"class":309},[303,900,901],{"class":539},"Println",[303,903,543],{"class":309},[303,905,906],{"class":326},"err",[303,908,458],{"class":309},[303,910,912],{"class":305,"line":911},48,[303,913,388],{"emptyLinePlaceholder":387},[303,915,917],{"class":305,"line":916},49,[303,918,919],{"class":334},"    \u002F\u002F Each joined error is an *ir.Error with its own position.\n",[303,921,923,926,928,930,933,935,937],{"class":305,"line":922},50,[303,924,925],{"class":326},"    errs ",[303,927,808],{"class":309},[303,929,840],{"class":309},[303,931,932],{"class":330},"error",[303,934,593],{"class":309},[303,936,906],{"class":326},[303,938,362],{"class":309},[303,940,942,944,947,949,952,954,957,960,963,965,967,969,972,974],{"class":305,"line":941},51,[303,943,857],{"class":393},[303,945,946],{"class":326}," j",[303,948,609],{"class":309},[303,950,951],{"class":326}," ok ",[303,953,808],{"class":309},[303,955,956],{"class":326}," err",[303,958,959],{"class":309},".(interface{",[303,961,962],{"class":539}," Unwrap",[303,964,792],{"class":309},[303,966,840],{"class":309},[303,968,932],{"class":330},[303,970,971],{"class":309}," });",[303,973,951],{"class":326},[303,975,554],{"class":309},[303,977,979,982,984,986,988,991],{"class":305,"line":978},52,[303,980,981],{"class":326},"        errs ",[303,983,530],{"class":309},[303,985,946],{"class":326},[303,987,536],{"class":309},[303,989,990],{"class":539},"Unwrap",[303,992,993],{"class":309},"()\n",[303,995,997],{"class":305,"line":996},53,[303,998,879],{"class":309},[303,1000,1002,1005,1008,1010,1013,1015,1018,1021],{"class":305,"line":1001},54,[303,1003,1004],{"class":393},"    for",[303,1006,1007],{"class":326}," _",[303,1009,609],{"class":309},[303,1011,1012],{"class":326}," e ",[303,1014,808],{"class":309},[303,1016,1017],{"class":393}," range",[303,1019,1020],{"class":326}," errs ",[303,1022,554],{"class":309},[303,1024,1026,1029,1032,1035,1038,1040],{"class":305,"line":1025},55,[303,1027,1028],{"class":309},"        var",[303,1030,1031],{"class":326}," ce ",[303,1033,1034],{"class":309},"*",[303,1036,1037],{"class":313},"ir",[303,1039,536],{"class":309},[303,1041,1042],{"class":313},"Error\n",[303,1044,1046,1049,1052,1054,1057,1059,1062,1064,1067,1070,1073],{"class":305,"line":1045},56,[303,1047,1048],{"class":393},"        if",[303,1050,1051],{"class":326}," errors",[303,1053,536],{"class":309},[303,1055,1056],{"class":539},"As",[303,1058,543],{"class":309},[303,1060,1061],{"class":326},"e",[303,1063,609],{"class":309},[303,1065,1066],{"class":309}," &",[303,1068,1069],{"class":326},"ce",[303,1071,1072],{"class":309},")",[303,1074,320],{"class":309},[303,1076,1078,1081,1083,1086,1088,1090,1093,1097,1100,1102,1105,1108,1111,1113,1115,1118,1120,1122,1124,1127,1129,1131,1133,1135,1137,1140,1142,1144,1146,1149],{"class":305,"line":1077},57,[303,1079,1080],{"class":326},"            fmt",[303,1082,536],{"class":309},[303,1084,1085],{"class":539},"Printf",[303,1087,543],{"class":309},[303,1089,571],{"class":309},[303,1091,1092],{"class":489},"line ",[303,1094,1096],{"class":1095},"swJcz","%d",[303,1098,1099],{"class":489},", col ",[303,1101,1096],{"class":1095},[303,1103,1104],{"class":489},": ",[303,1106,1107],{"class":1095},"%s",[303,1109,1110],{"class":326},"\\n",[303,1112,571],{"class":309},[303,1114,609],{"class":309},[303,1116,1117],{"class":326}," ce",[303,1119,536],{"class":309},[303,1121,344],{"class":326},[303,1123,536],{"class":309},[303,1125,1126],{"class":326},"Line",[303,1128,609],{"class":309},[303,1130,1117],{"class":326},[303,1132,536],{"class":309},[303,1134,344],{"class":326},[303,1136,536],{"class":309},[303,1138,1139],{"class":326},"Col",[303,1141,609],{"class":309},[303,1143,1117],{"class":326},[303,1145,536],{"class":309},[303,1147,1148],{"class":326},"Msg",[303,1150,458],{"class":309},[303,1152,1154],{"class":305,"line":1153},58,[303,1155,1156],{"class":309},"        }\n",[303,1158,1160],{"class":305,"line":1159},59,[303,1161,879],{"class":309},[303,1163,1165],{"class":305,"line":1164},60,[303,1166,362],{"class":309},[225,1168,1171],{"className":1169,"code":1170,"filename":230,"language":231,"meta":232},[228],"auth.reset:7:15: unknown name \"cod\"\nauth.reset:11:1: notice: tone must be \"warn\"\nline 7, col 15: unknown name \"cod\"\nline 11, col 1: notice: tone must be \"warn\"\n",[200,1172,1170],{"__ignoreMap":232},[197,1174,1175,1176,1179,1180,1183,1184,536],{},"Two errors have no position, because they are about the call rather than the template: ",[200,1177,1178],{},"lttr: template data must be a struct, got string"," when ",[200,1181,1182],{},"T"," is not a struct, and ",[200,1185,1186],{},"lttr: nil registry",[197,1188,1189,1192,1193,1195],{},[200,1190,1191],{},"MustCompile"," panics with the same joined error. Use it for package-level templates, so a broken template stops the service at startup, and ",[200,1194,218],{}," when the source comes from somewhere you don't control.",[205,1197,1199],{"id":1198},"read-warnings","Read warnings",[197,1201,1202,1203,1206,1207,277],{},"Warnings never fail a compile. They are on the compiled template, formatted ",[200,1204,1205],{},"name:line:col: warning: message",", and are also copied into every rendered ",[200,1208,1209],{},"Message.Warnings",[1211,1212,1213,1226],"table",{},[1214,1215,1216],"thead",{},[1217,1218,1219,1223],"tr",{},[1220,1221,1222],"th",{},"Warning",[1220,1224,1225],{},"Cause",[1227,1228,1229,1244,1261],"tbody",{},[1217,1230,1231,1237],{},[1232,1233,1234],"td",{},[200,1235,1236],{},"frontmatter: no preheader",[1232,1238,1239,1240,1243],{},"The template has no ",[200,1241,1242],{},"preheader",". The inbox then previews the first text of the email.",[1217,1245,1246,1251],{},[1232,1247,1248],{},[200,1249,1250],{},"letter: more than 4 paragraphs",[1232,1252,1253,1254,1257,1258,536],{},"A letter (or a run of loose Markdown) has five or more paragraphs. Split it, or move detail into ",[200,1255,1256],{},"meta",", a table or a ",[200,1259,1260],{},"notice",[1217,1262,1263,1268],{},[1232,1264,1265],{},[200,1266,1267],{},"malformed merge tag \"{{ Name }}\"",[1232,1269,1270,1271,1274,1275,1278],{},"Something starts with ",[200,1272,1273],{},"{{"," but isn't a valid tag, so it is sent as literal text. Usually an upper-case letter, a missing brace, or a bare ",[200,1276,1277],{},"|"," in a table cell.",[225,1280,1283],{"className":296,"code":1281,"filename":1282,"language":299,"meta":232,"style":232},"func TestTemplatesHaveNoWarnings(t *testing.T) {\n    for _, w := range orderShipped.Meta().Warnings {\n        t.Error(w) \u002F\u002F e.g. order.shipped:1:1: warning: frontmatter: no preheader\n    }\n}\n","templates_test.go",[200,1284,1285,1312,1343,1363,1367],{"__ignoreMap":232},[303,1286,1287,1289,1292,1294,1298,1301,1304,1306,1308,1310],{"class":305,"line":306},[303,1288,786],{"class":309},[303,1290,1291],{"class":539}," TestTemplatesHaveNoWarnings",[303,1293,543],{"class":309},[303,1295,1297],{"class":1296},"sHdIc","t",[303,1299,1300],{"class":309}," *",[303,1302,1303],{"class":313},"testing",[303,1305,536],{"class":309},[303,1307,1182],{"class":313},[303,1309,1072],{"class":309},[303,1311,320],{"class":309},[303,1313,1314,1316,1318,1320,1323,1325,1327,1330,1332,1335,1338,1341],{"class":305,"line":323},[303,1315,1004],{"class":393},[303,1317,1007],{"class":326},[303,1319,609],{"class":309},[303,1321,1322],{"class":326}," w ",[303,1324,808],{"class":309},[303,1326,1017],{"class":393},[303,1328,1329],{"class":326}," orderShipped",[303,1331,536],{"class":309},[303,1333,1334],{"class":539},"Meta",[303,1336,1337],{"class":309},"().",[303,1339,1340],{"class":326},"Warnings ",[303,1342,554],{"class":309},[303,1344,1345,1348,1350,1353,1355,1358,1360],{"class":305,"line":338},[303,1346,1347],{"class":326},"        t",[303,1349,536],{"class":309},[303,1351,1352],{"class":539},"Error",[303,1354,543],{"class":309},[303,1356,1357],{"class":326},"w",[303,1359,1072],{"class":309},[303,1361,1362],{"class":334}," \u002F\u002F e.g. order.shipped:1:1: warning: frontmatter: no preheader\n",[303,1364,1365],{"class":305,"line":350},[303,1366,879],{"class":309},[303,1368,1369],{"class":305,"line":359},[303,1370,362],{"class":309},[197,1372,1373],{},"Warnings are produced only when the template compiles. A template with errors reports the errors alone.",[205,1375,1377],{"id":1376},"fix-common-errors","Fix common errors",[197,1379,1380],{},"The messages below are copied from the compiler; quoted names and numbers change with your template.",[1382,1383,1385],"h3",{"id":1384},"syntax","Syntax",[1211,1387,1388,1398],{},[1214,1389,1390],{},[1217,1391,1392,1395],{},[1220,1393,1394],{},"Message",[1220,1396,1397],{},"Cause and fix",[1227,1399,1400,1414,1427,1444,1458,1475,1491,1501,1524,1536,1549,1564,1574,1600],{},[1217,1401,1402,1407],{},[1232,1403,1404],{},[200,1405,1406],{},"frontmatter: missing closing ---",[1232,1408,1409,1410,1413],{},"The frontmatter has no closing ",[200,1411,1412],{},"---"," line.",[1217,1415,1416,1421],{},[1232,1417,1418],{},[200,1419,1420],{},"duplicate attribute \"a\"",[1232,1422,1423,1424,536],{},"The same key twice in one ",[200,1425,1426],{},"{…}",[1217,1428,1429,1434],{},[1232,1430,1431],{},[200,1432,1433],{},"binding :order needs a value",[1232,1435,1436,1437,1440,1441,536],{},"A ",[200,1438,1439],{},":key"," with no ",[200,1442,1443],{},"=\"path\"",[1217,1445,1446,1451],{},[1232,1447,1448],{},[200,1449,1450],{},"props: did not find expected ',' or ']'",[1232,1452,1453,1454,1457],{},"A YAML error in a props block, reported on its line with a ",[200,1455,1456],{},"props:"," prefix.",[1217,1459,1460,1465],{},[1232,1461,1462],{},[200,1463,1464],{},"props: given twice",[1232,1466,1467,1468,1470,1471,1474],{},"Both a ",[200,1469,1412],{}," props block and a ",[200,1472,1473],{},"yaml [props]"," fence.",[1217,1476,1477,1482],{},[1232,1478,1479],{},[200,1480,1481],{},"slots are reserved",[1232,1483,1436,1484,1487,1488,536],{},[200,1485,1486],{},"#name"," line inside a component. Remove it, or add a space for a heading: ",[200,1489,1490],{},"# Name",[1217,1492,1493,1498],{},[1232,1494,1495],{},[200,1496,1497],{},"raw html is not allowed",[1232,1499,1500],{},"An HTML tag or block. Use modules, spans and Markdown.",[1217,1502,1503,1508],{},[1232,1504,1505],{},[200,1506,1507],{},"images are not allowed in prose; use ::image",[1232,1509,1510,1513,1514,258,1517,1520,1521,536],{},[200,1511,1512],{},"![alt](src)"," in text. Use ",[200,1515,1516],{},"::image",[200,1518,1519],{},"::map"," or a tile's ",[200,1522,1523],{},"image",[1217,1525,1526,1531],{},[1232,1527,1528],{},[200,1529,1530],{},"strikethrough is not allowed",[1232,1532,1533,536],{},[200,1534,1535],{},"~~text~~",[1217,1537,1538,1543],{},[1232,1539,1540],{},[200,1541,1542],{},"link titles are not supported",[1232,1544,1545,1548],{},[200,1546,1547],{},"[text](url \"title\")",". Drop the title.",[1217,1550,1551,1556],{},[1232,1552,1553],{},[200,1554,1555],{},"attributes are only allowed on spans and inline components",[1232,1557,1558,1560,1561,536],{},[200,1559,1426],{}," after a link, emphasis or code span. Wrap it in a span: ",[200,1562,1563],{},"[`code`]{.small}",[1217,1565,1566,1571],{},[1232,1567,1568],{},[200,1569,1570],{},"use ::divider instead of ---",[1232,1572,1573],{},"A Markdown rule between modules.",[1217,1575,1576,1581],{},[1232,1577,1578],{},[200,1579,1580],{},"unknown span class \".red\"",[1232,1582,1583,1584,258,1587,258,1590,258,1593,1596,1597,536],{},"Span classes are ",[200,1585,1586],{},"muted",[200,1588,1589],{},"teal",[200,1591,1592],{},"mono",[200,1594,1595],{},"small"," and ",[200,1598,1599],{},"bold",[1217,1601,1602,1607],{},[1232,1603,1604],{},[200,1605,1606],{},"unknown inline component \":note\"",[1232,1608,1609,1610,1596,1613,1616],{},"Only ",[200,1611,1612],{},":button",[200,1614,1615],{},":link"," exist.",[1382,1618,43],{"id":1619},"frontmatter",[1211,1621,1622,1630],{},[1214,1623,1624],{},[1217,1625,1626,1628],{},[1220,1627,1394],{},[1220,1629,1397],{},[1227,1631,1632,1655,1669,1679,1695,1714],{},[1217,1633,1634,1639],{},[1232,1635,1636],{},[200,1637,1638],{},"frontmatter: missing \"subject\"",[1232,1640,1641,1642,258,1645,258,1648,1651,1652,536],{},"A required key (",[200,1643,1644],{},"template",[200,1646,1647],{},"family",[200,1649,1650],{},"subject",") is missing. Reported at ",[200,1653,1654],{},"1:1",[1217,1656,1657,1662],{},[1232,1658,1659],{},[200,1660,1661],{},"frontmatter: template \"payout\" does not match name \"payout.sent\"",[1232,1663,1664,1666,1667,536],{},[200,1665,1644],{}," must equal the name passed to ",[200,1668,218],{},[1217,1670,1671,1676],{},[1232,1672,1673],{},[200,1674,1675],{},"frontmatter: unknown key \"colour\"",[1232,1677,1678],{},"Not one of the frontmatter keys. Check the spelling.",[1217,1680,1681,1686],{},[1232,1682,1683],{},[200,1684,1685],{},"frontmatter: \"legal\" must be a boolean",[1232,1687,1688,1689,1596,1692,536],{},"A value of the wrong YAML type. Also ",[200,1690,1691],{},"must be a string",[200,1693,1694],{},"\"footer\" must be a mapping",[1217,1696,1697,1702],{},[1232,1698,1699],{},[200,1700,1701],{},"frontmatter: \"footer.note\" must be one paragraph",[1232,1703,1704,258,1707,1596,1710,1713],{},[200,1705,1706],{},"footer.note",[200,1708,1709],{},"footer.reason",[200,1711,1712],{},"footer.optout"," hold one paragraph of Markdown.",[1217,1715,1716,1721],{},[1232,1717,1718],{},[200,1719,1720],{},"unknown placeholder \"{sitee}\"",[1232,1722,1436,1723,1725,1726,536],{},[200,1724,267],{}," value uses a placeholder that is not in ",[200,1727,1728],{},"lttr.Vars",[1382,1730,48],{"id":1731},"modules",[1211,1733,1734,1742],{},[1214,1735,1736],{},[1217,1737,1738,1740],{},[1220,1739,1394],{},[1220,1741,1397],{},[1227,1743,1744,1759,1776,1786,1796,1806,1816,1843,1853,1865,1882,1892,1902,1917,1932,1949,1959,1977,1995],{},[1217,1745,1746,1751],{},[1232,1747,1748],{},[200,1749,1750],{},"unknown module \"stats\"",[1232,1752,1753,1754,536],{},"Not a module name or alias. See the ",[1755,1756,1758],"a",{"href":1757},"\u002Fauthoring\u002Fmodules#look-up-a-module","catalogue",[1217,1760,1761,1766],{},[1232,1762,1763],{},[200,1764,1765],{},"letter: unknown attribute \"x\"",[1232,1767,1768,1769,1772,1773,536],{},"The module doesn't read that key, or it is an ",[200,1770,1771],{},"#id"," or ",[200,1774,1775],{},".class",[1217,1777,1778,1783],{},[1232,1779,1780],{},[200,1781,1782],{},"statement: \"eyebrow\" set twice",[1232,1784,1785],{},"The same key as an attribute and in the props block.",[1217,1787,1788,1793],{},[1232,1789,1790],{},[200,1791,1792],{},"statement: tone must be \"orange\"",[1232,1794,1795],{},"An enumerated value outside its options.",[1217,1797,1798,1803],{},[1232,1799,1800],{},[200,1801,1802],{},"image: \"height\" must be an integer",[1232,1804,1805],{},"A number attribute that doesn't parse.",[1217,1807,1808,1813],{},[1232,1809,1810],{},[200,1811,1812],{},"figure: missing \"amount\"",[1232,1814,1815],{},"A required attribute is missing.",[1217,1817,1818,1823],{},[1232,1819,1820],{},[200,1821,1822],{},"letter: h1 is not allowed here",[1232,1824,1825,1826,1829,1830,1833,1834,1838,1839,1842],{},"A block the module doesn't take. Loose Markdown is a letter, which allows only ",[200,1827,1828],{},"###"," headings: put the big heading in a ",[200,1831,1832],{},"statement",". If the heading ",[1835,1836,1837],"em",{},"is"," inside a ",[200,1840,1841],{},"::statement",", its opener probably has an unclosed quote, which turns the opener into text.",[1217,1844,1845,1850],{},[1232,1846,1847],{},[200,1848,1849],{},"statement: at most one heading",[1232,1851,1852],{},"A statement has one heading.",[1217,1854,1855,1860],{},[1232,1856,1857],{},[200,1858,1859],{},"notice: 1 or 2 paragraphs, got 3",[1232,1861,1862,1863,536],{},"A content count outside the module's range; see ",[1755,1864,48],{"href":49},[1217,1866,1867,1872],{},[1232,1868,1869],{},[200,1870,1871],{},"breakdown: table must have 2 columns, has 3",[1232,1873,1874,1875,1878,1879,1881],{},"A table wider than the module allows (",[200,1876,1877],{},"compare"," 3, ",[200,1880,1211],{}," 4).",[1217,1883,1884,1889],{},[1232,1885,1886],{},[200,1887,1888],{},"breakdown: expected one table",[1232,1890,1891],{},"A table module's content is exactly one GFM table.",[1217,1893,1894,1899],{},[1232,1895,1896],{},[200,1897,1898],{},"divider: content is not allowed",[1232,1900,1901],{},"The module takes no content.",[1217,1903,1904,1909],{},[1232,1905,1906],{},[200,1907,1908],{},"image must directly follow a statement",[1232,1910,1911,1912,1914,1915,536],{},"Move the ",[200,1913,1516],{}," right after a ",[200,1916,1841],{},[1217,1918,1919,1924],{},[1232,1920,1921],{},[200,1922,1923],{},"more than one :button in the template",[1232,1925,1926,1927,1929,1930,536],{},"Keep one ",[200,1928,1612],{},"; make the rest ",[200,1931,1615],{},[1217,1933,1934,1939],{},[1232,1935,1936],{},[200,1937,1938],{},"letter: :button is not allowed; use :link",[1232,1940,1941,1942,1944,1945,1948],{},"Buttons go in a ",[200,1943,1832],{}," or an ",[200,1946,1947],{},"actions"," module.",[1217,1950,1951,1956],{},[1232,1952,1953],{},[200,1954,1955],{},":button must stand alone in its paragraph",[1232,1957,1958],{},"A button sharing a paragraph with text. Put it on its own line.",[1217,1960,1961,1966],{},[1232,1962,1963],{},[200,1964,1965],{},":link: missing href",[1232,1967,1968,1969,1972,1973,1976],{},"An action without ",[200,1970,1971],{},"href",". Also ",[200,1974,1975],{},":button: missing label"," without a label.",[1217,1978,1979,1984],{},[1232,1980,1981],{},[200,1982,1983],{},"progress: current \"Shipped\" is not a step",[1232,1985,1986,1987,1990,1991,1994],{},"A literal ",[200,1988,1989],{},"current"," must be one of ",[200,1992,1993],{},"steps",", or its 1-based number.",[1217,1996,1997,2002],{},[1232,1998,1999],{},[200,2000,2001],{},"products: use :items or :::product children, not both",[1232,2003,2004],{},"Pick one source of tiles.",[1382,2006,53],{"id":2007},"merge-tags-and-bindings",[1211,2009,2010,2018],{},[1214,2011,2012],{},[1217,2013,2014,2016],{},[1220,2015,1394],{},[1220,2017,1397],{},[1227,2019,2020,2034,2044,2058,2068,2078,2088],{},[1217,2021,2022,2027],{},[1232,2023,2024],{},[200,2025,2026],{},"unknown name \"otp_cod\"",[1232,2028,2029,2030,2033],{},"The first segment is not a field of your type or of ",[200,2031,2032],{},"Recipient",". Usually a typo, or a field without the JSON tag you expected.",[1217,2035,2036,2041],{},[1232,2037,2038],{},[200,2039,2040],{},"unknown field \"nope\" in main.Driver",[1232,2042,2043],{},"A later segment doesn't exist on that struct.",[1217,2045,2046,2051],{},[1232,2047,2048],{},[200,2049,2050],{},"{{driver}} is main.Driver, not a scalar",[1232,2052,2053,2054,2057],{},"A tag must end at a string, an integer or a ",[200,2055,2056],{},"fmt.Stringer",". Point it at a field.",[1217,2059,2060,2065],{},[1232,2061,2062],{},[200,2063,2064],{},"cannot descend into data.Money at \"total\"",[1232,2066,2067],{},"A path continues past a scalar, a slice or a non-string-keyed map.",[1217,2069,2070,2075],{},[1232,2071,2072],{},[200,2073,2074],{},"ambiguous field \"name\" in main.T",[1232,2076,2077],{},"Two embedded structs promote the same name. Rename one or add JSON tags that differ.",[1217,2079,2080,2085],{},[1232,2081,2082],{},[200,2083,2084],{},"receipt: :order is string, want data.Receipt",[1232,2086,2087],{},"A binding must resolve to exactly the module's type.",[1217,2089,2090,2095],{},[1232,2091,2092],{},[200,2093,2094],{},"receipt: missing binding \":order\"",[1232,2096,2097],{},"A required binding is missing.",[1382,2099,2100],{"id":826},"Families",[1211,2102,2103,2111],{},[1214,2104,2105],{},[1217,2106,2107,2109],{},[1220,2108,1394],{},[1220,2110,1397],{},[1227,2112,2113,2127,2140,2156,2169,2182,2193,2210],{},[1217,2114,2115,2120],{},[1232,2116,2117],{},[200,2118,2119],{},"frontmatter: unknown family \"nope\"",[1232,2121,2122,2124,2125,536],{},[200,2123,1647],{}," is not in the registry passed to ",[200,2126,218],{},[1217,2128,2129,2134],{},[1232,2130,2131],{},[200,2132,2133],{},"module \"image\" is not allowed in family \"security\"",[1232,2135,2136,2137,536],{},"The family lists this module in ",[200,2138,2139],{},"Forbidden",[1217,2141,2142,2147],{},[1232,2143,2144],{},[200,2145,2146],{},"frontmatter: family \"b2b\" requires \"from\"",[1232,2148,2149,2150,2153,2154,536],{},"The family has ",[200,2151,2152],{},"FromFrontmatter","; add ",[200,2155,257],{},[1217,2157,2158,2163],{},[1232,2159,2160],{},[200,2161,2162],{},"frontmatter: \"from\" is only allowed for families that take it",[1232,2164,2165,2166,2168],{},"Remove ",[200,2167,257],{},": the family has a fixed sender.",[1217,2170,2171,2176],{},[1232,2172,2173],{},[200,2174,2175],{},"frontmatter: family \"newsletter\" requires \"issue\"",[1232,2177,2178,2179,2181],{},"H3 families need ",[200,2180,261],{}," for the masthead.",[1217,2183,2184,2189],{},[1232,2185,2186],{},[200,2187,2188],{},"frontmatter: \"issue\" is only allowed for families with a masthead",[1232,2190,2165,2191,536],{},[200,2192,261],{},[1217,2194,2195,2200],{},[1232,2196,2197],{},[200,2198,2199],{},"frontmatter: family \"buyer\" has no legal variant",[1232,2201,2202,2205,2206,2209],{},[200,2203,2204],{},"legal: true"," needs a family with a ",[200,2207,2208],{},"Legal"," override.",[1217,2211,2212,2217],{},[1232,2213,2214],{},[200,2215,2216],{},"frontmatter: \"footer.reason\" is not used by the footer of family \"buyer\"",[1232,2218,2219,2220,536],{},"That footer doesn't show this override. See ",[1755,2221,2223],{"href":2222},"\u002Fauthoring\u002Ffrontmatter#check-what-the-family-accepts","Check what the family accepts",[197,2225,2226,2227,2230,2231,1772,2234,2236,2237,2239,2240,2243,2244,2246,2247,536],{},"Errors that depend on data happen at render time instead: a tag with no value and no fallback (",[200,2228,2229],{},"no value for {{order_id}}","), a merge value in a URL host that isn't a single DNS label preceded by ",[200,2232,2233],{},"\u002F\u002F",[200,2235,536],{}," and followed by ",[200,2238,536],{}," (",[200,2241,2242],{},"merge value {{shop}} cannot form part of a url host"," — a missing optional value there is the same error, not dropped), an invalid URL, an empty subject. They are ",[200,2245,293],{}," values in the same format; see ",[1755,2248,84],{"href":85},[205,2250,2252],{"id":2251},"lint-from-the-command-line","Lint from the command line",[197,2254,2255,2258,2259,2262,2263,2266,2267,2270,2271,2274],{},[200,2256,2257],{},"lttr lint"," compiles template files and prints errors as ",[200,2260,2261],{},"file:line:col: message"," and warnings as ",[200,2264,2265],{},"file:line:col: warning: message",". It exits 1 when any file has an error. For example, a copy of ",[200,2268,2269],{},"03-password-reset.md"," with a typo in a merge tag, a bad ",[200,2272,2273],{},"tone"," and no preheader:",[225,2276,2281],{"className":2277,"code":2278,"filename":2279,"language":2280,"meta":232,"style":232},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go run .\u002Fcmd\u002Flttr lint 03-password-reset.md\n","Terminal","bash",[200,2282,2283],{"__ignoreMap":232},[303,2284,2285,2287,2290,2293,2296],{"class":305,"line":306},[303,2286,299],{"class":313},[303,2288,2289],{"class":489}," run",[303,2291,2292],{"class":489}," .\u002Fcmd\u002Flttr",[303,2294,2295],{"class":489}," lint",[303,2297,2298],{"class":489}," 03-password-reset.md\n",[225,2300,2303],{"className":2301,"code":2302,"filename":230,"language":231,"meta":232},[228],"03-password-reset.md:13:15: unknown name \"otp_cod\"\n03-password-reset.md:17:1: notice: tone must be \"warn\"\n",[200,2304,2302],{"__ignoreMap":232},[197,2306,2307],{},"With the two errors fixed, the same file compiles and lint prints the warning, exiting 0:",[225,2309,2312],{"className":2310,"code":2311,"filename":230,"language":231,"meta":232},[228],"03-password-reset.md:1:1: warning: frontmatter: no preheader\n",[200,2313,2311],{"__ignoreMap":232},[2315,2316,2317,2319,2320,2323,2324,2327,2328,2331,2332,2334,2335,2338,2339,1596,2342,536],"note",{},[200,2318,2257],{}," compiles each file against the data type of the ",[245,2321,2322],{},"Quiet example"," its ",[200,2325,2326],{},"template:"," key names, so it works on copies of the nine example templates (",[200,2329,2330],{},"unknown template \"x\" (no data type registered)"," otherwise). With no files, it lints the nine embedded examples. For your own templates, compile them in a test: a package-level ",[200,2333,1191],{}," fails ",[200,2336,2337],{},"go test"," on any error. See ",[1755,2340,2341],{"href":137},"CLI",[1755,2343,151],{"href":152},[205,2345,2347],{"id":2346},"next-steps","Next steps",[239,2349,2350,2355,2360],{},[242,2351,2352,2354],{},[1755,2353,38],{"href":39}," for the rules behind the syntax errors.",[242,2356,2357,2359],{},[1755,2358,53],{"href":54}," for path resolution.",[242,2361,2362,2364],{},[1755,2363,141],{"href":142},", which shows compile errors in the browser as you edit.",[2366,2367,2368],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .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 .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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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}",{"title":232,"searchDepth":323,"depth":323,"links":2370},[2371,2372,2373,2374,2381,2382],{"id":207,"depth":323,"text":208},{"id":286,"depth":323,"text":287},{"id":1198,"depth":323,"text":1199},{"id":1376,"depth":323,"text":1377,"children":2375},[2376,2377,2378,2379,2380],{"id":1384,"depth":338,"text":1385},{"id":1619,"depth":338,"text":43},{"id":1731,"depth":338,"text":48},{"id":2007,"depth":338,"text":53},{"id":826,"depth":338,"text":2100},{"id":2251,"depth":323,"text":2252},{"id":2346,"depth":323,"text":2347},"What lttr.Compile reports, how to read it in Go, the warnings, and the common errors with their fixes.","md",null,{},{"icon":66},{"title":63,"description":2383},"KzdEgmKPPhW9tvNwWtXi3RaUsgAk5PGuTUie-PBDWPU",[2391,2393],{"title":58,"path":59,"stem":60,"description":2392,"icon":61,"children":-1},"Buttons, links and styled runs of text — the two inline components and the five span classes.",{"title":74,"path":75,"stem":76,"description":2394,"icon":77,"children":-1},"Define the kinds of email you send, with their sender, stream, header and footer chrome, footer copy and the modules they may not use.",1790309825445]