[{"data":1,"prerenderedAt":1529},["ShallowReactive",2],{"navigation_docs":3,"-authoring-comark-syntax":191,"-authoring-comark-syntax-surround":1524},[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":38,"body":193,"description":1517,"extension":1518,"links":1519,"meta":1520,"navigation":1521,"path":39,"seo":1522,"stem":40,"__hash__":1523},"docs\u002F2.authoring\u002F1.comark-syntax.md",{"type":194,"value":195,"toc":1503},"minimark",[196,209,421,433,438,452,462,466,469,499,547,564,568,575,666,715,719,726,735,863,881,897,909,913,936,940,954,976,992,996,1030,1034,1049,1086,1100,1104,1113,1133,1194,1204,1209,1213,1233,1242,1295,1311,1315,1318,1459,1478,1482,1499],[197,198,199,200,204,205,208],"p",{},"A template is a Markdown file with YAML frontmatter. Comark adds four things to Markdown: block components, inline components, spans with attributes, and merge tags. The ",[201,202,203],"code",{},"comark"," package parses all of it; the ",[201,206,207],{},"ir"," package then decides what is allowed in an email and resolves every merge tag against your Go type.",[210,211,217],"pre",{"className":212,"code":213,"filename":214,"language":215,"meta":216,"style":216},"language-markdown shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","---\ntemplate: order.shipped\nfamily: orders\nsubject: \"Order {{order_id}} is on its way\"\npreheader: \"Arriving by {{eta}}.\"\n---\n\n::statement{eyebrow=\"Order {{order_id}}\"}\n# On its way.\n\nHi {{first_name | there}}, your order will reach you by {{eta}}.\n\n:button[Track delivery]{href=\"{{track_url}}\"}\n::\n\n::breakdown\n| Order total | {{total}} |\n| --- | ---: |\n| [Reference]{.small .muted} | [`{{reference}}`]{.small .muted} |\n::\n","templates\u002Forder.md","markdown","",[201,218,219,228,242,253,270,285,290,297,304,314,319,325,330,336,342,347,353,370,387,416],{"__ignoreMap":216},[220,221,224],"span",{"class":222,"line":223},"line",1,[220,225,227],{"class":226},"sMK4o","---\n",[220,229,231,235,238],{"class":222,"line":230},2,[220,232,234],{"class":233},"swJcz","template",[220,236,237],{"class":226},":",[220,239,241],{"class":240},"sfazB"," order.shipped\n",[220,243,245,248,250],{"class":222,"line":244},3,[220,246,247],{"class":233},"family",[220,249,237],{"class":226},[220,251,252],{"class":240}," orders\n",[220,254,256,259,261,264,267],{"class":222,"line":255},4,[220,257,258],{"class":233},"subject",[220,260,237],{"class":226},[220,262,263],{"class":226}," \"",[220,265,266],{"class":240},"Order {{order_id}} is on its way",[220,268,269],{"class":226},"\"\n",[220,271,273,276,278,280,283],{"class":222,"line":272},5,[220,274,275],{"class":233},"preheader",[220,277,237],{"class":226},[220,279,263],{"class":226},[220,281,282],{"class":240},"Arriving by {{eta}}.",[220,284,269],{"class":226},[220,286,288],{"class":222,"line":287},6,[220,289,227],{"class":226},[220,291,293],{"class":222,"line":292},7,[220,294,296],{"emptyLinePlaceholder":295},true,"\n",[220,298,300],{"class":222,"line":299},8,[220,301,303],{"class":302},"sTEyZ","::statement{eyebrow=\"Order {{order_id}}\"}\n",[220,305,307,310],{"class":222,"line":306},9,[220,308,309],{"class":226},"# ",[220,311,313],{"class":312},"sBMFI","On its way.\n",[220,315,317],{"class":222,"line":316},10,[220,318,296],{"emptyLinePlaceholder":295},[220,320,322],{"class":222,"line":321},11,[220,323,324],{"class":302},"Hi {{first_name | there}}, your order will reach you by {{eta}}.\n",[220,326,328],{"class":222,"line":327},12,[220,329,296],{"emptyLinePlaceholder":295},[220,331,333],{"class":222,"line":332},13,[220,334,335],{"class":302},":button[Track delivery]{href=\"{{track_url}}\"}\n",[220,337,339],{"class":222,"line":338},14,[220,340,341],{"class":302},"::\n",[220,343,345],{"class":222,"line":344},15,[220,346,296],{"emptyLinePlaceholder":295},[220,348,350],{"class":222,"line":349},16,[220,351,352],{"class":302},"::breakdown\n",[220,354,356,359,362,364,367],{"class":222,"line":355},17,[220,357,358],{"class":226},"|",[220,360,361],{"class":302}," Order total ",[220,363,358],{"class":226},[220,365,366],{"class":302}," {{total}} ",[220,368,369],{"class":226},"|\n",[220,371,373,375,378,381,384],{"class":222,"line":372},18,[220,374,358],{"class":226},[220,376,377],{"class":226}," ---",[220,379,380],{"class":226}," |",[220,382,383],{"class":226}," ---:",[220,385,386],{"class":226}," |\n",[220,388,390,392,395,397,400,403,405,407,410,412,414],{"class":222,"line":389},19,[220,391,358],{"class":226},[220,393,394],{"class":226}," [",[220,396,176],{"class":240},[220,398,399],{"class":226},"]",[220,401,402],{"class":302},"{.small .muted} ",[220,404,358],{"class":226},[220,406,394],{"class":226},[220,408,409],{"class":240},"`{{reference}}`",[220,411,399],{"class":226},[220,413,402],{"class":302},[220,415,369],{"class":226},[220,417,419],{"class":222,"line":418},20,[220,420,341],{"class":302},[197,422,423,424,428,429,432],{},"Top-level content is a stack of ",[425,426,427],"strong",{},"modules",": each block component is one, and each run of loose Markdown between components becomes an implicit ",[201,430,431],{},"letter",". The layout sets the spacing between modules, so a template never sets margins.",[434,435,437],"h2",{"id":436},"start-with-frontmatter","Start with frontmatter",[197,439,440,441,444,445,447,448,451],{},"Frontmatter is a YAML mapping between two ",[201,442,443],{},"---"," lines, and only counts when the first ",[201,446,443],{}," is the very first line of the file. The keys are described in ",[449,450,43],"a",{"href":44},".",[197,453,454,455,458,459,451],{},"A leading UTF-8 byte order mark is ignored and CRLF line endings are accepted everywhere. Invalid UTF-8 anywhere in the file is a parse error at its position (",[201,456,457],{},"invalid utf-8","), and a frontmatter block with no closing line is ",[201,460,461],{},"frontmatter: missing closing ---",[434,463,465],{"id":464},"open-a-block-component","Open a block component",[197,467,468],{},"A block component opens with a line of two or more colons and a name, optionally followed by attributes, and closes with a line of exactly the same number of colons:",[210,470,473],{"className":212,"code":471,"filename":472,"language":215,"meta":216,"style":216},"::stories\n:::story{eyebrow=\"Stays\" href=\"https:\u002F\u002Fexample.com\u002Fjournal\" tone=\"sea\"}\nFour guesthouses on the Nevis Peak trail\n:::\n::\n","templates\u002Fjournal.md",[201,474,475,480,485,490,495],{"__ignoreMap":216},[220,476,477],{"class":222,"line":223},[220,478,479],{"class":302},"::stories\n",[220,481,482],{"class":222,"line":230},[220,483,484],{"class":302},":::story{eyebrow=\"Stays\" href=\"https:\u002F\u002Fexample.com\u002Fjournal\" tone=\"sea\"}\n",[220,486,487],{"class":222,"line":244},[220,488,489],{"class":302},"Four guesthouses on the Nevis Peak trail\n",[220,491,492],{"class":222,"line":255},[220,493,494],{"class":302},":::\n",[220,496,497],{"class":222,"line":272},[220,498,341],{"class":302},[500,501,502,510,513,520,531,537,540],"ul",{},[503,504,505,506,509],"li",{},"The name matches ",[201,507,508],{},"[A-Za-z][A-Za-z0-9_-]*",". Module names and aliases are matched case-insensitively.",[503,511,512],{},"The opener line holds nothing but the colons, the name and the attributes (trailing whitespace is fine). Up to three leading spaces are allowed.",[503,514,515,516,519],{},"The closer is a line of ",[425,517,518],{},"exactly"," the opener's colon count. A line with a different count does not close it.",[503,521,522,523,526,527,530],{},"Nest a component inside another by giving it more colons (",[201,524,525],{},":::story"," inside ",[201,528,529],{},"::stories","). When two open components have the same count, the innermost one closes first.",[503,532,533,534,451],{},"A component can interrupt a paragraph, so you don't need a blank line before ",[201,535,536],{},"::name",[503,538,539],{},"A closer inside an open fenced code block is part of the code, and a component that is never closed ends at the end of the document.",[503,541,542,543,546],{},"Components nest at most 32 deep (",[201,544,545],{},"components nested deeper than 32",").",[197,548,549,550,553,554,557,558,561,562,451],{},"A top-level component that is not a module is ",[201,551,552],{},"unknown module \"stats\"",". The full list, with aliases such as ",[201,555,556],{},"k1"," for ",[201,559,560],{},"statement",", is in ",[449,563,48],{"href":49},[434,565,567],{"id":566},"pass-props","Pass props",[197,569,570,571,574],{},"Attributes on the opener are one way to give a module its settings. For longer values, put a ",[425,572,573],{},"props block"," at the start of the component instead. It has two forms, and both are read into the same set of keys as the attributes:",[576,577,578,618],"code-group",{},[210,579,582],{"className":212,"code":580,"filename":581,"language":215,"meta":216,"style":216},"::statement\n---\neyebrow: \"Weekly payout · {{period}}\"\ntone: orange\n---\n# Payout sent.\n::\n","Props block",[201,583,584,589,593,598,603,607,614],{"__ignoreMap":216},[220,585,586],{"class":222,"line":223},[220,587,588],{"class":302},"::statement\n",[220,590,591],{"class":222,"line":230},[220,592,227],{"class":226},[220,594,595],{"class":222,"line":244},[220,596,597],{"class":302},"eyebrow: \"Weekly payout · {{period}}\"\n",[220,599,600],{"class":222,"line":255},[220,601,602],{"class":302},"tone: orange\n",[220,604,605],{"class":222,"line":272},[220,606,227],{"class":226},[220,608,609,611],{"class":222,"line":287},[220,610,309],{"class":226},[220,612,613],{"class":312},"Payout sent.\n",[220,615,616],{"class":222,"line":292},[220,617,341],{"class":302},[210,619,622],{"className":212,"code":620,"filename":621,"language":215,"meta":216,"style":216},"::quote\n```yaml [props]\ncite: \"Dwayne Liburd · Brimstone Woodcraft\"\n```\n\"Every board leaves Old Road with the grain facing the sea.\"\n::\n","Props fence",[201,623,624,629,638,652,657,662],{"__ignoreMap":216},[220,625,626],{"class":222,"line":223},[220,627,628],{"class":302},"::quote\n",[220,630,631,634],{"class":222,"line":230},[220,632,633],{"class":240},"```",[220,635,637],{"class":636},"sJsPd","yaml [props]\n",[220,639,640,643,645,647,650],{"class":222,"line":244},[220,641,642],{"class":233},"cite",[220,644,237],{"class":226},[220,646,263],{"class":226},[220,648,649],{"class":240},"Dwayne Liburd · Brimstone Woodcraft",[220,651,269],{"class":226},[220,653,654],{"class":222,"line":255},[220,655,656],{"class":240},"```\n",[220,658,659],{"class":222,"line":272},[220,660,661],{"class":302},"\"Every board leaves Old Road with the grain facing the sea.\"\n",[220,663,664],{"class":222,"line":287},[220,665,341],{"class":302},[500,667,668,677,698,709],{},[503,669,670,671,673,674,451],{},"The ",[201,672,443],{}," form must be the first line after the opener; the fence form must be the component's first child, with the info string exactly ",[201,675,676],{},"yaml [props]",[503,678,679,680,683,684,687,688,690,691,694,695,451],{},"Props must be a YAML mapping. A YAML error is a parse error on its own line, prefixed ",[201,681,682],{},"props:"," (for example ",[201,685,686],{},"props: did not find expected ',' or ']'","). A ",[201,689,443],{}," block with no closing line is ",[201,692,693],{},"props: missing closing ---",", and using both forms is ",[201,696,697],{},"props: given twice",[503,699,700,701,704,705,708],{},"String props can hold merge tags, like attribute values. Integers (",[201,702,703],{},"height: 360",") and booleans (",[201,706,707],{},"headless: true",") are plain YAML.",[503,710,711,712,451],{},"A key given both as an attribute and as a prop is an error: ",[201,713,714],{},"statement: \"eyebrow\" set twice",[434,716,718],{"id":717},"write-attributes","Write attributes",[197,720,721,722,725],{},"An attribute list is ",[201,723,724],{},"{…}"," on one line:",[210,727,733],{"className":728,"code":730,"filename":731,"language":732,"meta":216},[729],"language-text","attrs = \"{\" ws* (item ws*)* \"}\"        ; \"{{\" never starts attributes\nitem  = \".\" name | \"#\" name | [\":\"] key [ \"=\" value ]\nname  = [A-Za-z_][A-Za-z0-9_:-]*\nvalue = '\"' … '\"' | \"'\" … \"'\" | bare\n","Grammar","text",[201,734,730],{"__ignoreMap":216},[736,737,738,754],"table",{},[739,740,741],"thead",{},[742,743,744,748,751],"tr",{},[745,746,747],"th",{},"Form",[745,749,750],{},"Example",[745,752,753],{},"Meaning",[755,756,757,776,803,818,839],"tbody",{},[742,758,759,765,770],{},[760,761,762],"td",{},[201,763,764],{},"key=value",[760,766,767],{},[201,768,769],{},"height=360",[760,771,772,773,451],{},"A bare value, up to the next space or ",[201,774,775],{},"}",[742,777,778,783,788],{},[760,779,780],{},[201,781,782],{},"key=\"value\"",[760,784,785],{},[201,786,787],{},"eyebrow=\"Order {{order_id}}\"",[760,789,790,791,794,795,798,799,802],{},"A quoted value. ",[201,792,793],{},"\\\""," (or ",[201,796,797],{},"\\'",") and ",[201,800,801],{},"\\\\"," are the only escapes.",[742,804,805,810,815],{},[760,806,807],{},[201,808,809],{},"key",[760,811,812],{},[201,813,814],{},"headless",[760,816,817],{},"A flag: a boolean that is on.",[742,819,820,825,830],{},[760,821,822],{},[201,823,824],{},":key=\"path\"",[760,826,827],{},[201,828,829],{},":order=\"order\"",[760,831,832,833,836,837,451],{},"A ",[425,834,835],{},"binding",": the value is a data path, not text. See ",[449,838,53],{"href":54},[742,840,841,850,855],{},[760,842,843,846,847],{},[201,844,845],{},".class",", ",[201,848,849],{},"#id",[760,851,852],{},[201,853,854],{},".muted",[760,856,857,858,862],{},"Classes are for ",[449,859,861],{"href":860},"\u002Fauthoring\u002Factions-and-spans#style-text-with-spans","spans",". Modules accept neither.",[197,864,865,866,868,869,846,872,846,875,846,878,451],{},"Every non-binding value is text, so it can hold merge tags. Attributes never span lines, and a list is at most 4096 bytes. A list whose closing ",[201,867,775],{}," is on the same line but which is invalid is a positioned parse error: ",[201,870,871],{},"duplicate attribute \"a\"",[201,873,874],{},"duplicate #id",[201,876,877],{},"binding :order needs a value",[201,879,880],{},"expected a value after =",[882,883,884,885,888,889,892,893,896],"warning",{},"An opener whose ",[201,886,887],{},"{"," never closes on its line, for example because of a missing closing quote in ",[201,890,891],{},"::statement{eyebrow=\"x}",", is not a component at all. The line becomes text, and the errors that follow point at the content instead, typically ",[201,894,895],{},"letter: h1 is not allowed here",". When a component seems to vanish, check the quotes on its opener.",[197,898,899,900,902,903,905,906,451],{},"A module reads only the attributes it knows. Anything else, including an ",[201,901,849],{}," or ",[201,904,845],{},", is ",[201,907,908],{},"\u003Cmodule>: unknown attribute \"x\"",[434,910,912],{"id":911},"leave-slots-alone","Leave slots alone",[197,914,915,916,919,920,923,924,927,928,931,932,935],{},"A line ",[201,917,918],{},"#name"," (no space after ",[201,921,922],{},"#",") directly inside a component opens a ",[425,925,926],{},"slot",". The parser supports slots, but the email compiler reserves them for later: every slot is the compile error ",[201,929,930],{},"slots are reserved",". ",[201,933,934],{},"# Heading",", with a space, stays a heading.",[434,937,939],{"id":938},"add-inline-components","Add inline components",[197,941,942,943,846,946,949,950,953],{},"Inline components sit inside a paragraph and come in three shapes: ",[201,944,945],{},":name[label]{attrs}",[201,947,948],{},":name[label]"," and ",[201,951,952],{},":name{attrs}",". The label is inline Markdown.",[197,955,956,957,959,960,902,963,965,966,846,969,949,972,975],{},"An inline component is recognised only when the character before the colon is the start of the line, whitespace, or punctuation other than ",[201,958,237],{},", and when the name is followed directly by ",[201,961,962],{},"[",[201,964,887],{},". So ",[201,967,968],{},"2:14 pm",[201,970,971],{},"Note:the",[201,973,974],{},"https:\u002F\u002Fexample.com"," are ordinary text.",[197,977,978,979,949,982,985,986,988,989,451],{},"The email compiler knows two inline components, ",[201,980,981],{},":button",[201,983,984],{},":link",", described in ",[449,987,58],{"href":59},". Any other name is ",[201,990,991],{},"unknown inline component \":note\"",[434,993,995],{"id":994},"style-text-with-spans","Style text with spans",[197,997,998,1001,1002,1004,1005,1007,1008,1011,1012,846,1015,846,1018,846,1021,949,1024,1027,1028,451],{},[201,999,1000],{},"[text]{.class …}"," is a span: a run of inline Markdown with a style. It is a span only when ",[201,1003,399],{}," is followed directly by ",[201,1006,887],{},"; otherwise ",[201,1009,1010],{},"[text]"," is handled by the normal link parser. The allowed classes are ",[201,1013,1014],{},"muted",[201,1016,1017],{},"teal",[201,1019,1020],{},"mono",[201,1022,1023],{},"small",[201,1025,1026],{},"bold"," — see ",[449,1029,58],{"href":860},[434,1031,1033],{"id":1032},"keep-attributes-off-other-elements","Keep attributes off other elements",[197,1035,1036,1037,1040,1041,1044,1045,1048],{},"Comark can attach ",[201,1038,1039],{},"{attrs}"," directly after a link, image, emphasis, strong or code span, but the email compiler accepts attributes ",[425,1042,1043],{},"only on spans and inline components",". Anything else is ",[201,1046,1047],{},"attributes are only allowed on spans and inline components"," (D21). Wrap the text in a span instead:",[576,1050,1051,1070],{},[210,1052,1055],{"className":212,"code":1053,"filename":1054,"language":215,"meta":216,"style":216},"`{{reference}}`{.small .muted}\n","Rejected",[201,1056,1057],{"__ignoreMap":216},[220,1058,1059,1062,1065,1067],{"class":222,"line":223},[220,1060,1061],{"class":226},"`",[220,1063,1064],{"class":240},"{{reference}}",[220,1066,1061],{"class":226},[220,1068,1069],{"class":302},"{.small .muted}\n",[210,1071,1074],{"className":212,"code":1072,"filename":1073,"language":215,"meta":216,"style":216},"[`{{reference}}`]{.small .muted}\n","Accepted",[201,1075,1076],{"__ignoreMap":216},[220,1077,1078,1080,1082,1084],{"class":222,"line":223},[220,1079,962],{"class":226},[220,1081,409],{"class":240},[220,1083,399],{"class":226},[220,1085,1069],{"class":302},[197,1087,1088,1089,1091,1092,1095,1096,1099],{},"An invalid ",[201,1090,724],{}," after one of these elements stays literal text, so prose such as ",[201,1093,1094],{},"*no*{today's the day}"," still parses. And ",[201,1097,1098],{},"{{x}}"," right after a link is a merge tag, never an attribute list.",[434,1101,1103],{"id":1102},"insert-merge-tags","Insert merge tags",[197,1105,1106,1107,902,1110,237],{},"A merge tag is ",[201,1108,1109],{},"{{path}}",[201,1111,1112],{},"{{path | fallback}}",[210,1114,1116],{"className":212,"code":1115,"filename":214,"language":215,"meta":216,"style":216},"Hi {{first_name | there}}, {{driver.first_name}} is on the way.\nYour code is {{code | \"not set\"}}.\nWrite \\{{name}} to show the braces.\n",[201,1117,1118,1123,1128],{"__ignoreMap":216},[220,1119,1120],{"class":222,"line":223},[220,1121,1122],{"class":302},"Hi {{first_name | there}}, {{driver.first_name}} is on the way.\n",[220,1124,1125],{"class":222,"line":230},[220,1126,1127],{"class":302},"Your code is {{code | \"not set\"}}.\n",[220,1129,1130],{"class":222,"line":244},[220,1131,1132],{"class":302},"Write \\{{name}} to show the braces.\n",[500,1134,1135,1142,1163,1166,1174],{},[503,1136,1137,1138,1141],{},"A path is dot-separated segments of ",[201,1139,1140],{},"[a-z_][a-z0-9_]*",": lower case, digits and underscores. Spaces around the path and the fallback are allowed.",[503,1143,1144,1145,1148,1149,846,1151,1153,1154,1157,1158,949,1160,1162],{},"The fallback is bare text, or quoted with ",[201,1146,1147],{},"\"…\""," when it contains ",[201,1150,358],{},[201,1152,775],{}," or leading spaces. A bare fallback may not contain ",[201,1155,1156],{},"{{",": the tag becomes malformed and the text after it is read as a new tag (D33). Use a quoted fallback for that. Inside a quoted fallback, ",[201,1159,793],{},[201,1161,801],{}," are escapes.",[503,1164,1165],{},"A tag never spans lines.",[503,1167,1168,1171,1172,451],{},[201,1169,1170],{},"\\{{"," is a literal ",[201,1173,1156],{},[503,1175,1176,1177,1179,1180,846,1183,1186,1187,1190,1191,451],{},"Anything that starts with ",[201,1178,1156],{}," but is not a valid tag (",[201,1181,1182],{},"{{ Name }}",[201,1184,1185],{},"{{name}",") stays literal text and is reported as the warning ",[201,1188,1189],{},"malformed merge tag \"{{ Name }}\"",". It does not fail the compile, so check warnings — see ",[449,1192,63],{"href":1193},"\u002Fauthoring\u002Fcompile-errors#read-warnings",[197,1195,1196,1197,1199,1200,1203],{},"Tags work in prose, headings, table cells, code spans (",[201,1198,409],{},"), link destinations (",[201,1201,1202],{},"[secure your account]({{security_url}})","), autolinks, attribute values, props and frontmatter strings. The tag parser runs before emphasis, so underscores in a path never start italics.",[197,1205,1206,1207,451],{},"Which names a path can use, the fallback rules and how URL values are escaped are in ",[449,1208,53],{"href":54},[434,1210,1212],{"id":1211},"build-tables","Build tables",[197,1214,1215,1216,846,1219,949,1222,1224,1225,1228,1229,1232],{},"GFM tables are allowed inside ",[201,1217,1218],{},"breakdown",[201,1220,1221],{},"compare",[201,1223,736],{},", one table per module. A table anywhere else is ",[201,1226,1227],{},"letter: table is not allowed here"," (with the module's name). Cells are inline Markdown: spans, strong, code spans and links all work, and column alignment (",[201,1230,1231],{},"---:",") carries through to the email.",[197,1234,1235,1236,1238,1239,237],{},"The table parser splits cells on every bare ",[201,1237,358],{},", including one inside a merge tag. In a cell, write the fallback separator as ",[201,1240,1241],{},"\\|",[210,1243,1246],{"className":212,"code":1244,"filename":1245,"language":215,"meta":216,"style":216},"::breakdown\n| Recipient | {{first_name \\| there}} |\n| --- | ---: |\n| Total | {{total}} |\n::\n","templates\u002Ffees.md",[201,1247,1248,1252,1266,1278,1291],{"__ignoreMap":216},[220,1249,1250],{"class":222,"line":223},[220,1251,352],{"class":302},[220,1253,1254,1256,1259,1261,1264],{"class":222,"line":230},[220,1255,358],{"class":226},[220,1257,1258],{"class":302}," Recipient ",[220,1260,358],{"class":226},[220,1262,1263],{"class":302}," {{first_name \\| there}} ",[220,1265,369],{"class":226},[220,1267,1268,1270,1272,1274,1276],{"class":222,"line":244},[220,1269,358],{"class":226},[220,1271,377],{"class":226},[220,1273,380],{"class":226},[220,1275,383],{"class":226},[220,1277,386],{"class":226},[220,1279,1280,1282,1285,1287,1289],{"class":222,"line":255},[220,1281,358],{"class":226},[220,1283,1284],{"class":302}," Total ",[220,1286,358],{"class":226},[220,1288,366],{"class":302},[220,1290,369],{"class":226},[220,1292,1293],{"class":222,"line":272},[220,1294,341],{"class":302},[197,1296,1297,1298,1300,1301,1304,1305,931,1308,1310],{},"In a body row, a bare ",[201,1299,358],{}," splits the tag across two cells: the email shows the broken text and the compiler warns ",[201,1302,1303],{},"malformed merge tag \"{{name\"",". In the header row it adds a column, so the delimiter row no longer matches and the table is not parsed at all: the module then reports ",[201,1306,1307],{},"breakdown: expected one table",[201,1309,1241],{}," is accepted as the separator everywhere, not only in tables.",[434,1312,1314],{"id":1313},"know-what-is-rejected","Know what is rejected",[197,1316,1317],{},"The parser reads all of CommonMark and GFM; the compiler turns down whatever has no place in an email. Each of these is a compile error at its position:",[736,1319,1320,1333],{},[739,1321,1322],{},[742,1323,1324,1327,1330],{},[745,1325,1326],{},"You wrote",[745,1328,1329],{},"Error",[745,1331,1332],{},"Use instead",[755,1334,1335,1348,1374,1389,1406,1423,1446],{},[742,1336,1337,1340,1345],{},[760,1338,1339],{},"Raw HTML, inline or block",[760,1341,1342],{},[201,1343,1344],{},"raw html is not allowed",[760,1346,1347],{},"Modules, spans and Markdown.",[742,1349,1350,1356,1361],{},[760,1351,1352,1355],{},[201,1353,1354],{},"![alt](src)"," in prose",[760,1357,1358],{},[201,1359,1360],{},"images are not allowed in prose; use ::image",[760,1362,1363,846,1366,1369,1370,1373],{},[201,1364,1365],{},"::image",[201,1367,1368],{},"::map"," or the ",[201,1371,1372],{},"image"," of a tile.",[742,1375,1376,1381,1386],{},[760,1377,1378],{},[201,1379,1380],{},"~~text~~",[760,1382,1383],{},[201,1384,1385],{},"strikethrough is not allowed",[760,1387,1388],{},"—",[742,1390,1391,1396,1401],{},[760,1392,1393],{},[201,1394,1395],{},"[text](url \"title\")",[760,1397,1398],{},[201,1399,1400],{},"link titles are not supported",[760,1402,1403],{},[201,1404,1405],{},"[text](url)",[742,1407,1408,1413,1418],{},[760,1409,1410,1412],{},[201,1411,443],{}," between modules",[760,1414,1415],{},[201,1416,1417],{},"use ::divider instead of ---",[760,1419,1420],{},[201,1421,1422],{},"::divider",[742,1424,1425,1428,1433],{},[760,1426,1427],{},"A blockquote, a code block, or a heading the module doesn't take",[760,1429,1430],{},[201,1431,1432],{},"letter: blockquote is not allowed here",[760,1434,1435,846,1438,1441,1442,1445],{},[201,1436,1437],{},"::quote",[201,1439,1440],{},"::code",", or a ",[201,1443,1444],{},"::statement"," heading.",[742,1447,1448,1451,1456],{},[760,1449,1450],{},"A list item with two paragraphs or a nested list",[760,1452,1453],{},[201,1454,1455],{},"letter: list items must be one paragraph",[760,1457,1458],{},"One paragraph per item.",[882,1460,1461,1462,1464,1465,1467,1468,1471,1472,1474,1475,1477],{},"A line of ",[201,1463,443],{}," directly under a line of text is a CommonMark setext heading, not a rule: the text becomes an ",[201,1466,434],{},", and in loose Markdown that is ",[201,1469,1470],{},"letter: h2 is not allowed here",". Leave a blank line before ",[201,1473,443],{}," if you meant frontmatter or props, and use ",[201,1476,1422],{}," for a rule.",[434,1479,1481],{"id":1480},"next-steps","Next steps",[500,1483,1484,1489,1494],{},[503,1485,1486,1488],{},[449,1487,43],{"href":44}," for the header keys.",[503,1490,1491,1493],{},[449,1492,48],{"href":49}," for every component and what it may contain.",[503,1495,1496,1498],{},[449,1497,63],{"href":64}," for reading what the compiler reports.",[1500,1501,1502],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .sJsPd, html code.shiki .sJsPd{--shiki-light:#90A4AE90;--shiki-default:#EEFFFF90;--shiki-dark:#BABED890}",{"title":216,"searchDepth":230,"depth":230,"links":1504},[1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516],{"id":436,"depth":230,"text":437},{"id":464,"depth":230,"text":465},{"id":566,"depth":230,"text":567},{"id":717,"depth":230,"text":718},{"id":911,"depth":230,"text":912},{"id":938,"depth":230,"text":939},{"id":994,"depth":230,"text":995},{"id":1032,"depth":230,"text":1033},{"id":1102,"depth":230,"text":1103},{"id":1211,"depth":230,"text":1212},{"id":1313,"depth":230,"text":1314},{"id":1480,"depth":230,"text":1481},"Markdown plus components, spans, attributes and merge tags — what the parser reads and what the email compiler accepts.","md",null,{},{"icon":41},{"title":38,"description":1517},"xZVOoc97DyYUw2FDmlfbd8EDWePk2EER8jXknI0ogfE",[1525,1527],{"title":26,"path":27,"stem":28,"description":1526,"icon":29,"children":-1},"Install the lttr agent skill so Claude Code, Cursor, and other coding agents write lttr templates and wiring correctly the first time.",{"title":43,"path":44,"stem":45,"description":1528,"icon":46,"children":-1},"The YAML header of a template — every key, its type, and which families accept it.",1790309826904]