[{"data":1,"prerenderedAt":1856},["ShallowReactive",2],{"post-criando-um-feed-rss-com-nuxt-content":3,"i-lucide:info":1829,"i-lucide:notebook-text":1834,"i-ri:instagram-line":1836,"i-ri:bluesky-line":1838,"i-ri:github-line":1840,"i-lucide:rss":1842,"i-lucide:circle-alert":1844,"i-lucide:copy":1846,"i-catppuccin:nuxt":1848,"i-catppuccin:vue":1850,"i-catppuccin:typescript":1852,"i-simple-icons:npm":1854},{"id":4,"title":5,"alternate":6,"body":7,"category":1814,"created_at":1815,"description":1816,"extension":1817,"language":1818,"meta":1819,"navigation":88,"ogImage":1820,"path":1821,"seo":1822,"stem":1823,"tags":1824,"updated_at":1827,"__hash__":1828},"blog\u002Fblog\u002F2026\u002F2026-06-17-criando-um-feed-rss-com-nuxt-content.md","Criando um feed RSS com Nuxt Content","generating-an-rss-feed-with-nuxt-content",{"type":8,"value":9,"toc":1806},"minimark",[10,14,19,31,38,47,50,220,228,234,253,256,427,439,442,602,608,631,634,652,660,664,674,688,744,748,767,779,845,848,852,859,866,881,895,901,1026,1036,1153,1158,1275,1285,1291,1309,1322,1331,1367,1389,1395,1516,1522,1548,1551,1615,1618,1621,1752,1755,1759,1785,1795,1799,1802],[11,12,13],"p",{},"Disponibilizar um feed RSS quando você está utilizando o Nuxt Content não é difícil, mas você pode acabar encontrando alguns obstáculos no caminho.",[15,16,18],"h2",{"id":17},"gerando-o-feed","Gerando o feed",[11,20,21,22,26,27,30],{},"Iremos começar criando a rota no servidor que irá disponibilizar o RSS. Normalmente é conveniente colocar o feed no mesmo caminho que seu conteúdo está. Por exemplo, se sua lista de posts fica em ",[23,24,25],"code",{},"\u002Fblog",", o caminho ",[23,28,29],{},"\u002Fblog\u002Ffeed.xml"," é uma boa escolha.",[11,32,33,34,37],{},"Usando o Nuxt, podemos criar essa rota ao criar o arquivo ",[23,35,36],{},"server\u002Froutes\u002Fblog\u002Ffeed.xml.get.ts",".",[39,40,41],"caution",{},[11,42,43,44,37],{},"Esta não é uma rota de API, então não deve ser colocada em ",[23,45,46],{},"\u002Fserver\u002Fapi",[11,48,49],{},"O esqueleto do arquivo é basicamente este:",[51,52,58],"pre",{"className":53,"code":54,"filename":55,"language":56,"meta":57,"style":57},"language-ts shiki shiki-themes github-light-default github-dark-default","import { queryCollection } from '@nuxt\u002Fcontent\u002Fserver';\n\nexport default defineEventHandler(async (event) => {\n  const posts = await queryCollection(event, 'blog')\n    .order('created_at', 'DESC')\n    .limit(10)\n    .all();\n\n  return posts;\n});\n","feed.xml.get.ts","ts","",[23,59,60,83,90,119,147,169,184,195,200,209],{"__ignoreMap":57},[61,62,65,69,73,76,80],"span",{"class":63,"line":64},"line",1,[61,66,68],{"class":67},"sjeE4","import",[61,70,72],{"class":71},"s4rv2"," { queryCollection } ",[61,74,75],{"class":67},"from",[61,77,79],{"class":78},"sSVrQ"," '@nuxt\u002Fcontent\u002Fserver'",[61,81,82],{"class":71},";\n",[61,84,86],{"class":63,"line":85},2,[61,87,89],{"emptyLinePlaceholder":88},true,"\n",[61,91,93,96,99,103,107,110,113,116],{"class":63,"line":92},3,[61,94,95],{"class":67},"export",[61,97,98],{"class":67}," default",[61,100,102],{"class":101},"sbjLL"," defineEventHandler",[61,104,106],{"class":105},"sTDnQ","(",[61,108,109],{"class":67},"async",[61,111,112],{"class":105}," (event) ",[61,114,115],{"class":67},"=>",[61,117,118],{"class":71}," {\n",[61,120,122,125,129,132,135,138,141,144],{"class":63,"line":121},4,[61,123,124],{"class":67},"  const",[61,126,128],{"class":127},"sHrmB"," posts",[61,130,131],{"class":67}," =",[61,133,134],{"class":67}," await",[61,136,137],{"class":101}," queryCollection",[61,139,140],{"class":71},"(event, ",[61,142,143],{"class":78},"'blog'",[61,145,146],{"class":71},")\n",[61,148,150,153,156,158,161,164,167],{"class":63,"line":149},5,[61,151,152],{"class":71},"    .",[61,154,155],{"class":101},"order",[61,157,106],{"class":71},[61,159,160],{"class":78},"'created_at'",[61,162,163],{"class":71},", ",[61,165,166],{"class":78},"'DESC'",[61,168,146],{"class":71},[61,170,172,174,177,179,182],{"class":63,"line":171},6,[61,173,152],{"class":71},[61,175,176],{"class":101},"limit",[61,178,106],{"class":71},[61,180,181],{"class":127},"10",[61,183,146],{"class":71},[61,185,187,189,192],{"class":63,"line":186},7,[61,188,152],{"class":71},[61,190,191],{"class":101},"all",[61,193,194],{"class":71},"();\n",[61,196,198],{"class":63,"line":197},8,[61,199,89],{"emptyLinePlaceholder":88},[61,201,203,206],{"class":63,"line":202},9,[61,204,205],{"class":67},"  return",[61,207,208],{"class":71}," posts;\n",[61,210,212,215,218],{"class":63,"line":211},10,[61,213,214],{"class":71},"}",[61,216,217],{"class":105},")",[61,219,82],{"class":71},[11,221,222,223,227],{},"O que queremos fazer é manipular as postagens tal que a rota na verdade retorne um feed RSS válido. Podemos usar o pacote ",[224,225],"npm-mention",{"pkg":226},"rss"," para nos ajudar, já que ele contém um construtor de RSS que facilita as coisas.",[11,229,230,231,37],{},"Nós iremos usar a classe ",[23,232,233],{},"RSS",[51,235,237],{"className":53,"code":236,"filename":55,"language":56,"meta":57,"style":57},"import RSS from 'rss';\n",[23,238,239],{"__ignoreMap":57},[61,240,241,243,246,248,251],{"class":63,"line":64},[61,242,68],{"class":67},[61,244,245],{"class":71}," RSS ",[61,247,75],{"class":67},[61,249,250],{"class":78}," 'rss'",[61,252,82],{"class":71},[11,254,255],{},"Para começar, precisamos criar o feed e colocar algumas informações básicas.",[51,257,259],{"className":53,"code":258,"filename":55,"language":56,"meta":57,"style":57},"const url = 'https:\u002F\u002Fexemplo.org';\n\nconst feed = new RSS({\n  title: 'Blog de exemplo',\n  description: 'Somente um blog.',\n  site_url: url,\n  feed_url: `${url}\u002Fblog\u002Ffeed.xml`,\n  language: 'pt-BR',\n  custom_elements: [\n    { icon: `${url}\u002Fimg\u002Fapple-touch-icon.png` },\n  ],\n  custom_namespaces: {\n    content: 'http:\u002F\u002Fpurl.org\u002Frss\u002F1.0\u002Fmodules\u002Fcontent\u002F',\n    dc: 'http:\u002F\u002Fpurl.org\u002Fdc\u002Felements\u002F1.1\u002F',\n    sy: 'http:\u002F\u002Fpurl.org\u002Frss\u002F1.0\u002Fmodules\u002Fsyndication\u002F',\n  },\n});\n",[23,260,261,276,280,298,309,319,324,340,350,355,370,376,382,393,404,415,421],{"__ignoreMap":57},[61,262,263,266,269,271,274],{"class":63,"line":64},[61,264,265],{"class":67},"const",[61,267,268],{"class":127}," url",[61,270,131],{"class":67},[61,272,273],{"class":78}," 'https:\u002F\u002Fexemplo.org'",[61,275,82],{"class":71},[61,277,278],{"class":63,"line":85},[61,279,89],{"emptyLinePlaceholder":88},[61,281,282,284,287,289,292,295],{"class":63,"line":92},[61,283,265],{"class":67},[61,285,286],{"class":127}," feed",[61,288,131],{"class":67},[61,290,291],{"class":67}," new",[61,293,294],{"class":101}," RSS",[61,296,297],{"class":71},"({\n",[61,299,300,303,306],{"class":63,"line":121},[61,301,302],{"class":71},"  title: ",[61,304,305],{"class":78},"'Blog de exemplo'",[61,307,308],{"class":71},",\n",[61,310,311,314,317],{"class":63,"line":149},[61,312,313],{"class":71},"  description: ",[61,315,316],{"class":78},"'Somente um blog.'",[61,318,308],{"class":71},[61,320,321],{"class":63,"line":171},[61,322,323],{"class":71},"  site_url: url,\n",[61,325,326,329,332,335,338],{"class":63,"line":186},[61,327,328],{"class":71},"  feed_url: ",[61,330,331],{"class":78},"`${",[61,333,334],{"class":71},"url",[61,336,337],{"class":78},"}\u002Fblog\u002Ffeed.xml`",[61,339,308],{"class":71},[61,341,342,345,348],{"class":63,"line":197},[61,343,344],{"class":71},"  language: ",[61,346,347],{"class":78},"'pt-BR'",[61,349,308],{"class":71},[61,351,352],{"class":63,"line":202},[61,353,354],{"class":71},"  custom_elements: [\n",[61,356,357,360,362,364,367],{"class":63,"line":211},[61,358,359],{"class":71},"    { icon: ",[61,361,331],{"class":78},[61,363,334],{"class":71},[61,365,366],{"class":78},"}\u002Fimg\u002Fapple-touch-icon.png`",[61,368,369],{"class":71}," },\n",[61,371,373],{"class":63,"line":372},11,[61,374,375],{"class":71},"  ],\n",[61,377,379],{"class":63,"line":378},12,[61,380,381],{"class":71},"  custom_namespaces: {\n",[61,383,385,388,391],{"class":63,"line":384},13,[61,386,387],{"class":71},"    content: ",[61,389,390],{"class":78},"'http:\u002F\u002Fpurl.org\u002Frss\u002F1.0\u002Fmodules\u002Fcontent\u002F'",[61,392,308],{"class":71},[61,394,396,399,402],{"class":63,"line":395},14,[61,397,398],{"class":71},"    dc: ",[61,400,401],{"class":78},"'http:\u002F\u002Fpurl.org\u002Fdc\u002Felements\u002F1.1\u002F'",[61,403,308],{"class":71},[61,405,407,410,413],{"class":63,"line":406},15,[61,408,409],{"class":71},"    sy: ",[61,411,412],{"class":78},"'http:\u002F\u002Fpurl.org\u002Frss\u002F1.0\u002Fmodules\u002Fsyndication\u002F'",[61,414,308],{"class":71},[61,416,418],{"class":63,"line":417},16,[61,419,420],{"class":71},"  },\n",[61,422,424],{"class":63,"line":423},17,[61,425,426],{"class":71},"});\n",[11,428,429,430,433,434,438],{},"Algumas das propriedades são bem diretas. Outras são só complementos, como a ",[23,431,432],{},"custom_namespaces",", que permite que o XML gerado tenha ",[435,436,437],"em",{},"tags"," extras que não estão na especificação do RSS.",[11,440,441],{},"Como nós temos uma lista de postagens, podemos iterar sobre ela e criar cada item do feed.",[51,443,445],{"className":53,"code":444,"filename":55,"language":56,"meta":57,"style":57},"for (const post of posts) {\n  feed.item({\n    title: post.title,\n    guid: `${url}\u002Fpost\u002F${post.path}`,\n    url: `${url}\u002Fpost\u002F${post.path}`,\n    description: post.description,\n    date: new Date(post.created_at),\n    categories: post.category ? [post.category] : undefined,\n    custom_elements: [\n      { 'dc:creator': { _cdata: 'Fulano de Tal' } },\n    ],\n  });\n}\n",[23,446,447,466,476,481,506,527,532,546,565,570,587,592,597],{"__ignoreMap":57},[61,448,449,452,455,457,460,463],{"class":63,"line":64},[61,450,451],{"class":67},"for",[61,453,454],{"class":71}," (",[61,456,265],{"class":67},[61,458,459],{"class":127}," post",[61,461,462],{"class":67}," of",[61,464,465],{"class":71}," posts) {\n",[61,467,468,471,474],{"class":63,"line":85},[61,469,470],{"class":71},"  feed.",[61,472,473],{"class":101},"item",[61,475,297],{"class":71},[61,477,478],{"class":63,"line":92},[61,479,480],{"class":71},"    title: post.title,\n",[61,482,483,486,488,490,493,496,498,501,504],{"class":63,"line":121},[61,484,485],{"class":71},"    guid: ",[61,487,331],{"class":78},[61,489,334],{"class":71},[61,491,492],{"class":78},"}\u002Fpost\u002F${",[61,494,495],{"class":71},"post",[61,497,37],{"class":78},[61,499,500],{"class":71},"path",[61,502,503],{"class":78},"}`",[61,505,308],{"class":71},[61,507,508,511,513,515,517,519,521,523,525],{"class":63,"line":149},[61,509,510],{"class":71},"    url: ",[61,512,331],{"class":78},[61,514,334],{"class":71},[61,516,492],{"class":78},[61,518,495],{"class":71},[61,520,37],{"class":78},[61,522,500],{"class":71},[61,524,503],{"class":78},[61,526,308],{"class":71},[61,528,529],{"class":63,"line":171},[61,530,531],{"class":71},"    description: post.description,\n",[61,533,534,537,540,543],{"class":63,"line":186},[61,535,536],{"class":71},"    date: ",[61,538,539],{"class":67},"new",[61,541,542],{"class":101}," Date",[61,544,545],{"class":71},"(post.created_at),\n",[61,547,548,551,554,557,560,563],{"class":63,"line":197},[61,549,550],{"class":71},"    categories: post.category ",[61,552,553],{"class":67},"?",[61,555,556],{"class":71}," [post.category] ",[61,558,559],{"class":67},":",[61,561,562],{"class":127}," undefined",[61,564,308],{"class":71},[61,566,567],{"class":63,"line":202},[61,568,569],{"class":71},"    custom_elements: [\n",[61,571,572,575,578,581,584],{"class":63,"line":211},[61,573,574],{"class":71},"      { ",[61,576,577],{"class":78},"'dc:creator'",[61,579,580],{"class":71},": { _cdata: ",[61,582,583],{"class":78},"'Fulano de Tal'",[61,585,586],{"class":71}," } },\n",[61,588,589],{"class":63,"line":372},[61,590,591],{"class":71},"    ],\n",[61,593,594],{"class":63,"line":378},[61,595,596],{"class":71},"  });\n",[61,598,599],{"class":63,"line":384},[61,600,601],{"class":71},"}\n",[11,603,604,605,37],{},"Agora que o feed está completo, podemos definir o cabeçalho ",[23,606,607],{},"Content-Type",[51,609,611],{"className":53,"code":610,"filename":55,"language":56,"meta":57,"style":57},"setResponseHeader(event, 'Content-Type', 'text\u002Fxml');\n",[23,612,613],{"__ignoreMap":57},[61,614,615,618,620,623,625,628],{"class":63,"line":64},[61,616,617],{"class":101},"setResponseHeader",[61,619,140],{"class":71},[61,621,622],{"class":78},"'Content-Type'",[61,624,163],{"class":71},[61,626,627],{"class":78},"'text\u002Fxml'",[61,629,630],{"class":71},");\n",[11,632,633],{},"Então nós podemos finalmente retornar o feed XML.",[51,635,637],{"className":53,"code":636,"filename":55,"language":56,"meta":57,"style":57},"return feed.xml();\n",[23,638,639],{"__ignoreMap":57},[61,640,641,644,647,650],{"class":63,"line":64},[61,642,643],{"class":67},"return",[61,645,646],{"class":71}," feed.",[61,648,649],{"class":101},"xml",[61,651,194],{"class":71},[11,653,654,655,37],{},"Como exemplo, você pode dar uma olhada no ",[656,657,659],"a",{"href":29,"target":658},"_blank","RSS deste site",[15,661,663],{"id":662},"pré-renderizando","Pré-renderizando",[11,665,666,667,670,671,673],{},"Se seu site usa um ",[435,668,669],{},"deploy"," com um servidor, já está tudo certo. Mas, se usa um ",[435,672,669],{}," como site estático, como o GitHub Pages, você precisa de uma etapa adicional.",[11,675,676,677,680,681,684,685,37],{},"Precisamos informar ao Nuxt para também pré-renderizar esta rota do servidor durante o ",[435,678,679],{},"build",". Isso pode ser feito editando a propriedade ",[23,682,683],{},"nitro"," no arquivo ",[23,686,687],{},"nuxt.config.ts",[51,689,691],{"className":53,"code":690,"filename":687,"language":56,"meta":57,"style":57},"export default defineNuxtConfig({\n  nitro: {\n    prerender: {\n      routes: ['\u002Fblog\u002Ffeed.xml'],\n    },\n  },\n});\n",[23,692,693,704,709,714,725,730,737],{"__ignoreMap":57},[61,694,695,697,699,702],{"class":63,"line":64},[61,696,95],{"class":67},[61,698,98],{"class":67},[61,700,701],{"class":101}," defineNuxtConfig",[61,703,297],{"class":105},[61,705,706],{"class":63,"line":85},[61,707,708],{"class":71},"  nitro: {\n",[61,710,711],{"class":63,"line":92},[61,712,713],{"class":71},"    prerender: {\n",[61,715,716,719,722],{"class":63,"line":121},[61,717,718],{"class":71},"      routes: [",[61,720,721],{"class":78},"'\u002Fblog\u002Ffeed.xml'",[61,723,724],{"class":71},"],\n",[61,726,727],{"class":63,"line":149},[61,728,729],{"class":71},"    },\n",[61,731,732,735],{"class":63,"line":171},[61,733,734],{"class":71},"  }",[61,736,308],{"class":105},[61,738,739,742],{"class":63,"line":186},[61,740,741],{"class":105},"})",[61,743,82],{"class":71},[15,745,747],{"id":746},"informando-leitores-de-rss-sobre-o-feed","Informando leitores de RSS sobre o feed",[11,749,750,751,754,755,758,759,762,763,766],{},"Você pode por um ",[435,752,753],{},"link"," para o feed RSS na sua página, mas isso só vai funcionar se o usuário copiar e colar manualmente no seu leitor de RSS. Você pode deixar as coisas um pouco mais fáceis ao usar uma ",[435,756,757],{},"tag"," ",[23,760,761],{},"\u003Clink rel=\"alternate\">"," no ",[23,764,765],{},"\u003Chead>"," do seu HTML.",[11,768,769,770,772,773,758,776,37],{},"Com isso, se o usuário colar o URL de seu blog no leitor RSS, ele poderá obter o ",[435,771,753],{}," do RSS automaticamente. No Nuxt, isso pode ser feito com o ",[435,774,775],{},"composable",[23,777,778],{},"useHead",[51,780,783],{"className":53,"code":781,"filename":782,"language":56,"meta":57,"style":57},"useHead({\n  link: [{ \n    rel: 'alternate', \n    type: 'application\u002Frss+xml', \n    title: 'Feed (RSS)', \n    href: '\u002Fblog\u002Ffeed.xml',\n  }],\n});\n","blog.vue",[23,784,785,791,796,807,817,827,836,841],{"__ignoreMap":57},[61,786,787,789],{"class":63,"line":64},[61,788,778],{"class":101},[61,790,297],{"class":71},[61,792,793],{"class":63,"line":85},[61,794,795],{"class":71},"  link: [{ \n",[61,797,798,801,804],{"class":63,"line":92},[61,799,800],{"class":71},"    rel: ",[61,802,803],{"class":78},"'alternate'",[61,805,806],{"class":71},", \n",[61,808,809,812,815],{"class":63,"line":121},[61,810,811],{"class":71},"    type: ",[61,813,814],{"class":78},"'application\u002Frss+xml'",[61,816,806],{"class":71},[61,818,819,822,825],{"class":63,"line":149},[61,820,821],{"class":71},"    title: ",[61,823,824],{"class":78},"'Feed (RSS)'",[61,826,806],{"class":71},[61,828,829,832,834],{"class":63,"line":171},[61,830,831],{"class":71},"    href: ",[61,833,721],{"class":78},[61,835,308],{"class":71},[61,837,838],{"class":63,"line":186},[61,839,840],{"class":71},"  }],\n",[61,842,843],{"class":63,"line":197},[61,844,426],{"class":71},[11,846,847],{},"Isso não é obrigatório, mas é considerado uma boa prática.",[15,849,851],{"id":850},"disponibilizando-o-html-da-postagem","Disponibilizando o HTML da postagem",[11,853,854,855,858],{},"O feed atual irá funcionar corretamente para todos os usuários, mas nós estamos somente disponibilizando os ",[435,856,857],{},"links",": não há conteúdo para as postagens. A maioria dos sites faz somente isso, mas acredito que é uma boa pedida também disponibilizar o conteúdo completo da postagem, assim o usuário pode ler em seu ambiente preferido.",[11,860,861,862,37],{},"Esta é a parte mais difícil de ser feita com Nuxt Content. No momento que escrevo este artigo, o Nuxt Content não parece ter um método que retorna sua postagem renderizada em HTML no contexto do servidor. Precisamos fazer isso ",[863,864,865],"strong",{},"manualmente",[11,867,868,869,872,873,876,877,880],{},"O Nuxt Content usa o ",[224,870],{"pkg":871},"@nuxtjs\u002Fmdc"," por baixo dos panos, que por sua vez usa os projetos ",[224,874],{"pkg":875},"remark"," e o ",[224,878],{"pkg":879},"rehype"," do ecossistema do Unified.",[11,882,883,884,887,888,890,891,894],{},"Se você der uma olhada na propriedade ",[23,885,886],{},"post.body",", pode notar que é uma Árvore Sintática Abstrata (ASA) do Minimark. Poderíamos usar o pacote ",[224,889],{"pkg":8}," para obter a ",[435,892,893],{},"string"," do Markdown, mas eu encontrei alguns problemas de conversão quando tentei. É mais fácil obter o código-fonte do arquivo Markdown diretamente.",[11,896,897,898,37],{},"Para deixar as coisas reutilizáveis, iremos criar uma função utilitária no servidor chamada ",[23,899,900],{},"markdownToHtml",[51,902,905],{"className":53,"code":903,"filename":904,"language":56,"meta":57,"style":57},"import { readFile } from 'node:fs\u002Fpromises';\nimport { join } from 'node:path';\n\nexport async function markdownToHtml(fileName: string) {\n  const filePath = join(process.cwd(), 'content', `${fileName}.md`);\n  const markdown = await readFile(filePath, 'utf-8');\n}\n","utils\u002Fmarkdown.ts",[23,906,907,921,935,939,965,1000,1022],{"__ignoreMap":57},[61,908,909,911,914,916,919],{"class":63,"line":64},[61,910,68],{"class":67},[61,912,913],{"class":71}," { readFile } ",[61,915,75],{"class":67},[61,917,918],{"class":78}," 'node:fs\u002Fpromises'",[61,920,82],{"class":71},[61,922,923,925,928,930,933],{"class":63,"line":85},[61,924,68],{"class":67},[61,926,927],{"class":71}," { join } ",[61,929,75],{"class":67},[61,931,932],{"class":78}," 'node:path'",[61,934,82],{"class":71},[61,936,937],{"class":63,"line":92},[61,938,89],{"emptyLinePlaceholder":88},[61,940,941,943,946,949,952,954,957,959,962],{"class":63,"line":121},[61,942,95],{"class":67},[61,944,945],{"class":67}," async",[61,947,948],{"class":67}," function",[61,950,951],{"class":101}," markdownToHtml",[61,953,106],{"class":71},[61,955,956],{"class":105},"fileName",[61,958,559],{"class":67},[61,960,961],{"class":127}," string",[61,963,964],{"class":71},") {\n",[61,966,967,969,972,974,977,980,983,986,989,991,993,995,998],{"class":63,"line":149},[61,968,124],{"class":67},[61,970,971],{"class":127}," filePath",[61,973,131],{"class":67},[61,975,976],{"class":101}," join",[61,978,979],{"class":71},"(process.",[61,981,982],{"class":101},"cwd",[61,984,985],{"class":71},"(), ",[61,987,988],{"class":78},"'content'",[61,990,163],{"class":71},[61,992,331],{"class":78},[61,994,956],{"class":71},[61,996,997],{"class":78},"}.md`",[61,999,630],{"class":71},[61,1001,1002,1004,1007,1009,1011,1014,1017,1020],{"class":63,"line":171},[61,1003,124],{"class":67},[61,1005,1006],{"class":127}," markdown",[61,1008,131],{"class":67},[61,1010,134],{"class":67},[61,1012,1013],{"class":101}," readFile",[61,1015,1016],{"class":71},"(filePath, ",[61,1018,1019],{"class":78},"'utf-8'",[61,1021,630],{"class":71},[61,1023,1024],{"class":63,"line":186},[61,1025,601],{"class":71},[11,1027,1028,1029,1032,1033,37],{},"A parte difícil é criar o ",[435,1030,1031],{},"pipeline"," da biblioteca Unified de tal modo que ele faça uma conversão similar a que o Nuxt Content faz. Podemos começar importando os ",[435,1034,1035],{},"plugins",[51,1037,1039],{"className":53,"code":1038,"filename":904,"language":56,"meta":57,"style":57},"import rehypeSlug from 'rehype-slug';\nimport rehypeStringify from 'rehype-stringify';\nimport remarkFrontmatter from 'remark-frontmatter';\nimport remarkGfm from 'remark-gfm';\nimport remarkMdc from 'remark-mdc';\nimport remarkParse from 'remark-parse';\nimport remarkRehype from 'remark-rehype';\nimport { unified } from 'unified';\n",[23,1040,1041,1055,1069,1083,1097,1111,1125,1139],{"__ignoreMap":57},[61,1042,1043,1045,1048,1050,1053],{"class":63,"line":64},[61,1044,68],{"class":67},[61,1046,1047],{"class":71}," rehypeSlug ",[61,1049,75],{"class":67},[61,1051,1052],{"class":78}," 'rehype-slug'",[61,1054,82],{"class":71},[61,1056,1057,1059,1062,1064,1067],{"class":63,"line":85},[61,1058,68],{"class":67},[61,1060,1061],{"class":71}," rehypeStringify ",[61,1063,75],{"class":67},[61,1065,1066],{"class":78}," 'rehype-stringify'",[61,1068,82],{"class":71},[61,1070,1071,1073,1076,1078,1081],{"class":63,"line":92},[61,1072,68],{"class":67},[61,1074,1075],{"class":71}," remarkFrontmatter ",[61,1077,75],{"class":67},[61,1079,1080],{"class":78}," 'remark-frontmatter'",[61,1082,82],{"class":71},[61,1084,1085,1087,1090,1092,1095],{"class":63,"line":121},[61,1086,68],{"class":67},[61,1088,1089],{"class":71}," remarkGfm ",[61,1091,75],{"class":67},[61,1093,1094],{"class":78}," 'remark-gfm'",[61,1096,82],{"class":71},[61,1098,1099,1101,1104,1106,1109],{"class":63,"line":149},[61,1100,68],{"class":67},[61,1102,1103],{"class":71}," remarkMdc ",[61,1105,75],{"class":67},[61,1107,1108],{"class":78}," 'remark-mdc'",[61,1110,82],{"class":71},[61,1112,1113,1115,1118,1120,1123],{"class":63,"line":171},[61,1114,68],{"class":67},[61,1116,1117],{"class":71}," remarkParse ",[61,1119,75],{"class":67},[61,1121,1122],{"class":78}," 'remark-parse'",[61,1124,82],{"class":71},[61,1126,1127,1129,1132,1134,1137],{"class":63,"line":186},[61,1128,68],{"class":67},[61,1130,1131],{"class":71}," remarkRehype ",[61,1133,75],{"class":67},[61,1135,1136],{"class":78}," 'remark-rehype'",[61,1138,82],{"class":71},[61,1140,1141,1143,1146,1148,1151],{"class":63,"line":197},[61,1142,68],{"class":67},[61,1144,1145],{"class":71}," { unified } ",[61,1147,75],{"class":67},[61,1149,1150],{"class":78}," 'unified'",[61,1152,82],{"class":71},[11,1154,1155,1156,37],{},"E então criando o ",[435,1157,1031],{},[51,1159,1161],{"className":53,"code":1160,"filename":904,"language":56,"meta":57,"style":57},"const result = await unified()\n  .use(remarkParse)\n  .use(remarkFrontmatter, ['yaml'])\n  .use(remarkGfm)\n  .use(remarkMdc)\n  .use(remarkRehype)\n  .use(rehypeSlug)\n  .use(rehypeStringify)\n  .process(markdown);\n\nreturn String(result);\n",[23,1162,1163,1180,1191,1206,1215,1224,1233,1242,1251,1261,1265],{"__ignoreMap":57},[61,1164,1165,1167,1170,1172,1174,1177],{"class":63,"line":64},[61,1166,265],{"class":67},[61,1168,1169],{"class":127}," result",[61,1171,131],{"class":67},[61,1173,134],{"class":67},[61,1175,1176],{"class":101}," unified",[61,1178,1179],{"class":71},"()\n",[61,1181,1182,1185,1188],{"class":63,"line":85},[61,1183,1184],{"class":71},"  .",[61,1186,1187],{"class":101},"use",[61,1189,1190],{"class":71},"(remarkParse)\n",[61,1192,1193,1195,1197,1200,1203],{"class":63,"line":92},[61,1194,1184],{"class":71},[61,1196,1187],{"class":101},[61,1198,1199],{"class":71},"(remarkFrontmatter, [",[61,1201,1202],{"class":78},"'yaml'",[61,1204,1205],{"class":71},"])\n",[61,1207,1208,1210,1212],{"class":63,"line":121},[61,1209,1184],{"class":71},[61,1211,1187],{"class":101},[61,1213,1214],{"class":71},"(remarkGfm)\n",[61,1216,1217,1219,1221],{"class":63,"line":149},[61,1218,1184],{"class":71},[61,1220,1187],{"class":101},[61,1222,1223],{"class":71},"(remarkMdc)\n",[61,1225,1226,1228,1230],{"class":63,"line":171},[61,1227,1184],{"class":71},[61,1229,1187],{"class":101},[61,1231,1232],{"class":71},"(remarkRehype)\n",[61,1234,1235,1237,1239],{"class":63,"line":186},[61,1236,1184],{"class":71},[61,1238,1187],{"class":101},[61,1240,1241],{"class":71},"(rehypeSlug)\n",[61,1243,1244,1246,1248],{"class":63,"line":197},[61,1245,1184],{"class":71},[61,1247,1187],{"class":101},[61,1249,1250],{"class":71},"(rehypeStringify)\n",[61,1252,1253,1255,1258],{"class":63,"line":202},[61,1254,1184],{"class":71},[61,1256,1257],{"class":101},"process",[61,1259,1260],{"class":71},"(markdown);\n",[61,1262,1263],{"class":63,"line":211},[61,1264,89],{"emptyLinePlaceholder":88},[61,1266,1267,1269,1272],{"class":63,"line":372},[61,1268,643],{"class":67},[61,1270,1271],{"class":101}," String",[61,1273,1274],{"class":71},"(result);\n",[11,1276,1277,1278,1281,1282,1284],{},"Isso irá fazer o ",[435,1279,1280],{},"parse"," do Markdown, criar uma ASA, que então irá ser convertida para HAST e processada até que seja reduzida a uma ",[435,1283,893],{}," final com o HTML.",[11,1286,1287,1288,1290],{},"Para a maioria dos casos, isso irá funcionar, mas o MDC suporta componentes Vue, o que é um problema neste caso. A abordagem que eu escolhi foi converter os componentes que eu uso em componentes simples e equivalentes que usam apenas ",[435,1289,437],{}," já existentes do HTML.",[11,1292,1293,1294,1296,1297,1300,1301,1304,1305,1308],{},"Se você tem algum componente no seu Markdown, o ",[435,1295,1031],{}," existente irá colocá-lo no HTML como se ele fosse um elemento personalizado. Por exemplo, o ",[23,1298,1299],{},"Note.vue",", chamado por ",[23,1302,1303],{},"::note"," no Markdown, irá ser transformado em ",[23,1306,1307],{},"\u003Cnote>\u003C\u002Fnote>",", que não é um elemento existente do HTML.",[11,1310,1311,1312,758,1315,1318,1319,37],{},"Podemos contornar isso usando o ",[435,1313,1314],{},"plugin",[224,1316],{"pkg":1317},"rehype-components",". Também iremos precisar instalar o pacote ",[224,1320],{"pkg":1321},"hastscript",[11,1323,1324,1325,1327,1328,1330],{},"O que esse ",[435,1326,1314],{}," faz é converter elementos personalizados em outros que você especifica. Podemos colocar ele no ",[435,1329,1031],{}," com o seguinte código.",[51,1332,1334],{"className":53,"code":1333,"filename":904,"language":56,"meta":57,"style":57},".use(rehypeComponents, {\n  components: {\n    'note': Note,\n  },\n})\n",[23,1335,1336,1345,1350,1358,1362],{"__ignoreMap":57},[61,1337,1338,1340,1342],{"class":63,"line":64},[61,1339,37],{"class":71},[61,1341,1187],{"class":101},[61,1343,1344],{"class":71},"(rehypeComponents, {\n",[61,1346,1347],{"class":63,"line":85},[61,1348,1349],{"class":71},"  components: {\n",[61,1351,1352,1355],{"class":63,"line":92},[61,1353,1354],{"class":78},"    'note'",[61,1356,1357],{"class":71},": Note,\n",[61,1359,1360],{"class":63,"line":121},[61,1361,420],{"class":71},[61,1363,1364],{"class":63,"line":149},[61,1365,1366],{"class":71},"})\n",[11,1368,1369,1370,1373,1374,1376,1377,1380,1381,1384,1385,1388],{},"E então criamos um componente ",[23,1371,1372],{},"Note"," para a substituição. Neste caso, o elemento ",[23,1375,1372],{}," é originalmente um ",[435,1378,1379],{},"callout",". A abordagem que eu escolhi foi transformá-lo numa ",[23,1382,1383],{},"\u003Cdiv>"," com ",[23,1386,1387],{},"\u003Cp>\u003Cstrong>Nota:\u003C\u002Fstrong>\u003C\u002Fp>"," no seu primeiro filho.",[11,1390,1391,1392,1394],{},"O componente ",[23,1393,1372],{}," pode ser definido como:",[51,1396,1398],{"className":53,"code":1397,"filename":904,"language":56,"meta":57,"style":57},"import { h } from 'hastscript';\nimport type { ComponentFunction } from 'rehype-components';\n\nconst Note: ComponentFunction = (_, children) => h('div', [\n  h('p', h('strong', 'Nota:')),\n  ...children,\n]);\n",[23,1399,1400,1414,1431,1435,1475,1503,1511],{"__ignoreMap":57},[61,1401,1402,1404,1407,1409,1412],{"class":63,"line":64},[61,1403,68],{"class":67},[61,1405,1406],{"class":71}," { h } ",[61,1408,75],{"class":67},[61,1410,1411],{"class":78}," 'hastscript'",[61,1413,82],{"class":71},[61,1415,1416,1418,1421,1424,1426,1429],{"class":63,"line":85},[61,1417,68],{"class":67},[61,1419,1420],{"class":67}," type",[61,1422,1423],{"class":71}," { ComponentFunction } ",[61,1425,75],{"class":67},[61,1427,1428],{"class":78}," 'rehype-components'",[61,1430,82],{"class":71},[61,1432,1433],{"class":63,"line":92},[61,1434,89],{"emptyLinePlaceholder":88},[61,1436,1437,1439,1442,1444,1447,1449,1451,1454,1456,1459,1462,1464,1467,1469,1472],{"class":63,"line":121},[61,1438,265],{"class":67},[61,1440,1441],{"class":101}," Note",[61,1443,559],{"class":67},[61,1445,1446],{"class":105}," ComponentFunction",[61,1448,131],{"class":67},[61,1450,454],{"class":71},[61,1452,1453],{"class":105},"_",[61,1455,163],{"class":71},[61,1457,1458],{"class":105},"children",[61,1460,1461],{"class":71},") ",[61,1463,115],{"class":67},[61,1465,1466],{"class":101}," h",[61,1468,106],{"class":71},[61,1470,1471],{"class":78},"'div'",[61,1473,1474],{"class":71},", [\n",[61,1476,1477,1480,1482,1485,1487,1490,1492,1495,1497,1500],{"class":63,"line":149},[61,1478,1479],{"class":101},"  h",[61,1481,106],{"class":71},[61,1483,1484],{"class":78},"'p'",[61,1486,163],{"class":71},[61,1488,1489],{"class":101},"h",[61,1491,106],{"class":71},[61,1493,1494],{"class":78},"'strong'",[61,1496,163],{"class":71},[61,1498,1499],{"class":78},"'Nota:'",[61,1501,1502],{"class":71},")),\n",[61,1504,1505,1508],{"class":63,"line":171},[61,1506,1507],{"class":67},"  ...",[61,1509,1510],{"class":71},"children,\n",[61,1512,1513],{"class":63,"line":186},[61,1514,1515],{"class":71},"]);\n",[11,1517,1518,1519,1521],{},"Neste exemplo, o seguinte bloco ",[23,1520,1372],{}," no Markdown",[51,1523,1527],{"className":1524,"code":1525,"language":1526,"meta":57,"style":57},"language-mdc shiki shiki-themes github-light-default github-dark-default","::note\nEsta é uma nota\n::\n","mdc",[23,1528,1529,1538,1543],{"__ignoreMap":57},[61,1530,1531,1534],{"class":63,"line":64},[61,1532,1533],{"class":71},"::",[61,1535,1537],{"class":1536},"sjgCt","note\n",[61,1539,1540],{"class":63,"line":85},[61,1541,1542],{"class":71},"Esta é uma nota\n",[61,1544,1545],{"class":63,"line":92},[61,1546,1547],{"class":71},"::\n",[11,1549,1550],{},"Será transformada no seguinte HTML:",[51,1552,1556],{"className":1553,"code":1554,"language":1555,"meta":57,"style":57},"language-html shiki shiki-themes github-light-default github-dark-default","\u003Cdiv>\n  \u003Cp>\u003Cstrong>Nota:\u003C\u002Fstrong>\u003C\u002Fp>\n  \u003Cp>Esta é uma nota\u003C\u002Fp>\n\u003C\u002Fdiv>\n","html",[23,1557,1558,1569,1593,1606],{"__ignoreMap":57},[61,1559,1560,1563,1566],{"class":63,"line":64},[61,1561,1562],{"class":71},"\u003C",[61,1564,1565],{"class":1536},"div",[61,1567,1568],{"class":71},">\n",[61,1570,1571,1574,1576,1579,1581,1584,1586,1589,1591],{"class":63,"line":85},[61,1572,1573],{"class":71},"  \u003C",[61,1575,11],{"class":1536},[61,1577,1578],{"class":71},">\u003C",[61,1580,863],{"class":1536},[61,1582,1583],{"class":71},">Nota:\u003C\u002F",[61,1585,863],{"class":1536},[61,1587,1588],{"class":71},">\u003C\u002F",[61,1590,11],{"class":1536},[61,1592,1568],{"class":71},[61,1594,1595,1597,1599,1602,1604],{"class":63,"line":92},[61,1596,1573],{"class":71},[61,1598,11],{"class":1536},[61,1600,1601],{"class":71},">Esta é uma nota\u003C\u002F",[61,1603,11],{"class":1536},[61,1605,1568],{"class":71},[61,1607,1608,1611,1613],{"class":63,"line":121},[61,1609,1610],{"class":71},"\u003C\u002F",[61,1612,1565],{"class":1536},[61,1614,1568],{"class":71},[11,1616,1617],{},"Como você deve ter imaginado, você irá precisar fazer isso para cada componente Vue que você usa nos seus arquivos Markdown.",[11,1619,1620],{},"Com a função completada, podemos colocar o resultado em cada item do feed:",[51,1622,1625],{"className":1623,"code":1624,"filename":55,"language":56,"meta":57,"style":57},"language-ts shiki shiki-themes github-light-default github-dark-default has-diff","feed.item({\n  title: post.title,\n  guid: `${url}\u002Fpost\u002F${slug}`,\n  url: `${url}\u002Fpost\u002F${slug}`,\n  description: post.description,\n  date: new Date(post.created_at),\n  categories: post.category ? [post.category] : undefined,\n  custom_elements: [\n    { 'dc:creator': { _cdata: 'Fulano de Tal' } },\n    { 'content:encoded': { _cdata: await markdownToHtml(post.path) } }, \u002F\u002F [!CODE ++]\n  ],\n});\n",[23,1626,1627,1636,1641,1659,1676,1681,1692,1707,1711,1724,1744,1748],{"__ignoreMap":57},[61,1628,1629,1632,1634],{"class":63,"line":64},[61,1630,1631],{"class":71},"feed.",[61,1633,473],{"class":101},[61,1635,297],{"class":71},[61,1637,1638],{"class":63,"line":85},[61,1639,1640],{"class":71},"  title: post.title,\n",[61,1642,1643,1646,1648,1650,1652,1655,1657],{"class":63,"line":92},[61,1644,1645],{"class":71},"  guid: ",[61,1647,331],{"class":78},[61,1649,334],{"class":71},[61,1651,492],{"class":78},[61,1653,1654],{"class":71},"slug",[61,1656,503],{"class":78},[61,1658,308],{"class":71},[61,1660,1661,1664,1666,1668,1670,1672,1674],{"class":63,"line":121},[61,1662,1663],{"class":71},"  url: ",[61,1665,331],{"class":78},[61,1667,334],{"class":71},[61,1669,492],{"class":78},[61,1671,1654],{"class":71},[61,1673,503],{"class":78},[61,1675,308],{"class":71},[61,1677,1678],{"class":63,"line":149},[61,1679,1680],{"class":71},"  description: post.description,\n",[61,1682,1683,1686,1688,1690],{"class":63,"line":171},[61,1684,1685],{"class":71},"  date: ",[61,1687,539],{"class":67},[61,1689,542],{"class":101},[61,1691,545],{"class":71},[61,1693,1694,1697,1699,1701,1703,1705],{"class":63,"line":186},[61,1695,1696],{"class":71},"  categories: post.category ",[61,1698,553],{"class":67},[61,1700,556],{"class":71},[61,1702,559],{"class":67},[61,1704,562],{"class":127},[61,1706,308],{"class":71},[61,1708,1709],{"class":63,"line":197},[61,1710,354],{"class":71},[61,1712,1713,1716,1718,1720,1722],{"class":63,"line":202},[61,1714,1715],{"class":71},"    { ",[61,1717,577],{"class":78},[61,1719,580],{"class":71},[61,1721,583],{"class":78},[61,1723,586],{"class":71},[61,1725,1729,1731,1734,1736,1739,1741],{"class":1726,"line":211},[63,1727,1728],"diff","add",[61,1730,1715],{"class":71},[61,1732,1733],{"class":78},"'content:encoded'",[61,1735,580],{"class":71},[61,1737,1738],{"class":67},"await",[61,1740,951],{"class":101},[61,1742,1743],{"class":71},"(post.path) } }, ",[61,1745,1746],{"class":63,"line":372},[61,1747,375],{"class":71},[61,1749,1750],{"class":63,"line":378},[61,1751,426],{"class":71},[11,1753,1754],{},"Agora o feed RSS está completo com o conteúdo de suas postagens também.",[15,1756,1758],{"id":1757},"outra-abordagem-que-eu-considerei","Outra abordagem que eu considerei",[11,1760,1761,1762,1765,1766,1768,1769,1772,1773,1775,1776,1778,1779,1781,1782,1784],{},"Uma idéia alternativa que eu tive para resolver este problema foi usar um dos ",[435,1763,1764],{},"hooks"," do Nuxt após o ",[435,1767,679],{},". Você pode escrever um ",[435,1770,1771],{},"script"," personalizado que faça o ",[435,1774,1280],{}," do HTML gerado para ",[23,1777,25],{}," para pegar os ",[435,1780,857],{},", e então fazer o ",[435,1783,1280],{}," de cada arquivo de postagem gerado para extrair a parte do texto.",[11,1786,1787,1788,1790,1791,1794],{},"Isso vai funcionar, mas dependendo dos seus elementos personalizados, você pode acabar obtendo um HTML sujo quando comparado ao fazer o ",[435,1789,1280],{}," do Markdown. Por exemplo, alguns dos blocos ",[23,1792,1793],{},"\u003Cpre>"," que eu uso aqui são customizados para incluir uma janela bonitinha ao redor com o nome do arquivo e também um botão para copiar o código. Se você não tratar esses casos, os leitores RSS podem não renderizar o conteúdo de uma maneira correta.",[15,1796,1798],{"id":1797},"conclusão","Conclusão",[11,1800,1801],{},"Seria legal se a equipe do Nuxt disponibilizasse uma maneira mais fácil de fazer isso, já que feeds RSS ainda são bem úteis e usados por algumas pessoas. Talvez com uma reescrita do módulo para usar Comark eles acabem implementando? Quem sabe.",[1803,1804,1805],"style",{},"html pre.shiki code .sjeE4, html code.shiki .sjeE4{--shiki-default:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sbjLL, html code.shiki .sbjLL{--shiki-default:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}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 .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}",{"title":57,"searchDepth":85,"depth":85,"links":1807},[1808,1809,1810,1811,1812,1813],{"id":17,"depth":85,"text":18},{"id":662,"depth":85,"text":663},{"id":746,"depth":85,"text":747},{"id":850,"depth":85,"text":851},{"id":1757,"depth":85,"text":1758},{"id":1797,"depth":85,"text":1798},"Programação","2026-06-17 00:00:00","Um passo-a-passo simples em como criar um feed e também disponibilizar o HTML dos posts.","md","pt-BR",{},null,"\u002Fblog\u002F2026\u002F2026-06-17-criando-um-feed-rss-com-nuxt-content",{"title":5,"description":1816},"blog\u002F2026\u002F2026-06-17-criando-um-feed-rss-com-nuxt-content",[1825,1826,875,879,226],"nuxt","nuxt content","2026-06-19 18:36:00","MIXZdlXRiIIyrwl93GiYnvMlZf2KB6R8XKU4NluQY8E",{"left":1830,"top":1830,"width":1831,"height":1831,"rotate":1830,"vFlip":1832,"hFlip":1832,"body":1833},0,24,false,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"M12 16v-4m0-4h.01\"\u002F>\u003C\u002Fg>",{"left":1830,"top":1830,"width":1831,"height":1831,"rotate":1830,"vFlip":1832,"hFlip":1832,"body":1835},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M2 6h4m-4 4h4m-4 4h4m-4 4h4\"\u002F>\u003Crect width=\"16\" height=\"20\" x=\"4\" y=\"2\" rx=\"2\"\u002F>\u003Cpath d=\"M9.5 8h5m-5 4H16m-6.5 4H14\"\u002F>\u003C\u002Fg>",{"left":1830,"top":1830,"width":1831,"height":1831,"rotate":1830,"vFlip":1832,"hFlip":1832,"body":1837},"\u003Cpath fill=\"currentColor\" d=\"M12.001 9a3 3 0 1 0 0 6a3 3 0 0 0 0-6m0-2a5 5 0 1 1 0 10a5 5 0 0 1 0-10m6.5-.25a1.25 1.25 0 0 1-2.5 0a1.25 1.25 0 0 1 2.5 0M12.001 4c-2.474 0-2.878.007-4.029.058c-.784.037-1.31.142-1.798.332a2.9 2.9 0 0 0-1.08.703a2.9 2.9 0 0 0-.704 1.08c-.19.49-.295 1.015-.331 1.798C4.007 9.075 4 9.461 4 12c0 2.475.007 2.878.058 4.029c.037.783.142 1.31.331 1.797c.17.435.37.748.702 1.08c.337.336.65.537 1.08.703c.494.191 1.02.297 1.8.333C9.075 19.994 9.461 20 12 20c2.475 0 2.878-.007 4.029-.058c.782-.037 1.308-.142 1.797-.331a2.9 2.9 0 0 0 1.08-.703c.337-.336.538-.649.704-1.08c.19-.492.296-1.018.332-1.8c.052-1.103.058-1.49.058-4.028c0-2.474-.007-2.878-.058-4.029c-.037-.782-.143-1.31-.332-1.798a2.9 2.9 0 0 0-.703-1.08a2.9 2.9 0 0 0-1.08-.704c-.49-.19-1.016-.295-1.798-.331C14.926 4.006 14.54 4 12 4m0-2c2.717 0 3.056.01 4.123.06c1.064.05 1.79.217 2.427.465c.66.254 1.216.598 1.772 1.153a4.9 4.9 0 0 1 1.153 1.772c.247.637.415 1.363.465 2.428c.047 1.066.06 1.405.06 4.122s-.01 3.056-.06 4.122s-.218 1.79-.465 2.428a4.9 4.9 0 0 1-1.153 1.772a4.9 4.9 0 0 1-1.772 1.153c-.637.247-1.363.415-2.427.465c-1.067.047-1.406.06-4.123.06s-3.056-.01-4.123-.06c-1.064-.05-1.789-.218-2.427-.465a4.9 4.9 0 0 1-1.772-1.153a4.9 4.9 0 0 1-1.153-1.772c-.248-.637-.415-1.363-.465-2.428C2.012 15.056 2 14.717 2 12s.01-3.056.06-4.122s.217-1.79.465-2.428a4.9 4.9 0 0 1 1.153-1.772A4.9 4.9 0 0 1 5.45 2.525c.637-.248 1.362-.415 2.427-.465C8.945 2.013 9.284 2 12.001 2\"\u002F>",{"left":1830,"top":1830,"width":1831,"height":1831,"rotate":1830,"vFlip":1832,"hFlip":1832,"body":1839},"\u003Cpath fill=\"currentColor\" d=\"M4.907 3.44c.709.12 1.533.501 2.576 1.247C9.28 5.97 10.769 7.739 12 9.564c1.231-1.825 2.72-3.593 4.517-4.877c1.043-.746 1.867-1.127 2.576-1.248c.767-.13 1.29.065 1.615.2C21.717 4.06 22 5.225 22 6.215c0 .201-.086 1.302-.185 2.36c-.052.546-.11 1.108-.166 1.577c-.053.428-.115.88-.19 1.133a4.33 4.33 0 0 1-1.951 2.517c.937.707 1.277 1.856.928 2.984c-.597 1.924-2.737 4.397-4.835 4.618c-1.773.186-2.935-1.325-3.601-2.76c-.666 1.435-1.828 2.946-3.6 2.76c-2.099-.22-4.24-2.694-4.836-4.618c-.35-1.128-.01-2.277.928-2.984a4.33 4.33 0 0 1-1.95-2.517c-.076-.253-.138-.705-.19-1.133a61 61 0 0 1-.167-1.577C2.085 7.517 2 6.416 2 6.215c0-.99.283-2.155 1.292-2.576c.326-.135.847-.33 1.615-.2M4.05 6.916c.064.818.18 2.108.288 2.992c.032.268.055.545.122.807c.397 1.34 1.929 2.082 3.686 1.887a1 1 0 0 1 .257 1.983c-.756.112-3.315.357-2.928 1.607c.357 1.151 1.848 3.087 3.134 3.222c.928.097 1.5-1.394 1.766-2.045c.275-.674.488-1.38.668-1.982a1 1 0 0 1 1.916 0c.18.602.393 1.308.668 1.982c.266.651.838 2.142 1.766 2.045c1.286-.135 2.777-2.07 3.134-3.222c.387-1.25-2.172-1.495-2.928-1.607a1 1 0 0 1 .257-1.983c1.757.195 3.289-.547 3.686-1.887c.069-.266.089-.536.122-.807a80 80 0 0 0 .288-2.992c.037-.468.247-1.637-.522-1.506c-.286.049-.823.241-1.749.903c-1.943 1.389-3.705 3.513-4.789 5.64a1 1 0 0 1-1.782 0c-1.084-2.127-2.846-4.251-4.789-5.64c-.926-.662-1.463-.854-1.749-.903c-.784-.134-.559 1.034-.522 1.506\"\u002F>",{"left":1830,"top":1830,"width":1831,"height":1831,"rotate":1830,"vFlip":1832,"hFlip":1832,"body":1841},"\u003Cpath fill=\"currentColor\" d=\"M5.884 18.653c-.3-.2-.558-.455-.86-.816a51 51 0 0 1-.466-.579c-.463-.575-.755-.841-1.056-.95a1 1 0 1 1 .675-1.882c.752.27 1.261.735 1.947 1.588c-.094-.117.34.427.433.539c.19.227.33.365.44.438c.204.137.588.196 1.15.14c.024-.382.094-.753.202-1.095c-2.968-.726-4.648-2.64-4.648-6.396c0-1.24.37-2.356 1.058-3.292c-.218-.894-.185-1.975.302-3.192a1 1 0 0 1 .63-.582c.081-.024.127-.035.208-.047c.803-.124 1.937.17 3.415 1.096a11.7 11.7 0 0 1 2.687-.308c.912 0 1.819.104 2.684.308c1.477-.933 2.614-1.227 3.422-1.096q.128.02.218.05a1 1 0 0 1 .616.58c.487 1.216.52 2.296.302 3.19c.691.936 1.058 2.045 1.058 3.293c0 3.757-1.674 5.665-4.642 6.392c.125.415.19.878.19 1.38c0 .665-.002 1.299-.007 2.01c0 .19-.002.394-.005.706a1 1 0 0 1-.018 1.958c-1.14.227-1.984-.532-1.984-1.525l.002-.447l.005-.705c.005-.707.008-1.337.008-1.997c0-.697-.184-1.152-.426-1.361c-.661-.57-.326-1.654.541-1.751c2.966-.333 4.336-1.482 4.336-4.66c0-.955-.312-1.744-.913-2.404A1 1 0 0 1 17.2 6.19c.166-.414.236-.957.095-1.614l-.01.003c-.491.139-1.11.44-1.858.949a1 1 0 0 1-.833.135a9.6 9.6 0 0 0-2.592-.349c-.89 0-1.772.118-2.592.35a1 1 0 0 1-.829-.134c-.753-.507-1.374-.807-1.87-.947c-.143.653-.072 1.194.093 1.607a1 1 0 0 1-.189 1.045c-.597.655-.913 1.458-.913 2.404c0 3.172 1.371 4.328 4.322 4.66c.865.097 1.202 1.177.545 1.748c-.193.168-.43.732-.43 1.364v3.15c0 .985-.834 1.725-1.96 1.528a1 1 0 0 1-.04-1.962v-.99c-.91.061-1.661-.088-2.254-.485\"\u002F>",{"left":1830,"top":1830,"width":1831,"height":1831,"rotate":1830,"vFlip":1832,"hFlip":1832,"body":1843},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M4 11a9 9 0 0 1 9 9M4 4a16 16 0 0 1 16 16\"\u002F>\u003Ccircle cx=\"5\" cy=\"19\" r=\"1\"\u002F>\u003C\u002Fg>",{"left":1830,"top":1830,"width":1831,"height":1831,"rotate":1830,"vFlip":1832,"hFlip":1832,"body":1845},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"M12 8v4m0 4h.01\"\u002F>\u003C\u002Fg>",{"left":1830,"top":1830,"width":1831,"height":1831,"rotate":1830,"vFlip":1832,"hFlip":1832,"body":1847},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fg>",{"left":1830,"top":1830,"width":417,"height":417,"rotate":1830,"vFlip":1832,"hFlip":1832,"body":1849},"\u003Cpath fill=\"none\" stroke=\"#a6da95\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9.5 12.5h6l-5-7L7.44 11c-.67.98-1.32 1.48-1.94 1.5h-5l5-9l3 5\"\u002F>",{"left":1830,"top":1830,"width":417,"height":417,"rotate":1830,"vFlip":1832,"hFlip":1832,"body":1851},"\u003Cg fill=\"none\" stroke=\"#a6da95\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\u003Cpath d=\"M1 1.5h5.44L8 4.56L9.56 1.5H15l-6.99 13z\"\u002F>\u003Cpath d=\"M12.05 1.73L8 9.28L3.95 1.73\"\u002F>\u003C\u002Fg>",{"left":1830,"top":1830,"width":417,"height":417,"rotate":1830,"vFlip":1832,"hFlip":1832,"body":1853},"\u003Cg fill=\"none\" stroke=\"#8aadf4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\u003Cpath d=\"M4 1.5h8A2.5 2.5 0 0 1 14.5 4v8a2.5 2.5 0 0 1-2.5 2.5H4A2.5 2.5 0 0 1 1.5 12V4A2.5 2.5 0 0 1 4 1.5\"\u002F>\u003Cpath d=\"M12.5 8.75c0-.69-.54-1.25-1.2-1.25h-.6c-.66 0-1.2.56-1.2 1.25S10.04 10 10.7 10h.6c.66 0 1.2.56 1.2 1.25s-.54 1.25-1.2 1.25h-.6c-.66 0-1.2-.56-1.2-1.25m-3-3.75v5M5 7.5h3\"\u002F>\u003C\u002Fg>",{"left":1830,"top":1830,"width":1831,"height":1831,"rotate":1830,"vFlip":1832,"hFlip":1832,"body":1855},"\u003Cpath fill=\"currentColor\" d=\"M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0zM5.13 5.323l13.837.019l-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z\"\u002F>",1782656917119]