[{"data":1,"prerenderedAt":2178},["ShallowReactive",2],{"navigation_docs":3,"-authoring-merge-tags-and-bindings":191,"-authoring-merge-tags-and-bindings-surround":2173},[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":53,"body":193,"description":2166,"extension":2167,"links":2168,"meta":2169,"navigation":2170,"path":54,"seo":2171,"stem":55,"__hash__":2172},"docs\u002F2.authoring\u002F4.merge-tags-and-bindings.md",{"type":194,"value":195,"toc":2155},"minimark",[196,217,1082,1091,1109,1114,1121,1196,1203,1206,1284,1287,1290,1308,1321,1405,1409,1415,1450,1463,1470,1474,1481,1489,1492,1510,1554,1568,1572,1581,1607,1614,1699,1714,1718,1732,1820,1842,1956,1969,1972,1994,1998,2046,2061,2065,2082,2109,2115,2132,2136,2151],[197,198,199,200,204,205,208,209,212,213,216],"p",{},"A template is compiled against one Go type, its ",[201,202,203],"code",{},"T",". Every ",[201,206,207],{},"{{path}}"," merge tag and every ",[201,210,211],{},":key=\"path\""," binding is resolved against that type when you call ",[201,214,215],{},"lttr.Compile",", so a typo is a compile error with a line and column, not a blank in a sent email. Rendering then follows precompiled accessors and never parses a path.",[218,219,225],"pre",{"className":220,"code":221,"filename":222,"language":223,"meta":224,"style":224},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","package main\n\nimport (\n    \"fmt\"\n    \"net\u002Fmail\"\n\n    \"github.com\u002Fsulv-io\u002Flttr\"\n    \"github.com\u002Fsulv-io\u002Flttr\u002Fdata\"\n)\n\ntype Driver struct {\n    FirstName string `json:\"first_name\"`\n    Phone     string \u002F\u002F no json tag: matched as \"phone\"\n}\n\ntype Tracking struct {\n    TrackURL string `json:\"track_url\"`\n}\n\ntype OrderShipped struct {\n    Tracking                   \u002F\u002F embedded: {{track_url}} is promoted\n    OrderID  string            `json:\"order_id\"`\n    Driver   *Driver           `json:\"driver\"` \u002F\u002F pointer: nil means \"no value\"\n    Total    data.Money        `json:\"total\"`\n    Order    data.Receipt      `json:\"order\"`\n    Labels   map[string]string `json:\"labels\"`\n}\n\nvar families = lttr.NewRegistry(lttr.Family{\n    Name:   \"orders\",\n    From:   mail.Address{Name: \"Acme\", Address: \"orders@acme.example\"},\n    Stream: lttr.Transactional,\n    Header: lttr.H1,\n    Footer: lttr.F2,\n})\n\nconst src = `---\ntemplate: order.shipped\nfamily: orders\nsubject: \"Order {{order_id}} is on its way\"\npreheader: \"{{labels.eta | Arriving soon}}.\"\n---\n\n::statement{eyebrow=\"Order {{order_id}}\"}\n# On its way.\n\nHi {{first_name | there}}, {{driver.first_name | your driver}} is bringing it.\nCall them on {{driver.phone | the number in the app}}.\n\n:button[Track delivery]{href=\"{{track_url}}\"}\n::\n\n::receipt{:order=\"order\"}\n::\n\nOrder total: {{total}}.\n`\n\nfunc main() {\n    t := lttr.MustCompile[OrderShipped](families, \"order.shipped\", []byte(src))\n    for _, tag := range t.Meta().Tags {\n        kind := \"tag\"\n        if tag.Binding {\n            kind = \"binding\"\n        }\n        fmt.Printf(\"%-18s %-13s %-8s %s\\n\", tag.Path, tag.Type, kind, tag.Pos)\n    }\n}\n","main.go","go","",[201,226,227,240,247,257,269,279,284,294,304,310,315,330,351,363,369,374,386,401,406,411,423,432,448,472,495,516,539,544,549,584,605,655,672,689,706,712,717,733,739,745,751,757,762,767,773,779,784,790,796,801,807,813,818,824,829,834,840,845,850,864,917,952,967,983,998,1004,1071,1077],{"__ignoreMap":224},[228,229,232,236],"span",{"class":230,"line":231},"line",1,[228,233,235],{"class":234},"sMK4o","package",[228,237,239],{"class":238},"sBMFI"," main\n",[228,241,243],{"class":230,"line":242},2,[228,244,246],{"emptyLinePlaceholder":245},true,"\n",[228,248,250,254],{"class":230,"line":249},3,[228,251,253],{"class":252},"s7zQu","import",[228,255,256],{"class":234}," (\n",[228,258,260,263,266],{"class":230,"line":259},4,[228,261,262],{"class":234},"    \"",[228,264,265],{"class":238},"fmt",[228,267,268],{"class":234},"\"\n",[228,270,272,274,277],{"class":230,"line":271},5,[228,273,262],{"class":234},[228,275,276],{"class":238},"net\u002Fmail",[228,278,268],{"class":234},[228,280,282],{"class":230,"line":281},6,[228,283,246],{"emptyLinePlaceholder":245},[228,285,287,289,292],{"class":230,"line":286},7,[228,288,262],{"class":234},[228,290,291],{"class":238},"github.com\u002Fsulv-io\u002Flttr",[228,293,268],{"class":234},[228,295,297,299,302],{"class":230,"line":296},8,[228,298,262],{"class":234},[228,300,301],{"class":238},"github.com\u002Fsulv-io\u002Flttr\u002Fdata",[228,303,268],{"class":234},[228,305,307],{"class":230,"line":306},9,[228,308,309],{"class":234},")\n",[228,311,313],{"class":230,"line":312},10,[228,314,246],{"emptyLinePlaceholder":245},[228,316,318,321,324,327],{"class":230,"line":317},11,[228,319,320],{"class":234},"type",[228,322,323],{"class":238}," Driver",[228,325,326],{"class":234}," struct",[228,328,329],{"class":234}," {\n",[228,331,333,337,341,344,348],{"class":230,"line":332},12,[228,334,336],{"class":335},"sTEyZ","    FirstName ",[228,338,340],{"class":339},"spNyl","string",[228,342,343],{"class":234}," `",[228,345,347],{"class":346},"sfazB","json:\"first_name\"",[228,349,350],{"class":234},"`\n",[228,352,354,357,359],{"class":230,"line":353},13,[228,355,356],{"class":335},"    Phone     ",[228,358,340],{"class":339},[228,360,362],{"class":361},"sHwdD"," \u002F\u002F no json tag: matched as \"phone\"\n",[228,364,366],{"class":230,"line":365},14,[228,367,368],{"class":234},"}\n",[228,370,372],{"class":230,"line":371},15,[228,373,246],{"emptyLinePlaceholder":245},[228,375,377,379,382,384],{"class":230,"line":376},16,[228,378,320],{"class":234},[228,380,381],{"class":238}," Tracking",[228,383,326],{"class":234},[228,385,329],{"class":234},[228,387,389,392,394,396,399],{"class":230,"line":388},17,[228,390,391],{"class":335},"    TrackURL ",[228,393,340],{"class":339},[228,395,343],{"class":234},[228,397,398],{"class":346},"json:\"track_url\"",[228,400,350],{"class":234},[228,402,404],{"class":230,"line":403},18,[228,405,368],{"class":234},[228,407,409],{"class":230,"line":408},19,[228,410,246],{"emptyLinePlaceholder":245},[228,412,414,416,419,421],{"class":230,"line":413},20,[228,415,320],{"class":234},[228,417,418],{"class":238}," OrderShipped",[228,420,326],{"class":234},[228,422,329],{"class":234},[228,424,426,429],{"class":230,"line":425},21,[228,427,428],{"class":238},"    Tracking",[228,430,431],{"class":361},"                   \u002F\u002F embedded: {{track_url}} is promoted\n",[228,433,435,438,440,443,446],{"class":230,"line":434},22,[228,436,437],{"class":335},"    OrderID  ",[228,439,340],{"class":339},[228,441,442],{"class":234},"            `",[228,444,445],{"class":346},"json:\"order_id\"",[228,447,350],{"class":234},[228,449,451,454,457,460,463,466,469],{"class":230,"line":450},23,[228,452,453],{"class":335},"    Driver   ",[228,455,456],{"class":234},"*",[228,458,459],{"class":238},"Driver",[228,461,462],{"class":234},"           `",[228,464,465],{"class":346},"json:\"driver\"",[228,467,468],{"class":234},"`",[228,470,471],{"class":361}," \u002F\u002F pointer: nil means \"no value\"\n",[228,473,475,478,481,484,487,490,493],{"class":230,"line":474},24,[228,476,477],{"class":335},"    Total    ",[228,479,480],{"class":238},"data",[228,482,483],{"class":234},".",[228,485,486],{"class":238},"Money",[228,488,489],{"class":234},"        `",[228,491,492],{"class":346},"json:\"total\"",[228,494,350],{"class":234},[228,496,498,501,503,505,508,511,514],{"class":230,"line":497},25,[228,499,500],{"class":335},"    Order    ",[228,502,480],{"class":238},[228,504,483],{"class":234},[228,506,507],{"class":238},"Receipt",[228,509,510],{"class":234},"      `",[228,512,513],{"class":346},"json:\"order\"",[228,515,350],{"class":234},[228,517,519,522,525,527,530,532,534,537],{"class":230,"line":518},26,[228,520,521],{"class":335},"    Labels   ",[228,523,524],{"class":234},"map[",[228,526,340],{"class":339},[228,528,529],{"class":234},"]",[228,531,340],{"class":339},[228,533,343],{"class":234},[228,535,536],{"class":346},"json:\"labels\"",[228,538,350],{"class":234},[228,540,542],{"class":230,"line":541},27,[228,543,368],{"class":234},[228,545,547],{"class":230,"line":546},28,[228,548,246],{"emptyLinePlaceholder":245},[228,550,552,555,558,561,564,566,570,573,576,578,581],{"class":230,"line":551},29,[228,553,554],{"class":234},"var",[228,556,557],{"class":335}," families ",[228,559,560],{"class":234},"=",[228,562,563],{"class":335}," lttr",[228,565,483],{"class":234},[228,567,569],{"class":568},"s2Zo4","NewRegistry",[228,571,572],{"class":234},"(",[228,574,575],{"class":238},"lttr",[228,577,483],{"class":234},[228,579,580],{"class":238},"Family",[228,582,583],{"class":234},"{\n",[228,585,587,590,593,596,599,602],{"class":230,"line":586},30,[228,588,589],{"class":335},"    Name",[228,591,592],{"class":234},":",[228,594,595],{"class":234},"   \"",[228,597,598],{"class":346},"orders",[228,600,601],{"class":234},"\"",[228,603,604],{"class":234},",\n",[228,606,608,611,613,616,618,621,624,627,629,632,635,637,640,643,645,647,650,652],{"class":230,"line":607},31,[228,609,610],{"class":335},"    From",[228,612,592],{"class":234},[228,614,615],{"class":238},"   mail",[228,617,483],{"class":234},[228,619,620],{"class":238},"Address",[228,622,623],{"class":234},"{",[228,625,626],{"class":335},"Name",[228,628,592],{"class":234},[228,630,631],{"class":234}," \"",[228,633,634],{"class":346},"Acme",[228,636,601],{"class":234},[228,638,639],{"class":234},",",[228,641,642],{"class":335}," Address",[228,644,592],{"class":234},[228,646,631],{"class":234},[228,648,649],{"class":346},"orders@acme.example",[228,651,601],{"class":234},[228,653,654],{"class":234},"},\n",[228,656,658,661,663,665,667,670],{"class":230,"line":657},32,[228,659,660],{"class":335},"    Stream",[228,662,592],{"class":234},[228,664,563],{"class":335},[228,666,483],{"class":234},[228,668,669],{"class":335},"Transactional",[228,671,604],{"class":234},[228,673,675,678,680,682,684,687],{"class":230,"line":674},33,[228,676,677],{"class":335},"    Header",[228,679,592],{"class":234},[228,681,563],{"class":335},[228,683,483],{"class":234},[228,685,686],{"class":335},"H1",[228,688,604],{"class":234},[228,690,692,695,697,699,701,704],{"class":230,"line":691},34,[228,693,694],{"class":335},"    Footer",[228,696,592],{"class":234},[228,698,563],{"class":335},[228,700,483],{"class":234},[228,702,703],{"class":335},"F2",[228,705,604],{"class":234},[228,707,709],{"class":230,"line":708},35,[228,710,711],{"class":234},"})\n",[228,713,715],{"class":230,"line":714},36,[228,716,246],{"emptyLinePlaceholder":245},[228,718,720,723,726,728,730],{"class":230,"line":719},37,[228,721,722],{"class":234},"const",[228,724,725],{"class":335}," src ",[228,727,560],{"class":234},[228,729,343],{"class":234},[228,731,732],{"class":346},"---\n",[228,734,736],{"class":230,"line":735},38,[228,737,738],{"class":346},"template: order.shipped\n",[228,740,742],{"class":230,"line":741},39,[228,743,744],{"class":346},"family: orders\n",[228,746,748],{"class":230,"line":747},40,[228,749,750],{"class":346},"subject: \"Order {{order_id}} is on its way\"\n",[228,752,754],{"class":230,"line":753},41,[228,755,756],{"class":346},"preheader: \"{{labels.eta | Arriving soon}}.\"\n",[228,758,760],{"class":230,"line":759},42,[228,761,732],{"class":346},[228,763,765],{"class":230,"line":764},43,[228,766,246],{"emptyLinePlaceholder":245},[228,768,770],{"class":230,"line":769},44,[228,771,772],{"class":346},"::statement{eyebrow=\"Order {{order_id}}\"}\n",[228,774,776],{"class":230,"line":775},45,[228,777,778],{"class":346},"# On its way.\n",[228,780,782],{"class":230,"line":781},46,[228,783,246],{"emptyLinePlaceholder":245},[228,785,787],{"class":230,"line":786},47,[228,788,789],{"class":346},"Hi {{first_name | there}}, {{driver.first_name | your driver}} is bringing it.\n",[228,791,793],{"class":230,"line":792},48,[228,794,795],{"class":346},"Call them on {{driver.phone | the number in the app}}.\n",[228,797,799],{"class":230,"line":798},49,[228,800,246],{"emptyLinePlaceholder":245},[228,802,804],{"class":230,"line":803},50,[228,805,806],{"class":346},":button[Track delivery]{href=\"{{track_url}}\"}\n",[228,808,810],{"class":230,"line":809},51,[228,811,812],{"class":346},"::\n",[228,814,816],{"class":230,"line":815},52,[228,817,246],{"emptyLinePlaceholder":245},[228,819,821],{"class":230,"line":820},53,[228,822,823],{"class":346},"::receipt{:order=\"order\"}\n",[228,825,827],{"class":230,"line":826},54,[228,828,812],{"class":346},[228,830,832],{"class":230,"line":831},55,[228,833,246],{"emptyLinePlaceholder":245},[228,835,837],{"class":230,"line":836},56,[228,838,839],{"class":346},"Order total: {{total}}.\n",[228,841,843],{"class":230,"line":842},57,[228,844,350],{"class":234},[228,846,848],{"class":230,"line":847},58,[228,849,246],{"emptyLinePlaceholder":245},[228,851,853,856,859,862],{"class":230,"line":852},59,[228,854,855],{"class":234},"func",[228,857,858],{"class":568}," main",[228,860,861],{"class":234},"()",[228,863,329],{"class":234},[228,865,867,870,873,875,877,880,883,886,889,892,894,896,899,901,903,906,909,911,914],{"class":230,"line":866},60,[228,868,869],{"class":335},"    t ",[228,871,872],{"class":234},":=",[228,874,563],{"class":335},[228,876,483],{"class":234},[228,878,879],{"class":568},"MustCompile",[228,881,882],{"class":234},"[",[228,884,885],{"class":238},"OrderShipped",[228,887,888],{"class":234},"](",[228,890,891],{"class":335},"families",[228,893,639],{"class":234},[228,895,631],{"class":234},[228,897,898],{"class":346},"order.shipped",[228,900,601],{"class":234},[228,902,639],{"class":234},[228,904,905],{"class":234}," []",[228,907,908],{"class":339},"byte",[228,910,572],{"class":234},[228,912,913],{"class":335},"src",[228,915,916],{"class":234},"))\n",[228,918,920,923,926,928,931,933,936,939,941,944,947,950],{"class":230,"line":919},61,[228,921,922],{"class":252},"    for",[228,924,925],{"class":335}," _",[228,927,639],{"class":234},[228,929,930],{"class":335}," tag ",[228,932,872],{"class":234},[228,934,935],{"class":252}," range",[228,937,938],{"class":335}," t",[228,940,483],{"class":234},[228,942,943],{"class":568},"Meta",[228,945,946],{"class":234},"().",[228,948,949],{"class":335},"Tags ",[228,951,583],{"class":234},[228,953,955,958,960,962,965],{"class":230,"line":954},62,[228,956,957],{"class":335},"        kind ",[228,959,872],{"class":234},[228,961,631],{"class":234},[228,963,964],{"class":346},"tag",[228,966,268],{"class":234},[228,968,970,973,976,978,981],{"class":230,"line":969},63,[228,971,972],{"class":252},"        if",[228,974,975],{"class":335}," tag",[228,977,483],{"class":234},[228,979,980],{"class":335},"Binding ",[228,982,583],{"class":234},[228,984,986,989,991,993,996],{"class":230,"line":985},64,[228,987,988],{"class":335},"            kind ",[228,990,560],{"class":234},[228,992,631],{"class":234},[228,994,995],{"class":346},"binding",[228,997,268],{"class":234},[228,999,1001],{"class":230,"line":1000},65,[228,1002,1003],{"class":234},"        }\n",[228,1005,1007,1010,1012,1015,1017,1019,1023,1026,1029,1032,1035,1037,1039,1041,1043,1046,1048,1050,1052,1055,1057,1060,1062,1064,1066,1069],{"class":230,"line":1006},66,[228,1008,1009],{"class":335},"        fmt",[228,1011,483],{"class":234},[228,1013,1014],{"class":568},"Printf",[228,1016,572],{"class":234},[228,1018,601],{"class":234},[228,1020,1022],{"class":1021},"swJcz","%-18s",[228,1024,1025],{"class":1021}," %-13s",[228,1027,1028],{"class":1021}," %-8s",[228,1030,1031],{"class":1021}," %s",[228,1033,1034],{"class":335},"\\n",[228,1036,601],{"class":234},[228,1038,639],{"class":234},[228,1040,975],{"class":335},[228,1042,483],{"class":234},[228,1044,1045],{"class":335},"Path",[228,1047,639],{"class":234},[228,1049,975],{"class":335},[228,1051,483],{"class":234},[228,1053,1054],{"class":335},"Type",[228,1056,639],{"class":234},[228,1058,1059],{"class":335}," kind",[228,1061,639],{"class":234},[228,1063,975],{"class":335},[228,1065,483],{"class":234},[228,1067,1068],{"class":335},"Pos",[228,1070,309],{"class":234},[228,1072,1074],{"class":230,"line":1073},67,[228,1075,1076],{"class":234},"    }\n",[228,1078,1080],{"class":230,"line":1079},68,[228,1081,368],{"class":234},[218,1083,1089],{"className":1084,"code":1086,"filename":1087,"language":1088,"meta":224},[1085],"language-text","order_id           string        tag      4:17\nlabels.eta         string        tag      5:13\norder_id           string        tag      8:28\nfirst_name         string        tag      11:4\ndriver.first_name  string        tag      11:28\ndriver.phone       string        tag      12:14\ntrack_url          string        tag      14:31\norder              data.Receipt  binding  17:1\ntotal              data.Money    tag      20:14\n","Output","text",[201,1090,1086],{"__ignoreMap":224},[197,1092,1093,1096,1097,1100,1101,1103,1104,483],{},[201,1094,1095],{},"Template.Meta().Tags"," lists every tag and binding with the Go type it resolved to. ",[201,1098,1099],{},"first_name"," is not a field of ",[201,1102,885],{},", so it resolved to the recipient's first name — see ",[1105,1106,1108],"a",{"href":1107},"#search-data-then-the-recipient","Search data, then the recipient",[1110,1111,1113],"h2",{"id":1112},"name-a-path","Name a path",[197,1115,1116,1117,1120],{},"A path is one or more segments joined by dots. Each segment is lower case: ",[201,1118,1119],{},"[a-z_][a-z0-9_]*",". A segment selects:",[1122,1123,1124,1144,1165,1179],"ul",{},[1125,1126,1127,1131,1132,1135,1136,1139,1140,1143],"li",{},[1128,1129,1130],"strong",{},"a struct field by its JSON name."," A field tagged ",[201,1133,1134],{},"`json:\"order_id\"`"," is ",[201,1137,1138],{},"order_id",". Options after the comma (",[201,1141,1142],{},",omitempty",") are ignored.",[1125,1145,1146,1149,1150,1135,1153,1156,1157,1160,1161,1164],{},[1128,1147,1148],{},"a struct field by its lower-cased name"," when it has no JSON name. ",[201,1151,1152],{},"Phone",[201,1154,1155],{},"phone",", ",[201,1158,1159],{},"TrackURL"," without a tag would be ",[201,1162,1163],{},"trackurl",". Give fields JSON tags to choose readable names.",[1125,1166,1167,1170,1171,1174,1175,1178],{},[1128,1168,1169],{},"a promoted field"," of an embedded struct, as Go promotes it: ",[201,1172,1173],{},"track_url"," above comes from the embedded ",[201,1176,1177],{},"Tracking",". Embedded pointers to structs are followed too.",[1125,1180,1181,1184,1185,1188,1189,1192,1193,483],{},[1128,1182,1183],{},"a map key"," in a ",[201,1186,1187],{},"map[string]V",": ",[201,1190,1191],{},"labels.eta"," reads ",[201,1194,1195],{},"Labels[\"eta\"]",[197,1197,1198,1199,1202],{},"Pointers are followed at every step. Unexported fields and fields tagged ",[201,1200,1201],{},"`json:\"-\"`"," never match.",[197,1204,1205],{},"A path that doesn't resolve is a compile error at the tag:",[1207,1208,1209,1222],"table",{},[1210,1211,1212],"thead",{},[1213,1214,1215,1219],"tr",{},[1216,1217,1218],"th",{},"Error",[1216,1220,1221],{},"Cause",[1223,1224,1225,1236,1246,1260,1274],"tbody",{},[1213,1226,1227,1233],{},[1228,1229,1230],"td",{},[201,1231,1232],{},"unknown name \"otp_cod\"",[1228,1234,1235],{},"The first segment is not a field of your type or of the recipient.",[1213,1237,1238,1243],{},[1228,1239,1240],{},[201,1241,1242],{},"unknown field \"nope\" in main.Driver",[1228,1244,1245],{},"A later segment is not a field of that struct.",[1213,1247,1248,1253],{},[1228,1249,1250],{},[201,1251,1252],{},"cannot descend into data.Money at \"total\"",[1228,1254,1255,1256,1259],{},"A path continues past a scalar (",[201,1257,1258],{},"{{total.minor}}","), a slice or a map with non-string keys.",[1213,1261,1262,1267],{},[1228,1263,1264],{},[201,1265,1266],{},"ambiguous field \"name\" in main.T",[1228,1268,1269,1270,1273],{},"Two embedded structs promote a field with the same name at the same depth. Go rejects the same selector; unlike ",[201,1271,1272],{},"encoding\u002Fjson",", a JSON tag on one of them does not break the tie.",[1213,1275,1276,1281],{},[1228,1277,1278],{},[201,1279,1280],{},"invalid path \"Order\"",[1228,1282,1283],{},"A binding path that is not lower-case segments. (A tag with such a path is not a tag at all, just a malformed-tag warning.)",[1110,1285,1108],{"id":1286},"search-data-then-the-recipient",[197,1288,1289],{},"The first segment of a path is looked up in two places, in order:",[1291,1292,1293,1298],"ol",{},[1125,1294,1295,1296,639],{},"your data type ",[201,1297,203],{},[1125,1299,1300,1303,1304,1307],{},[201,1301,1302],{},"lttr.Recipient"," (the same type as ",[201,1305,1306],{},"data.Recipient",").",[197,1309,1310,1311,1314,1315,1317,1318,1320],{},"The first match wins. So ",[201,1312,1313],{},"{{first_name}}"," is the recipient's first name unless ",[201,1316,203],{}," has a ",[201,1319,1099],{}," field of its own. The recipient's fields are:",[1207,1322,1323,1332],{},[1210,1324,1325],{},[1213,1326,1327,1329],{},[1216,1328,1045],{},[1216,1330,1331],{},"Field",[1223,1333,1334,1346,1357,1369,1381,1393],{},[1213,1335,1336,1341],{},[1228,1337,1338],{},[201,1339,1340],{},"address",[1228,1342,1343,1345],{},[201,1344,620],{},", the recipient's email address",[1213,1347,1348,1352],{},[1228,1349,1350],{},[201,1351,1099],{},[1228,1353,1354],{},[201,1355,1356],{},"FirstName",[1213,1358,1359,1364],{},[1228,1360,1361],{},[201,1362,1363],{},"region",[1228,1365,1366],{},[201,1367,1368],{},"Region",[1213,1370,1371,1376],{},[1228,1372,1373],{},[201,1374,1375],{},"entity_address",[1228,1377,1378],{},[201,1379,1380],{},"EntityAddress",[1213,1382,1383,1388],{},[1228,1384,1385],{},[201,1386,1387],{},"preferences_url",[1228,1389,1390],{},[201,1391,1392],{},"PreferencesURL",[1213,1394,1395,1400],{},[1228,1396,1397],{},[201,1398,1399],{},"unsubscribe_url",[1228,1401,1402],{},[201,1403,1404],{},"UnsubscribeURL",[1110,1406,1408],{"id":1407},"print-only-scalars","Print only scalars",[197,1410,1411,1412,592],{},"A merge tag prints one value, so its path must end at a ",[1128,1413,1414],{},"scalar",[1122,1416,1417,1423,1436],{},[1125,1418,1419,1420,1422],{},"a string kind (",[201,1421,340],{}," or a named string type),",[1125,1424,1425,1426,1156,1429,1156,1432,1435],{},"an integer kind (",[201,1427,1428],{},"int",[201,1430,1431],{},"int64",[201,1433,1434],{},"uint8","…),",[1125,1437,1438,1439,1442,1443,1446,1447,483],{},"any type implementing ",[201,1440,1441],{},"fmt.Stringer"," with a value receiver, which includes ",[201,1444,1445],{},"data.Money"," and ",[201,1448,1449],{},"data.Exact",[197,1451,1452,1453,1156,1456,1459,1460,1462],{},"Floats, bools, structs that aren't Stringers, slices and maps are not scalars. A tag that ends at one is a compile error naming the type: ",[201,1454,1455],{},"{{driver}} is main.Driver, not a scalar",[201,1457,1458],{},"{{driver.rating}} is float64, not a scalar",". Format such values in Go (a ",[201,1461,340],{}," field, or a Stringer type) before they reach the template.",[197,1464,1465,1466,1469],{},"A value is formatted with its ",[201,1467,1468],{},"String()"," method, as the string itself, or as a decimal integer.",[1110,1471,1473],{"id":1472},"give-a-fallback","Give a fallback",[197,1475,1476,1477,1480],{},"At render time, a tag has ",[1128,1478,1479],{},"no value"," when (D8):",[1122,1482,1483,1486],{},[1125,1484,1485],{},"a nil pointer or a missing map key is on its path, or",[1125,1487,1488],{},"the value formats to the empty string.",[197,1490,1491],{},"Then its fallback is used:",[218,1493,1498],{"className":1494,"code":1495,"filename":1496,"language":1497,"meta":224,"style":224},"language-markdown shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","Hi {{first_name | there}},\nYour driver is {{driver.first_name | \"on the way\"}}.\n","templates\u002Forder.md","markdown",[201,1499,1500,1505],{"__ignoreMap":224},[228,1501,1502],{"class":230,"line":231},[228,1503,1504],{"class":335},"Hi {{first_name | there}},\n",[228,1506,1507],{"class":230,"line":242},[228,1508,1509],{"class":335},"Your driver is {{driver.first_name | \"on the way\"}}.\n",[197,1511,1512,1513,1516,1517,1520,1521,1446,1523,1526,1527,1530,1531,1520,1534,1446,1536,1538,1539,1530,1542,1545,1546,1549,1550,1553],{},"A tag with no value and no fallback is a render error, with the tag's position: ",[201,1514,1515],{},"order.shipped:4:17: no value for {{order_id}}",". A few places are optional instead, and a missing value there renders as nothing: ",[201,1518,1519],{},"preheader","; the ",[201,1522,913],{},[201,1524,1525],{},"alt"," of an ",[201,1528,1529],{},"image"," or ",[201,1532,1533],{},"map",[201,1535,1529],{},[201,1537,1525],{}," of a ",[201,1540,1541],{},":::story",[201,1543,1544],{},":::product","; and the F2 ",[201,1547,1548],{},"about"," value (family copy or ",[201,1551,1552],{},"footer.about","), where an empty result drops the \"service email about …\" line.",[197,1555,1556,1557,1188,1560,1563,1564,1307],{},"A fallback is literal text. It can't hold another merge tag. Inside a GFM table cell, write the separator as ",[201,1558,1559],{},"\\|",[201,1561,1562],{},"{{first_name \\| there}}"," (see ",[1105,1565,1567],{"href":1566},"\u002Fauthoring\u002Fcomark-syntax#build-tables","Build tables",[1110,1569,1571],{"id":1570},"bind-structured-values","Bind structured values",[197,1573,1574,1575,1577,1578,1580],{},"Some modules need more than a line of text: a whole receipt, a list of products. They take a ",[1128,1576,995],{},", an attribute whose name starts with ",[201,1579,592],{}," and whose value is a path:",[218,1582,1584],{"className":1494,"code":1583,"filename":1496,"language":1497,"meta":224,"style":224},"::receipt{:order=\"order\"}\n::\n\n::products{:items=\"products\"}\n::\n",[201,1585,1586,1590,1594,1598,1603],{"__ignoreMap":224},[228,1587,1588],{"class":230,"line":231},[228,1589,823],{"class":335},[228,1591,1592],{"class":230,"line":242},[228,1593,812],{"class":335},[228,1595,1596],{"class":230,"line":249},[228,1597,246],{"emptyLinePlaceholder":245},[228,1599,1600],{"class":230,"line":259},[228,1601,1602],{"class":335},"::products{:items=\"products\"}\n",[228,1604,1605],{"class":230,"line":271},[228,1606,812],{"class":335},[197,1608,1609,1610,1613],{},"A binding resolves with the same path rules and the same scope as a merge tag, but it must resolve to ",[1128,1611,1612],{},"exactly"," the type its module needs:",[1207,1615,1616,1625],{},[1210,1617,1618],{},[1213,1619,1620,1623],{},[1216,1621,1622],{},"Binding",[1216,1624,1054],{},[1223,1626,1627,1643,1658,1672,1687],{},[1213,1628,1629,1638],{},[1228,1630,1631,1634,1635],{},[201,1632,1633],{},"receipt"," ",[201,1636,1637],{},":order",[1228,1639,1640],{},[201,1641,1642],{},"data.Receipt",[1213,1644,1645,1653],{},[1228,1646,1647,1634,1650],{},[201,1648,1649],{},"stock",[201,1651,1652],{},":items",[1228,1654,1655],{},[201,1656,1657],{},"[]data.StockItem",[1213,1659,1660,1667],{},[1228,1661,1662,1634,1665],{},[201,1663,1664],{},"products",[201,1666,1652],{},[1228,1668,1669],{},[201,1670,1671],{},"[]data.Product",[1213,1673,1674,1682],{},[1228,1675,1676,1634,1679],{},[201,1677,1678],{},"progress",[201,1680,1681],{},":steps",[1228,1683,1684],{},[201,1685,1686],{},"[]string",[1213,1688,1689,1696],{},[1228,1690,1691,1634,1693],{},[201,1692,1678],{},[201,1694,1695],{},":current",[1228,1697,1698],{},"a string or integer kind, checked at render",[197,1700,1701,1702,1705,1706,1709,1710,1713],{},"A pointer on the path is followed, so a ",[201,1703,1704],{},"*data.Receipt"," field binds too. Anything else is a compile error naming both types: ",[201,1707,1708],{},"receipt: :order is string, want data.Receipt",". A named slice type such as ",[201,1711,1712],{},"type Items []data.Product"," is a different type and does not bind.",[1110,1715,1717],{"id":1716},"know-how-urls-are-escaped","Know how URLs are escaped",[197,1719,1720,1721,1724,1725,1727,1728,1731],{},"Merge tags in an ",[201,1722,1723],{},"href",", a link destination or an image ",[201,1726,913],{}," are escaped as URL parts at render time (D34). The rule is about ",[1128,1729,1730],{},"where"," the value sits:",[1122,1733,1734,1744,1760,1817],{},[1125,1735,1736,1739,1740,1743],{},[1128,1737,1738],{},"At the very start",", a value is inserted as is. ",[201,1741,1742],{},"href=\"{{track_url}}\""," passes a whole URL from your data through unchanged, so it can carry its own path and query.",[1125,1745,1746,1749,1750,1753,1754,1756,1757,483],{},[1128,1747,1748],{},"After some literal text, in the path, query or fragment",", a value is escaped. Before a ",[201,1751,1752],{},"?"," it is escaped as a path segment; after a ",[201,1755,1752],{}," it is escaped as a query value, with spaces as ",[201,1758,1759],{},"%20",[1125,1761,1762,1765,1766,1769,1770,1156,1773,1530,1775,1778,1779,1782,1783,1530,1785,1787,1788,1790,1791,1530,1794,1797,1798,1801,1802,1805,1806,1530,1808,1810,1811,1813,1814,483],{},[1128,1763,1764],{},"After some literal text, in the host"," (the URL so far has ",[201,1767,1768],{},"\u002F\u002F"," and no ",[201,1771,1772],{},"\u002F",[201,1774,1752],{},[201,1776,1777],{},"#"," after it), a value is not escaped, but it must be a whole DNS label of the host: a single label (ASCII letters, digits and ",[201,1780,1781],{},"-",", not at either end), immediately preceded by literal ",[201,1784,1768],{},[201,1786,483],{},", and immediately followed by literal text starting with ",[201,1789,483],{},", as in ",[201,1792,1793],{},"https:\u002F\u002F{{shop}}.example.com\u002F",[201,1795,1796],{},"https:\u002F\u002Fa.{{shop}}.example.com\u002F",". ",[201,1799,1800],{},"https:\u002F\u002Faccounts-{{shop}}.example.com\u002F"," fails too, since the tag is preceded by ",[201,1803,1804],{},"accounts-",", not ",[201,1807,1768],{},[201,1809,483],{},". A missing optional value there (an image or map ",[201,1812,913],{}," with no fallback) is the same error, not dropped. Anything else is a render error at the tag: ",[201,1815,1816],{},"merge value {{shop}} cannot form part of a url host",[1125,1818,1819],{},"A fallback follows the same rule as the value it replaces.",[197,1821,1822,1823,1826,1827,1156,1830,1826,1833,1446,1836,1826,1839,592],{},"With ",[201,1824,1825],{},"q"," = ",[201,1828,1829],{},"a b&c=d\u002Fe?f#g@h",[201,1831,1832],{},"email",[201,1834,1835],{},"kim@example.com",[201,1837,1838],{},"shop",[201,1840,1841],{},"shop1",[1207,1843,1844,1854],{},[1210,1845,1846],{},[1213,1847,1848,1851],{},[1216,1849,1850],{},"Template",[1216,1852,1853],{},"Rendered",[1223,1855,1856,1868,1880,1892,1904,1915,1928,1943],{},[1213,1857,1858,1863],{},[1228,1859,1860],{},[201,1861,1862],{},"{{q}}",[1228,1864,1865,1867],{},[201,1866,1829],{},", as is, then checked as a URL",[1213,1869,1870,1875],{},[1228,1871,1872],{},[201,1873,1874],{},"https:\u002F\u002Fx.example\u002Fp\u002F{{q}}",[1228,1876,1877],{},[201,1878,1879],{},"https:\u002F\u002Fx.example\u002Fp\u002Fa%20b&c=d%2Fe%3Ff%23g@h",[1213,1881,1882,1887],{},[1228,1883,1884],{},[201,1885,1886],{},"https:\u002F\u002Fx.example\u002Fsearch?q={{q}}",[1228,1888,1889],{},[201,1890,1891],{},"https:\u002F\u002Fx.example\u002Fsearch?q=a%20b%26c%3Dd%2Fe%3Ff%23g%40h",[1213,1893,1894,1899],{},[1228,1895,1896],{},[201,1897,1898],{},"mailto:{{email}}",[1228,1900,1901],{},[201,1902,1903],{},"mailto:kim@example.com",[1213,1905,1906,1910],{},[1228,1907,1908],{},[201,1909,1793],{},[1228,1911,1912],{},[201,1913,1914],{},"https:\u002F\u002Fshop1.example.com\u002F",[1213,1916,1917,1922],{},[1228,1918,1919],{},[201,1920,1921],{},"https:\u002F\u002F{{q}}.example.com\u002F",[1228,1923,1924,1925,1927],{},"render error: ",[201,1926,1825],{}," is not a single DNS label",[1213,1929,1930,1934],{},[1228,1931,1932],{},[201,1933,1800],{},[1228,1935,1924,1936,1938,1939,1530,1941],{},[201,1937,1838],{}," isn't preceded by ",[201,1940,1768],{},[201,1942,483],{},[1213,1944,1945,1950],{},[1228,1946,1947],{},[201,1948,1949],{},"https:\u002F\u002F{{shop}}\u002Fx",[1228,1951,1952,1953,1955],{},"render error: no literal ",[201,1954,483],{}," follows the tag",[197,1957,1958,1959,1530,1962,1965,1966,483],{},"A tag that makes up the whole host, such as ",[201,1960,1961],{},"https:\u002F\u002F{{host}}",[201,1963,1964],{},"https:\u002F\u002F{{host}}\u002Fx",", always fails, whatever its value. Pass the whole URL as the first part instead: ",[201,1967,1968],{},"href=\"{{shop_url}}\"",[197,1970,1971],{},"A value can never add a query parameter, change the path or fragment, or move the host. The result is then checked like every URL: an invalid URL or a disallowed scheme is a render error.",[1973,1974,1975,1976,1978,1979,1982,1983,1986,1987,1989,1990,1993],"tip",{},"If your data holds a complete URL, put it first: ",[201,1977,1742],{},". Writing ",[201,1980,1981],{},"href=\"https:\u002F\u002Fexample.com\u002F{{path}}\""," with a ",[201,1984,1985],{},"path"," that contains ",[201,1988,1772],{}," gives ",[201,1991,1992],{},"%2F",", not a nested path.",[1110,1995,1997],{"id":1996},"use-placeholders-only-in-footer-copy","Use placeholders only in footer copy",[197,1999,2000,2003,2004,2007,2008,2011,2012,1188,2015,1156,2018,1156,2021,1156,2024,1156,2027,1156,2030,1156,2033,1156,2036,1156,2039,2042,2043,2045],{},[201,2001,2002],{},"{name}"," with single braces is a ",[1128,2005,2006],{},"placeholder",", not a merge tag. Placeholders exist in family copy and in the ",[201,2009,2010],{},"footer.*"," frontmatter overrides, which appear in the footer, and are filled per message from ",[201,2013,2014],{},"lttr.Vars",[201,2016,2017],{},"{site}",[201,2019,2020],{},"{brand}",[201,2022,2023],{},"{domain}",[201,2025,2026],{},"{region}",[201,2028,2029],{},"{address}",[201,2031,2032],{},"{about}",[201,2034,2035],{},"{prefs}",[201,2037,2038],{},"{unsubscribe}",[201,2040,2041],{},"{issue}"," (D5). In the body, subject or preheader, ",[201,2044,2017],{}," is plain text.",[197,2047,2048,2049,2052,2053,2055,2056,1446,2059,483],{},"Family copy cannot use merge tags (",[201,2050,2051],{},"merge tags are not allowed in copy","); ",[201,2054,2010],{}," overrides can use both. See ",[1105,2057,43],{"href":2058},"\u002Fauthoring\u002Ffrontmatter#use-placeholders-in-footer-overrides",[1105,2060,74],{"href":75},[1110,2062,2064],{"id":2063},"list-a-templates-tags","List a template's tags",[197,2066,2067,2069,2070,2072,2073,1530,2075,2077,2078,2081],{},[201,2068,1095],{}," is available on every compiled template, as in the program above. For the Quiet examples, the CLI (run from a checkout of lttr) prints the same list, sorted by position, as ",[201,2071,1985],{},", Go type, ",[201,2074,964],{},[201,2076,995],{},", and ",[201,2079,2080],{},"line:col"," separated by tabs:",[218,2083,2088],{"className":2084,"code":2085,"filename":2086,"language":2087,"meta":224,"style":224},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go run .\u002Fcmd\u002Flttr tags -t order.out_for_delivery\n","Terminal","bash",[201,2089,2090],{"__ignoreMap":224},[228,2091,2092,2094,2097,2100,2103,2106],{"class":230,"line":231},[228,2093,223],{"class":238},[228,2095,2096],{"class":346}," run",[228,2098,2099],{"class":346}," .\u002Fcmd\u002Flttr",[228,2101,2102],{"class":346}," tags",[228,2104,2105],{"class":346}," -t",[228,2107,2108],{"class":346}," order.out_for_delivery\n",[218,2110,2113],{"className":2111,"code":2112,"filename":1087,"language":1088,"meta":224},[1085],"destination string  tag 5:25\neta string  tag 5:44\norder_id    string  tag 10:28\ndriver.first_name   string  tag 13:1\npicked_up_at    string  tag 13:47\ndestination string  tag 13:79\neta string  tag 13:98\ntrack_url   string  tag 15:31\norder   data.Receipt    binding 21:1\ndeliver_to.name string  tag 26:1\ndeliver_to.address  string  tag 27:1\ndriver.name string  tag 30:1\ndriver.rating   string  tag 30:24\ndriver.vehicle  string  tag 31:1\n",[201,2114,2112],{"__ignoreMap":224},[197,2116,2117,2120,2121,2124,2125,2128,2129,483],{},[201,2118,2119],{},"lttr tags"," knows only the data types of ",[201,2122,2123],{},"examples\u002Fquiet","; for your own templates, read ",[201,2126,2127],{},"Meta().Tags",". See ",[1105,2130,2131],{"href":137},"CLI",[1110,2133,2135],{"id":2134},"next-steps","Next steps",[1122,2137,2138,2146],{},[1125,2139,2140,2142,2143,2145],{},[1105,2141,58],{"href":59}," for the ",[201,2144,1723],{}," attributes these URLs go into.",[1125,2147,2148,2150],{},[1105,2149,63],{"href":64}," for every path error in context.",[2152,2153,2154],"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 .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 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 .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":224,"searchDepth":242,"depth":242,"links":2156},[2157,2158,2159,2160,2161,2162,2163,2164,2165],{"id":1112,"depth":242,"text":1113},{"id":1286,"depth":242,"text":1108},{"id":1407,"depth":242,"text":1408},{"id":1472,"depth":242,"text":1473},{"id":1570,"depth":242,"text":1571},{"id":1716,"depth":242,"text":1717},{"id":1996,"depth":242,"text":1997},{"id":2063,"depth":242,"text":2064},{"id":2134,"depth":242,"text":2135},"How a template reaches into your Go data — path rules, scope, scalars, fallbacks, bindings and URL escaping.","md",null,{},{"icon":56},{"title":53,"description":2166},"-ybhFvEJzONboXTdS4VLvuq_fl4LRPUoBmZloR1LFco",[2174,2176],{"title":48,"path":49,"stem":50,"description":2175,"icon":51,"children":-1},"Every block component a template can use — its attributes, what it may contain and the rules the compiler enforces.",{"title":58,"path":59,"stem":60,"description":2177,"icon":61,"children":-1},"Buttons, links and styled runs of text — the two inline components and the five span classes.",1790309827263]