{"version":"https://jsonfeed.org/version/1.1","title":"Sveleton","home_page_url":"","feed_url":"http://sveltekit-prerender/feed.json","description":"Latest articles from Sveleton","items":[{"id":"/todos/add-og-type-article-meta/","url":"/todos/add-og-type-article-meta/","relPath":"/todos/add-og-type-article-meta/","title":"Add og:type article + article:published_time","summary":"","image":"","tags":["SEO"],"order":{"default":20260515},"authors":["ramil"],"wordCount":111,"date_published":"2026-05-15T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/add-og-type-article-meta\">Add Og Type Article Meta</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Add og:type article <span>+ article:published_time</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-05-15\" itemprop=\"datePublished\">May 15</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Every todo's <code>PageMeta</code> carries <code>date</code>, <code>updated</code>, and <code>authors</code>, but <code>Meta.svelte:49</code> always sets <code>og:type</code> to <code>website</code>. None of the article-type signals are emitted, which is\n    the largest gap between what the data model promises and what reaches\n    crawlers.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Detect article-like pages (e.g. presence of <code>date</code> + <code>authors</code>) and set <code>og:type=article</code></li> <li>Emit <code>article:published_time</code> from <code>date</code> (ISO via <code>publicationDateToISO</code>)</li> <li>Emit <code>article:modified_time</code> from <code>updated</code> when set</li> <li>Emit <code>article:author</code> for each author (resolve via the authors\n      map)</li> <li>Optionally add a per-page <code>meta name=\"author\"</code></li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Treat articles as articles</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">OpenGraph article-type tags from existing PageMeta</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/add-robots-txt/","url":"/todos/add-robots-txt/","relPath":"/todos/add-robots-txt/","title":"Add robots.txt","summary":"","image":"","tags":["SEO"],"order":{"default":20260515},"authors":["ramil"],"wordCount":69,"date_published":"2026-05-15T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/add-robots-txt\">Add Robots Txt</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Add <span>robots.txt</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-05-15\" itemprop=\"datePublished\">May 15</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>There is no <code>static/robots.txt</code> in the repo, and no <code>Sitemap:</code> directive published anywhere. Crawlers default to discovery via common\n    paths, which is fragile.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Create <code>static/robots.txt</code> with <code>User-agent: *</code>, <code>Allow: /</code>, and a <code>Sitemap:</code> line pointing at <code>PROJECT_URL + '/sitemap-appendix.xml'</code></li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Help crawlers find the sitemap</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">A one-line robots.txt with the Sitemap: directive</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/add-seo-test-coverage/","url":"/todos/add-seo-test-coverage/","relPath":"/todos/add-seo-test-coverage/","title":"Add SEO test coverage","summary":"","image":"","tags":["SEO","Testing"],"order":{"default":20260515},"authors":["ramil"],"wordCount":122,"date_published":"2026-05-15T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/add-seo-test-coverage\">Add Seo Test Coverage</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Add <span>SEO test coverage</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-05-15\" itemprop=\"datePublished\">May 15</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>The only existing test file is <code>imagetools.test.js</code>. Nothing covers the meta/sitemap/feed\n    surface — meaning any of the audit fixes can silently regress without\n    notice.</p> <h2 id=\"targets\">Test targets</h2> <ul><li><code>Meta.svelte</code> — title fallback chain, OG/Twitter parity, canonical, noindex, keywords,\n      empty-content suppression</li> <li><code>sitemap-appendix.xml</code> — included URLs match <code>excluded</code>/<code>draft</code>/<code>noindex</code> rules</li> <li><code>feed.json</code> — JSON Feed 1.1 schema (<code>version</code>, <code>home_page_url</code>, <code>feed_url</code>, items)</li> <li><code>feed.xml</code> — <code>sanitizeContentForRSS</code> regex, HTML escaping, no double\n      slashes in <code>&lt;id></code></li> <li><code>parsePublicationDate</code> / <code>publicationDateToISO</code> — DD-MM-YYYY, ISO, and invalid input</li> <li><code>pathToPublicURL</code> — route-group stripping, nested groups</li> <li><code>getReadNext</code> — tag-overlap ranking, fallback to recent, excluded/draft filtering</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Lock SEO behavior with tests</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Guard the meta surface before it drifts</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/centralize-project-constants-in-feeds/","url":"/todos/centralize-project-constants-in-feeds/","relPath":"/todos/centralize-project-constants-in-feeds/","title":"Centralize PROJECT_* in feeds and sitemap","summary":"","image":"","tags":["SEO"],"order":{"default":20260515},"authors":["ramil"],"wordCount":116,"date_published":"2026-05-15T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/centralize-project-constants-in-feeds\">Centralize Project Constants In Feeds</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Centralize <span>PROJECT_* in feeds and sitemap</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-05-15\" itemprop=\"datePublished\">May 15</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Sveleton is a bootstrap; re-using it for a new project should mean changing <code>PROJECT_NAME</code>, <code>PROJECT_URL</code>, and <code>PROJECT_DESCRIPTION</code> in one place. Today, several SEO outputs bypass these constants.</p> <h2 id=\"current-state\">Current State</h2> <ul><li><code>feed.json/+server.js:7,17</code> — hardcodes <code>'Sveleton'</code> and <code>'Latest articles from Sveleton'</code></li> <li><code>feed.json/+server.js:15</code> — <code>home_page_url</code> uses empty <code>base</code> instead of <code>PROJECT_URL</code></li> <li><code>feed.xml/+server.js:23,43</code> — empty <code>BASE_URL</code>; <code>&lt;author>&lt;name>Team&lt;/name></code> placeholder</li> <li><code>sitemap-appendix.xml/+server.js:5</code> — hardcoded <code>'https://sveleton.ramilkarimov.me'</code></li></ul> <h2 id=\"tasks\">Tasks</h2> <ul><li>Replace hardcoded strings with imports from <code>$lib</code> (<code>PROJECT_NAME</code>, <code>PROJECT_URL</code>, <code>PROJECT_DESCRIPTION</code>)</li> <li>Remove the placeholder <code>&lt;author>&lt;name>Team&lt;/name></code></li> <li>Fix the trailing <code>//</code> in feed.xml <code>&lt;id></code> (<code>feed.xml/+server.js:40</code>)</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">One source of brand truth</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">PROJECT_* constants drive every feed and sitemap output</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/filter-sitemap-by-exclusion/","url":"/todos/filter-sitemap-by-exclusion/","relPath":"/todos/filter-sitemap-by-exclusion/","title":"Filter sitemap by excluded/draft/noindex","summary":"","image":"","tags":["SEO"],"order":{"default":0},"authors":["ramil"],"wordCount":111,"date_published":"2026-05-15T00:00:00-00:00","updated":"2026-05-15T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/filter-sitemap-by-exclusion\">Filter Sitemap By Exclusion</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Filter sitemap by <span>excluded/draft/noindex</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-05-15\" itemprop=\"datePublished\">May 15</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-05-15\" itemprop=\"dateModified\">May 15</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p><code>src/routes/sitemap-appendix.xml/+server.js</code> enumerates every <code>+page.svelte</code> from <code>getPages()</code> without honoring the <code>excluded</code>, <code>draft</code>, or <code>noindex</code> flags.\n    Engineering todos like <code>fix-ci-type-errors</code> and <code>migrate-to-lightning-css</code> get published to search engines as article content.</p> <h2 id=\"current-state\">Current State</h2> <ul><li><code>sitemap-appendix.xml/+server.js:46-52</code> — no filter at all</li> <li><code>sitemap/+page.server.js:73</code> — excludes only the sitemap page itself</li> <li><code>pages.remote.js getReadNext:50</code> — filters both <code>excluded</code> and <code>draft</code></li></ul> <h2 id=\"tasks\">Tasks</h2> <ul><li>Centralize inclusion policy in a single helper (e.g. <code>isPublic(page)</code>)</li> <li>Honor <code>excluded</code>, <code>draft</code>, <code>noindex</code></li> <li>Apply the helper in all three consumers</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Stop leaking internal pages</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">One inclusion policy for sitemap, HTML sitemap, and ReadNext</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/fix-double-canonical-tag/","url":"/todos/fix-double-canonical-tag/","relPath":"/todos/fix-double-canonical-tag/","title":"Fix double canonical tag","summary":"","image":"","tags":["SEO"],"order":{"default":0},"authors":["ramil"],"wordCount":83,"date_published":"2026-05-15T00:00:00-00:00","updated":"2026-05-15T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/fix-double-canonical-tag\">Fix Double Canonical Tag</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Fix double <span>canonical tag</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-05-15\" itemprop=\"datePublished\">May 15</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-05-15\" itemprop=\"dateModified\">May 15</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p><code>src/routes/+layout.svelte:28</code> unconditionally emits <code>&lt;link rel=\"canonical\"></code> from <code>PROJECT_URL + pathname</code>, while <code>src/lib/Meta.svelte:84-86</code> also emits one when <code>pageMeta.canonical</code> is set. Pages overriding\n    canonical end up with two tags.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Remove the unconditional canonical from <code>+layout.svelte</code></li> <li>Have <code>Meta.svelte</code> always emit canonical, defaulting to <code>PROJECT_URL + pathname</code> when <code>pageMeta.canonical</code> is not set</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">One canonical, one source</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Delegate canonical resolution to Meta only</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/remove-dead-base-url-and-exclude-paths/","url":"/todos/remove-dead-base-url-and-exclude-paths/","relPath":"/todos/remove-dead-base-url-and-exclude-paths/","title":"Remove dead BASE_URL and EXCLUDE_PATHS","summary":"","image":"","tags":["SEO","Cleanup"],"order":{"default":20260515},"authors":["ramil"],"wordCount":96,"date_published":"2026-05-15T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/remove-dead-base-url-and-exclude-paths\">Remove Dead Base Url And Exclude Paths</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Remove dead <span>BASE_URL and EXCLUDE_PATHS</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-05-15\" itemprop=\"datePublished\">May 15</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Three files declare <code>const BASE_URL = ''</code> and use it in string\n    concatenations — all no-ops. A separate <code>EXCLUDE_PATHS</code> list points at routes that don't exist in this project (carryover from the\n    parent template).</p> <h2 id=\"current-state\">Current State</h2> <ul><li><code>src/lib/url-utils.js:1</code></li> <li><code>src/lib/page-renderer.svelte.js:8</code></li> <li><code>src/routes/feed.xml/+server.js:23</code></li> <li><code>page-renderer.svelte.js:10-24</code> — <code>EXCLUDE_PATHS</code> with <code>/blog/</code>, <code>/learning-center/...</code>, <code>/reviews/</code></li></ul> <h2 id=\"tasks\">Tasks</h2> <ul><li>Delete the three <code>BASE_URL</code> declarations and their usages</li> <li>Delete <code>EXCLUDE_PATHS</code> or replace with real exclusions</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Less dead code</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Drop template carryover from the SEO surface</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/remove-empty-google-site-verification/","url":"/todos/remove-empty-google-site-verification/","relPath":"/todos/remove-empty-google-site-verification/","title":"Remove empty google-site-verification","summary":"","image":"","tags":["SEO","Cleanup"],"order":{"default":0},"authors":["ramil"],"wordCount":78,"date_published":"2026-05-15T00:00:00-00:00","updated":"2026-05-21T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/remove-empty-google-site-verification\">Remove Empty Google Site Verification</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Remove empty <span>google-site-verification</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-05-15\" itemprop=\"datePublished\">May 15</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-05-21\" itemprop=\"dateModified\">May 21</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p><code>src/routes/+layout.svelte:27</code> emits <code>&lt;meta name=\"google-site-verification\" content=\"\"></code> on every page. An empty value does nothing for Search Console and adds noise\n    to the head.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Either remove the tag, or make it conditional on a real verification\n      string (e.g. <code>PROJECT_GOOGLE_VERIFICATION</code> in <code>$lib</code>)</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Drop the empty placeholder</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Either fill in the verification or remove the tag</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/replace-templated-demo-descriptions/","url":"/todos/replace-templated-demo-descriptions/","relPath":"/todos/replace-templated-demo-descriptions/","title":"Replace templated demo descriptions","summary":"","image":"","tags":["SEO","Content"],"order":{"default":20260515},"authors":["ramil"],"wordCount":109,"date_published":"2026-05-15T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/replace-templated-demo-descriptions\">Replace Templated Demo Descriptions</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Replace templated <span>demo descriptions</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-05-15\" itemprop=\"datePublished\">May 15</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>At least 16 demo todo pages carry the identical <code>description: 'Create a demo page for the X component.'</code>. That\n    field is what <code>Meta.svelte</code> emits as <code>&lt;meta name=\"description\"></code>, so search engines see duplicate\n    descriptions across the site.</p> <h2 id=\"affected\">Affected pages</h2> <p><code>demo-anchor-heading</code>, <code>demo-articles</code>, <code>demo-authors</code>, <code>demo-call-to-action</code>, <code>demo-call-to-action-black</code>, <code>demo-img</code>, <code>demo-link-block</code>, <code>demo-meta</code>, <code>demo-post-preview</code>, <code>demo-publication-authors</code>, <code>demo-publication-date</code>, <code>demo-read-next</code>, <code>demo-reading-time</code>, <code>demo-share-post-link</code>, <code>demo-sitemap</code>, <code>demo-todo-cover</code>, <code>demo-accordion</code>.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Write a unique 1-2 sentence description for each demo describing what the\n      component actually demonstrates</li> <li>Also revisit the templated <code>cta.description</code> stubs (<code>'Articles showcase'</code>, etc.)</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Unique descriptions per page</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Stop shipping duplicate meta descriptions</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/seo/","url":"/todos/seo/","relPath":"/todos/seo/","title":"SEO tasks","summary":"","image":"","tags":["SEO"],"order":{"default":20260515},"authors":["ramil"],"excluded":true,"wordCount":45,"date_published":"2026-05-15T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/seo\">Seo</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->SEO <span>tasks</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-05-15\" itemprop=\"datePublished\">May 15</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Landing page for the SEO audit follow-ups. Each card below is a separate\n    todo with its own write-up and tasks.</p> <div class=\"articles svelte-1s2ms6o compact fancy\"><!--[--><!--]--> <!--[-1--><!--]--></div><!----> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">SEO follow-ups</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Audit-driven tasks for crawling, indexing, and content quality</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/update-claude-md-conventions/","url":"/todos/update-claude-md-conventions/","relPath":"/todos/update-claude-md-conventions/","title":"Update CLAUDE.md (NavAnchor, exports)","summary":"","image":"","tags":["SEO","Docs"],"order":{"default":20260515},"authors":["ramil"],"wordCount":107,"date_published":"2026-05-15T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/update-claude-md-conventions\">Update Claude Md Conventions</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Update CLAUDE.md <span>(NavAnchor, exports)</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-05-15\" itemprop=\"datePublished\">May 15</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Recent commits replaced <code>NavAnchor</code> with the <code>navSection</code> attachment and renamed <code>PublicationAuthors</code> to <code>Authors</code>, but the project's <code>CLAUDE.md</code> hasn't caught up.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Replace <code>NavAnchor</code> usage in the todo page template with <code>&lt;h2 id=\"...\" {@attach navSection()}></code></li> <li>Update the exports list to remove <code>NavAnchor</code>, <code>PublicationAuthors</code>, and <code>pages</code>; add <code>Authors</code></li> <li>Document that <code>Meta</code> auto-resolves from <code>PageMeta</code> — todo pages should not add a per-page <code>&lt;Meta></code></li> <li>Document the SEO outputs: <code>sitemap-appendix.xml</code>, <code>feed.json</code>, <code>feed.xml</code></li> <li>Fix README's Node version (24) and the imagetools-disabled claim</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Docs that match the code</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Fresh template and exports list</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/features/gallery/","url":"/features/gallery/","relPath":"/features/gallery/","title":"Gallery","summary":"","image":"/_app/immutable/assets/1.B08UqseV.avif","tags":["Components"],"order":{"default":20260416},"authors":["ramil"],"wordCount":356,"date_published":"2026-04-16T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/features\">Features</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/features/gallery\">Gallery</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Gallery<!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-04-16\" itemprop=\"datePublished\">April 16</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Click any thumbnail to open it in a native, unstyled dialog.</p> <div class=\"gallery svelte-ewh1ap\"><!--[--><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/1.B08UqseV.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/1.C2joqs79.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/1.B08UqseV.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 784 / 731; background-image: url(/_app/immutable/assets/1.D7SeSXR0.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[0--><figcaption>Bulbasaur</figcaption><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/2.DfhhDRpk.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/2.tVeuFqCQ.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/2.DfhhDRpk.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 900 / 838; background-image: url(/_app/immutable/assets/2.4CG1rI0L.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/3.DYEpEso-.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/3.BDmhoCep.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/3.DYEpEso-.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 900 / 698; background-image: url(/_app/immutable/assets/3._JPHHSza.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/4.JpEcJ6s5.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/4.DjVh9p_K.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/4.JpEcJ6s5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 834 / 942; background-image: url(/_app/immutable/assets/4.DJz4p1pR.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[0--><figcaption>Charmander</figcaption><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/5.CNHj6f07.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/5.Bjpb5bLz.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/5.CNHj6f07.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 851 / 1000; background-image: url(/_app/immutable/assets/5.DjaunCBP.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/6.BG0xQ_M_.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/6.C_MnepJM.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/6.BG0xQ_M_.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 900 / 708; background-image: url(/_app/immutable/assets/6.CPBbORvQ.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/7.qzVr7XA6.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/7.34dxhrxU.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/7.qzVr7XA6.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 886 / 915; background-image: url(/_app/immutable/assets/7.CqksDBwg.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[0--><figcaption>Squirtle</figcaption><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/8.CZEqRP4h.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/8.CK__0oXg.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/8.CZEqRP4h.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 900 / 915; background-image: url(/_app/immutable/assets/8.DNaOaNXi.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/9.BWXSlW2R.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/9.Dqgrji-x.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/9.BWXSlW2R.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 900 / 977; background-image: url(/_app/immutable/assets/9.BkW4LHhQ.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/10.Dwgit1NQ.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/10.Ce2Ndxn2.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/10.Dwgit1NQ.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 509 / 509; background-image: url(/_app/immutable/assets/10.DzBSZK3n.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/11.C-g1E7F8.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/11.Dcrrg1eK.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/11.C-g1E7F8.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 879 / 1000; background-image: url(/_app/immutable/assets/11.OWRM0n1h.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/12.Cqd34zKj.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/12.s0rFA8Kn.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/12.Cqd34zKj.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 551 / 501; background-image: url(/_app/immutable/assets/12.DsH2e41N.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/13.Ci0unIIK.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/13.CXHMfSIM.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/13.Ci0unIIK.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 787 / 1000; background-image: url(/_app/immutable/assets/13.Dz0-ofVz.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/14.s1pr6V8C.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/14.BZFWCYqN.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/14.s1pr6V8C.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 297 / 545; background-image: url(/_app/immutable/assets/14.Blw8g09q.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/15.CEG6-L4i.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/15.BCfXge_I.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/15.CEG6-L4i.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 831 / 1000; background-image: url(/_app/immutable/assets/15.BlEat7wN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/16.CDkjZZGr.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/16.dp1ety_P.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/16.CDkjZZGr.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 770 / 826; background-image: url(/_app/immutable/assets/16.BezBjVJe.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/17.DvDwqxOj.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/17.gKAzzklE.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/17.DvDwqxOj.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 866 / 1000; background-image: url(/_app/immutable/assets/17.D-2mqHHj.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/18.Dee7U19m.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/18.CfmC1tIx.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/18.Dee7U19m.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 900 / 942; background-image: url(/_app/immutable/assets/18.ce-2SkCr.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/19.WzwffIOX.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/19.BTITigVg.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/19.WzwffIOX.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 548 / 485; background-image: url(/_app/immutable/assets/19.BeWXmEaU.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/20.BwsJAAyU.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/20.CW0IjuTg.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/20.BwsJAAyU.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 543 / 534; background-image: url(/_app/immutable/assets/20.BtKb1PJU.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/21.CH_QsB7h.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/21.CkCrVkeY.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/21.CH_QsB7h.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 537 / 551; background-image: url(/_app/immutable/assets/21.BMHWFXvM.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/22.D4fCJlWr.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/22.CgoL70Av.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/22.D4fCJlWr.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 560 / 519; background-image: url(/_app/immutable/assets/22.CPkdhgOZ.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/23.Bzro0e7N.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/23.CZvTfV2D.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/23.Bzro0e7N.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 539 / 533; background-image: url(/_app/immutable/assets/23.DlXxV24J.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/24.BO1nLo_D.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/24.DWKq1hjR.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/24.BO1nLo_D.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 490 / 548; background-image: url(/_app/immutable/assets/24.DuZSZ1QW.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/25.CuUcZXUN.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/25.BV0i4n38.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/25.CuUcZXUN.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 900 / 842; background-image: url(/_app/immutable/assets/25.OdEDstp8.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[0--><figcaption>Pikachu</figcaption><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/26.QxgluLLu.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/26.DpQ1GYeB.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/26.QxgluLLu.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 900 / 800; background-image: url(/_app/immutable/assets/26.CP2mg-Mo.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/27.CUfkOC7K.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/27.2GfrbT-m.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/27.CUfkOC7K.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 838 / 919; background-image: url(/_app/immutable/assets/27.cjmlSM77.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/28.rhEwm6jV.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/28.tNDCXUZl.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/28.rhEwm6jV.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 900 / 860; background-image: url(/_app/immutable/assets/28.BWbbSaJA.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/29.DxL_SXvv.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/29.C7q4FoT4.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/29.DxL_SXvv.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 523 / 501; background-image: url(/_app/immutable/assets/29.CPLYrNjC.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><figure class=\"svelte-ewh1ap\"><a href=\"/_app/immutable/assets/30.BrwxZ0TO.avif\" target=\"_blank\" class=\"svelte-ewh1ap\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/30.BwcGKdlI.avif 197w\" sizes=\"120px\"/><!--]--> <img src=\"/_app/immutable/assets/30.BrwxZ0TO.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 541 / 558; background-image: url(/_app/immutable/assets/30.m6MGYN17.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div></a> <!--[-1--><!--]--></figure><!--]--></div> <dialog class=\"svelte-ewh1ap\"><button type=\"button\" class=\"nav-btn nav-prev svelte-ewh1ap\" tabindex=\"-1\" aria-label=\"Previous image\"><span class=\"arrow-left svelte-ewh1ap\"></span></button> <div class=\"dialog-strip svelte-ewh1ap\"><!--[--><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"0\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/1.C2joqs79.avif 197w, /_app/immutable/assets/1.DX19tXHG.avif 263w, /_app/immutable/assets/1.CdNwv4B8.avif 349w, /_app/immutable/assets/1.UOQICCqr.avif 360w, /_app/immutable/assets/1.Cr8AaN_T.avif 385w, /_app/immutable/assets/1.DDfqp_52.avif 414w, /_app/immutable/assets/1.B4M6tdt-.avif 768w, /_app/immutable/assets/1.B08UqseV.avif 784w\"/><!--]--> <img src=\"/_app/immutable/assets/1.B08UqseV.avif\" alt=\"\" loading=\"eager\" style=\"aspect-ratio: 784 / 731; background-image: url(/_app/immutable/assets/1.D7SeSXR0.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[0--><figcaption class=\"svelte-ewh1ap\">Bulbasaur</figcaption><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"1\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/2.tVeuFqCQ.avif 197w, /_app/immutable/assets/2.BhOxMvI5.avif 263w, /_app/immutable/assets/2.BrARDYDq.avif 349w, /_app/immutable/assets/2.DNx1UNOM.avif 360w, /_app/immutable/assets/2.C3IkTnbZ.avif 385w, /_app/immutable/assets/2.BHE6vust.avif 414w, /_app/immutable/assets/2.DZ1hqlwj.avif 768w, /_app/immutable/assets/2.DfhhDRpk.avif 900w\"/><!--]--> <img src=\"/_app/immutable/assets/2.DfhhDRpk.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 900 / 838; background-image: url(/_app/immutable/assets/2.4CG1rI0L.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"2\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/3.BDmhoCep.avif 197w, /_app/immutable/assets/3.DpPL3LTN.avif 263w, /_app/immutable/assets/3.0NGjjhSe.avif 349w, /_app/immutable/assets/3.cVg9FgM7.avif 360w, /_app/immutable/assets/3.CeNMYKPB.avif 385w, /_app/immutable/assets/3._UltSE36.avif 414w, /_app/immutable/assets/3.C2BKALkL.avif 768w, /_app/immutable/assets/3.DYEpEso-.avif 900w\"/><!--]--> <img src=\"/_app/immutable/assets/3.DYEpEso-.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 900 / 698; background-image: url(/_app/immutable/assets/3._JPHHSza.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"3\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/4.DjVh9p_K.avif 197w, /_app/immutable/assets/4.CKkAd-Wn.avif 263w, /_app/immutable/assets/4.DZQv7A3w.avif 349w, /_app/immutable/assets/4.CcKfNch3.avif 360w, /_app/immutable/assets/4.BfSGKc-q.avif 385w, /_app/immutable/assets/4.B0iCVSAs.avif 414w, /_app/immutable/assets/4.CuNAmJie.avif 768w, /_app/immutable/assets/4.JpEcJ6s5.avif 834w\"/><!--]--> <img src=\"/_app/immutable/assets/4.JpEcJ6s5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 834 / 942; background-image: url(/_app/immutable/assets/4.DJz4p1pR.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[0--><figcaption class=\"svelte-ewh1ap\">Charmander</figcaption><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"4\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/5.Bjpb5bLz.avif 197w, /_app/immutable/assets/5.DCrLcf7-.avif 263w, /_app/immutable/assets/5.DdAD7HuL.avif 349w, /_app/immutable/assets/5.DRbfetnZ.avif 360w, /_app/immutable/assets/5.CTDt8Q2j.avif 385w, /_app/immutable/assets/5.wdoOq5nL.avif 414w, /_app/immutable/assets/5.BIEAbaal.avif 768w, /_app/immutable/assets/5.CNHj6f07.avif 851w\"/><!--]--> <img src=\"/_app/immutable/assets/5.CNHj6f07.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 851 / 1000; background-image: url(/_app/immutable/assets/5.DjaunCBP.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"5\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/6.C_MnepJM.avif 197w, /_app/immutable/assets/6.CKqlDX-e.avif 263w, /_app/immutable/assets/6.Dz9Jy2YK.avif 349w, /_app/immutable/assets/6.D7369BPE.avif 360w, /_app/immutable/assets/6.YS0Yyxoa.avif 385w, /_app/immutable/assets/6.BJlXFIGK.avif 414w, /_app/immutable/assets/6.C9LulLUn.avif 768w, /_app/immutable/assets/6.BG0xQ_M_.avif 900w\"/><!--]--> <img src=\"/_app/immutable/assets/6.BG0xQ_M_.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 900 / 708; background-image: url(/_app/immutable/assets/6.CPBbORvQ.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"6\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/7.34dxhrxU.avif 197w, /_app/immutable/assets/7.DIbqaGMi.avif 263w, /_app/immutable/assets/7.DJoEz8vk.avif 349w, /_app/immutable/assets/7.6tA-RRZ9.avif 360w, /_app/immutable/assets/7.FPbUQFYm.avif 385w, /_app/immutable/assets/7.D602LHi2.avif 414w, /_app/immutable/assets/7.Bc_cfBfF.avif 768w, /_app/immutable/assets/7.qzVr7XA6.avif 886w\"/><!--]--> <img src=\"/_app/immutable/assets/7.qzVr7XA6.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 886 / 915; background-image: url(/_app/immutable/assets/7.CqksDBwg.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[0--><figcaption class=\"svelte-ewh1ap\">Squirtle</figcaption><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"7\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/8.CK__0oXg.avif 197w, /_app/immutable/assets/8.D08FoFzH.avif 263w, /_app/immutable/assets/8.BwBkYch0.avif 349w, /_app/immutable/assets/8.ECu66M4g.avif 360w, /_app/immutable/assets/8.C825gMl6.avif 385w, /_app/immutable/assets/8.BD3yuShe.avif 414w, /_app/immutable/assets/8.lF1GD8F5.avif 768w, /_app/immutable/assets/8.CZEqRP4h.avif 900w\"/><!--]--> <img src=\"/_app/immutable/assets/8.CZEqRP4h.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 900 / 915; background-image: url(/_app/immutable/assets/8.DNaOaNXi.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"8\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/9.Dqgrji-x.avif 197w, /_app/immutable/assets/9.CUkYdbSq.avif 263w, /_app/immutable/assets/9.BTDrtHbu.avif 349w, /_app/immutable/assets/9.DHFiVqVm.avif 360w, /_app/immutable/assets/9.B7jb-Evf.avif 385w, /_app/immutable/assets/9.BHv7qT8G.avif 414w, /_app/immutable/assets/9.B59PFLcB.avif 768w, /_app/immutable/assets/9.BWXSlW2R.avif 900w\"/><!--]--> <img src=\"/_app/immutable/assets/9.BWXSlW2R.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 900 / 977; background-image: url(/_app/immutable/assets/9.BkW4LHhQ.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"9\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/10.Ce2Ndxn2.avif 197w, /_app/immutable/assets/10.CF7YEzow.avif 263w, /_app/immutable/assets/10.BIylQ_rF.avif 349w, /_app/immutable/assets/10.79iR13fj.avif 360w, /_app/immutable/assets/10.jnm3yrDd.avif 385w, /_app/immutable/assets/10.BhokoESh.avif 414w, /_app/immutable/assets/10.Dwgit1NQ.avif 509w\"/><!--]--> <img src=\"/_app/immutable/assets/10.Dwgit1NQ.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 509 / 509; background-image: url(/_app/immutable/assets/10.DzBSZK3n.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"10\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/11.Dcrrg1eK.avif 197w, /_app/immutable/assets/11.DVs4im6H.avif 263w, /_app/immutable/assets/11.3ntzBExV.avif 349w, /_app/immutable/assets/11.BegVrsG1.avif 360w, /_app/immutable/assets/11.Csdcf4NQ.avif 385w, /_app/immutable/assets/11.DQNjhuGt.avif 414w, /_app/immutable/assets/11.C0F2uYK8.avif 768w, /_app/immutable/assets/11.C-g1E7F8.avif 879w\"/><!--]--> <img src=\"/_app/immutable/assets/11.C-g1E7F8.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 879 / 1000; background-image: url(/_app/immutable/assets/11.OWRM0n1h.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"11\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/12.s0rFA8Kn.avif 197w, /_app/immutable/assets/12.B-YUr8uC.avif 263w, /_app/immutable/assets/12.Czq8CPRf.avif 349w, /_app/immutable/assets/12.GNAugr_x.avif 360w, /_app/immutable/assets/12.Dcs2niyd.avif 385w, /_app/immutable/assets/12.B7_-Kump.avif 414w, /_app/immutable/assets/12.Cqd34zKj.avif 551w\"/><!--]--> <img src=\"/_app/immutable/assets/12.Cqd34zKj.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 551 / 501; background-image: url(/_app/immutable/assets/12.DsH2e41N.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"12\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/13.CXHMfSIM.avif 197w, /_app/immutable/assets/13.CaEC1ryW.avif 263w, /_app/immutable/assets/13.DA1M38CV.avif 349w, /_app/immutable/assets/13._3veh2d8.avif 360w, /_app/immutable/assets/13.7FX-jHHn.avif 385w, /_app/immutable/assets/13.b0r-rgdG.avif 414w, /_app/immutable/assets/13.BJNXJEBY.avif 768w, /_app/immutable/assets/13.Ci0unIIK.avif 787w\"/><!--]--> <img src=\"/_app/immutable/assets/13.Ci0unIIK.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 787 / 1000; background-image: url(/_app/immutable/assets/13.Dz0-ofVz.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"13\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/14.BZFWCYqN.avif 197w, /_app/immutable/assets/14.aDW4tSbI.avif 263w, /_app/immutable/assets/14.s1pr6V8C.avif 297w\"/><!--]--> <img src=\"/_app/immutable/assets/14.s1pr6V8C.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 297 / 545; background-image: url(/_app/immutable/assets/14.Blw8g09q.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"14\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/15.BCfXge_I.avif 197w, /_app/immutable/assets/15.Ce_8psfi.avif 263w, /_app/immutable/assets/15.418r_3Yp.avif 349w, /_app/immutable/assets/15.3p5LRJQs.avif 360w, /_app/immutable/assets/15.DVQvF985.avif 385w, /_app/immutable/assets/15.pn0BGHrr.avif 414w, /_app/immutable/assets/15.CCSG46Wu.avif 768w, /_app/immutable/assets/15.CEG6-L4i.avif 831w\"/><!--]--> <img src=\"/_app/immutable/assets/15.CEG6-L4i.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 831 / 1000; background-image: url(/_app/immutable/assets/15.BlEat7wN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"15\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/16.dp1ety_P.avif 197w, /_app/immutable/assets/16.SP4rDjfT.avif 263w, /_app/immutable/assets/16.BZ6Cg2_d.avif 349w, /_app/immutable/assets/16.cRHl-4OM.avif 360w, /_app/immutable/assets/16.BppvBH0m.avif 385w, /_app/immutable/assets/16.DkPH8H08.avif 414w, /_app/immutable/assets/16.oRw4v_SF.avif 768w, /_app/immutable/assets/16.CDkjZZGr.avif 770w\"/><!--]--> <img src=\"/_app/immutable/assets/16.CDkjZZGr.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 770 / 826; background-image: url(/_app/immutable/assets/16.BezBjVJe.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"16\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/17.gKAzzklE.avif 197w, /_app/immutable/assets/17.DW_bQJtv.avif 263w, /_app/immutable/assets/17.C5BUI07x.avif 349w, /_app/immutable/assets/17.BKYkgdIT.avif 360w, /_app/immutable/assets/17.DWwNlG3H.avif 385w, /_app/immutable/assets/17.DoYxB5M2.avif 414w, /_app/immutable/assets/17.BNS80E0r.avif 768w, /_app/immutable/assets/17.DvDwqxOj.avif 866w\"/><!--]--> <img src=\"/_app/immutable/assets/17.DvDwqxOj.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 866 / 1000; background-image: url(/_app/immutable/assets/17.D-2mqHHj.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"17\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/18.CfmC1tIx.avif 197w, /_app/immutable/assets/18.Dt5U3Aaw.avif 263w, /_app/immutable/assets/18.CLbDLZ5-.avif 349w, /_app/immutable/assets/18.CPrvXpua.avif 360w, /_app/immutable/assets/18.4E4--uPa.avif 385w, /_app/immutable/assets/18.5lw3a-i6.avif 414w, /_app/immutable/assets/18.QGrRMhrU.avif 768w, /_app/immutable/assets/18.Dee7U19m.avif 900w\"/><!--]--> <img src=\"/_app/immutable/assets/18.Dee7U19m.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 900 / 942; background-image: url(/_app/immutable/assets/18.ce-2SkCr.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"18\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/19.BTITigVg.avif 197w, /_app/immutable/assets/19.BLyucuTl.avif 263w, /_app/immutable/assets/19.Bj87KydE.avif 349w, /_app/immutable/assets/19.CJeHAkER.avif 360w, /_app/immutable/assets/19.Dv3Op22q.avif 385w, /_app/immutable/assets/19.w-YQAOjM.avif 414w, /_app/immutable/assets/19.WzwffIOX.avif 548w\"/><!--]--> <img src=\"/_app/immutable/assets/19.WzwffIOX.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 548 / 485; background-image: url(/_app/immutable/assets/19.BeWXmEaU.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"19\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/20.CW0IjuTg.avif 197w, /_app/immutable/assets/20.DhsKYytt.avif 263w, /_app/immutable/assets/20.DjObYONz.avif 349w, /_app/immutable/assets/20.C1ZzJuPT.avif 360w, /_app/immutable/assets/20.CbuO80Vj.avif 385w, /_app/immutable/assets/20.0eOF5TBR.avif 414w, /_app/immutable/assets/20.BwsJAAyU.avif 543w\"/><!--]--> <img src=\"/_app/immutable/assets/20.BwsJAAyU.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 543 / 534; background-image: url(/_app/immutable/assets/20.BtKb1PJU.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"20\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/21.CkCrVkeY.avif 197w, /_app/immutable/assets/21.-c4u7mI_.avif 263w, /_app/immutable/assets/21.VNphZb1K.avif 349w, /_app/immutable/assets/21.DorotM3w.avif 360w, /_app/immutable/assets/21.CAN77Stm.avif 385w, /_app/immutable/assets/21.JjaTXmcp.avif 414w, /_app/immutable/assets/21.CH_QsB7h.avif 537w\"/><!--]--> <img src=\"/_app/immutable/assets/21.CH_QsB7h.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 537 / 551; background-image: url(/_app/immutable/assets/21.BMHWFXvM.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"21\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/22.CgoL70Av.avif 197w, /_app/immutable/assets/22.kZTd0Obn.avif 263w, /_app/immutable/assets/22.CltCd7gf.avif 349w, /_app/immutable/assets/22.DfinffQJ.avif 360w, /_app/immutable/assets/22.D_VL3OXd.avif 385w, /_app/immutable/assets/22.DcyCz3Ez.avif 414w, /_app/immutable/assets/22.D4fCJlWr.avif 560w\"/><!--]--> <img src=\"/_app/immutable/assets/22.D4fCJlWr.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 560 / 519; background-image: url(/_app/immutable/assets/22.CPkdhgOZ.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"22\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/23.CZvTfV2D.avif 197w, /_app/immutable/assets/23.BIR5EDMe.avif 263w, /_app/immutable/assets/23._GW3J0tV.avif 349w, /_app/immutable/assets/23.XKTNSU1n.avif 360w, /_app/immutable/assets/23.DxJ3oTrK.avif 385w, /_app/immutable/assets/23.Br5teGqB.avif 414w, /_app/immutable/assets/23.Bzro0e7N.avif 539w\"/><!--]--> <img src=\"/_app/immutable/assets/23.Bzro0e7N.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 539 / 533; background-image: url(/_app/immutable/assets/23.DlXxV24J.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"23\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/24.DWKq1hjR.avif 197w, /_app/immutable/assets/24.CF_UhUbl.avif 263w, /_app/immutable/assets/24.BZBDKZGs.avif 349w, /_app/immutable/assets/24.C9F3DnZL.avif 360w, /_app/immutable/assets/24.BiDuFahQ.avif 385w, /_app/immutable/assets/24.CA_99Xay.avif 414w, /_app/immutable/assets/24.BO1nLo_D.avif 490w\"/><!--]--> <img src=\"/_app/immutable/assets/24.BO1nLo_D.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 490 / 548; background-image: url(/_app/immutable/assets/24.DuZSZ1QW.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"24\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/25.BV0i4n38.avif 197w, /_app/immutable/assets/25.CNLTdIv7.avif 263w, /_app/immutable/assets/25.CrQh0m3I.avif 349w, /_app/immutable/assets/25.BqSySEuw.avif 360w, /_app/immutable/assets/25.Dog4kYFc.avif 385w, /_app/immutable/assets/25.BKIYt--b.avif 414w, /_app/immutable/assets/25.yfA75qqg.avif 768w, /_app/immutable/assets/25.CuUcZXUN.avif 900w\"/><!--]--> <img src=\"/_app/immutable/assets/25.CuUcZXUN.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 900 / 842; background-image: url(/_app/immutable/assets/25.OdEDstp8.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[0--><figcaption class=\"svelte-ewh1ap\">Pikachu</figcaption><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"25\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/26.DpQ1GYeB.avif 197w, /_app/immutable/assets/26.DLk3ZJkA.avif 263w, /_app/immutable/assets/26.Dcn7p60-.avif 349w, /_app/immutable/assets/26.B8xxpB2L.avif 360w, /_app/immutable/assets/26.DKHH8xxi.avif 385w, /_app/immutable/assets/26.D53MhNJ5.avif 414w, /_app/immutable/assets/26.D_4oYBRf.avif 768w, /_app/immutable/assets/26.QxgluLLu.avif 900w\"/><!--]--> <img src=\"/_app/immutable/assets/26.QxgluLLu.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 900 / 800; background-image: url(/_app/immutable/assets/26.CP2mg-Mo.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"26\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/27.2GfrbT-m.avif 197w, /_app/immutable/assets/27.Ku54RRoL.avif 263w, /_app/immutable/assets/27.DYw8Rt4b.avif 349w, /_app/immutable/assets/27.e1-Vd7hN.avif 360w, /_app/immutable/assets/27.C9_YTa55.avif 385w, /_app/immutable/assets/27.dsEUu0it.avif 414w, /_app/immutable/assets/27.D3OvdmaK.avif 768w, /_app/immutable/assets/27.CUfkOC7K.avif 838w\"/><!--]--> <img src=\"/_app/immutable/assets/27.CUfkOC7K.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 838 / 919; background-image: url(/_app/immutable/assets/27.cjmlSM77.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"27\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/28.tNDCXUZl.avif 197w, /_app/immutable/assets/28.dMIrkZPp.avif 263w, /_app/immutable/assets/28.bNFGWgwy.avif 349w, /_app/immutable/assets/28.CDHf71Kt.avif 360w, /_app/immutable/assets/28.ww7Jkfj2.avif 385w, /_app/immutable/assets/28.BCK3lBnG.avif 414w, /_app/immutable/assets/28.Cy34fzkU.avif 768w, /_app/immutable/assets/28.rhEwm6jV.avif 900w\"/><!--]--> <img src=\"/_app/immutable/assets/28.rhEwm6jV.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 900 / 860; background-image: url(/_app/immutable/assets/28.BWbbSaJA.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"28\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/29.C7q4FoT4.avif 197w, /_app/immutable/assets/29.CmIgLM_t.avif 263w, /_app/immutable/assets/29.CTf_yAlK.avif 349w, /_app/immutable/assets/29.DbtHDKZK.avif 360w, /_app/immutable/assets/29.SHh1TU0g.avif 385w, /_app/immutable/assets/29.DWJTPnDD.avif 414w, /_app/immutable/assets/29.DxL_SXvv.avif 523w\"/><!--]--> <img src=\"/_app/immutable/assets/29.DxL_SXvv.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 523 / 501; background-image: url(/_app/immutable/assets/29.CPLYrNjC.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><figure class=\"dialog-img svelte-ewh1ap\" data-index=\"29\" style=\"view-transition-name: none;\"><div class=\"svelte-ewh1ap\"><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/30.BwcGKdlI.avif 197w, /_app/immutable/assets/30.BVpGCoIX.avif 263w, /_app/immutable/assets/30.BXc0PnGW.avif 349w, /_app/immutable/assets/30.BP1qZzgI.avif 360w, /_app/immutable/assets/30.H-R3B2SH.avif 385w, /_app/immutable/assets/30.DgN_B2-E.avif 414w, /_app/immutable/assets/30.BrwxZ0TO.avif 541w\"/><!--]--> <img src=\"/_app/immutable/assets/30.BrwxZ0TO.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 541 / 558; background-image: url(/_app/immutable/assets/30.m6MGYN17.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----></div> <!--[-1--><!--]--></figure><!--]--></div> <button type=\"button\" class=\"nav-btn nav-next svelte-ewh1ap\" tabindex=\"-1\" aria-label=\"Next image\"><span class=\"arrow-right svelte-ewh1ap\"></span></button></dialog><!----> <h2 id=\"usage\">Usage</h2> <p>Import <code>Gallery</code> from <code>$lib</code> and pass an array of\n    imagetools-processed images to the <code>images</code> prop.</p> <h3 id=\"glob-import\">Glob import</h3> <p>Load all images from a folder at once. Ideal when you have many files and\n    don't need to reference them individually.</p> <pre><code>&lt;script>\nimport { Gallery } from '$lib';\n\nconst modules = import.meta.glob('./assets/*.jpg', {\n  eager: true,\n  import: 'default',\n});\nconst images = Object.values(modules);\n&lt;/script>\n\n&lt;Gallery {images} /></code></pre> <aside><p>Files loaded via <code>import.meta.glob</code> are sorted alphabetically\n      by path. To control order, prefix filenames with numbers (<code>01.jpg</code>, <code>02.jpg</code>) or sort the entries yourself.</p></aside> <h3 id=\"individual-imports\">Individual imports</h3> <p>Import each image explicitly. Useful when you need a specific subset or want\n    full control over order.</p> <pre><code>&lt;script>\nimport { Gallery } from '$lib';\nimport hero from './assets/hero.jpg';\nimport detail from './assets/detail.jpg';\nimport wide from './assets/wide.jpg';\n&lt;/script>\n\n&lt;Gallery images={[hero, detail, wide]} /></code></pre> <h3 id=\"mixed\">Mixed sources</h3> <p>Combine glob and individual imports. For example, glob a folder and prepend\n    a cover image.</p> <pre><code>&lt;script>\nimport { Gallery } from '$lib';\nimport cover from './assets/cover.jpg';\n\nconst rest = Object.values(\n  import.meta.glob('./assets/photos/*.jpg', {\n    eager: true,\n    import: 'default',\n  }),\n);\nconst images = [cover, ...rest];\n&lt;/script>\n\n&lt;Gallery {images} /></code></pre> <h2 id=\"captions\">Captions</h2> <p>Pass an optional <code>captions</code> prop as a <code>Record&lt;string, string></code> keyed by the same paths used in the <code>images</code> record. Captions\n    appear as <code>&lt;figcaption></code> in both the grid and the dialog.</p> <pre><code>&lt;script>\nimport { Gallery } from '$lib';\n\nconst images = import.meta.glob('./assets/*.jpg', {\n  eager: true,\n  import: 'default',\n});\n\nconst captions = {\n  './assets/hero.jpg': 'Hero shot',\n  './assets/detail.jpg': 'Close-up detail',\n};\n&lt;/script>\n\n&lt;Gallery {images} {captions} /></code></pre> <aside><p>Keys must match the glob paths exactly (e.g. <code>'./assets/1.jpg'</code>). Images without a matching key render no\n      caption.</p></aside> <h2 id=\"features\">Features</h2> <ul><li>Click a thumbnail to open a fullscreen dialog with the image</li> <li>Horizontal scroll-snap navigation between images</li> <li>Prev/next buttons on each side of the dialog</li> <li>View transition animation from thumbnail to fullscreen</li> <li>Close on Esc, backdrop click, or vertical page scroll</li> <li>Full-size images preloaded on hover for instant transitions</li> <li>Thumbnails use <code>sizes=\"120px\"</code> to load smaller variants</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Sveleton</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Bootstrap your next media project</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/document-deploy/","url":"/todos/document-deploy/","relPath":"/todos/document-deploy/","title":"Document Deploy","summary":"","image":"","tags":["Docs","Deploy"],"order":{"default":0},"authors":["ramil"],"wordCount":66,"date_published":"2026-04-13T00:00:00-00:00","updated":"2026-04-17T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/document-deploy\">Document Deploy</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Document <span>Deploy</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-04-13\" itemprop=\"datePublished\">April 13</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-04-17\" itemprop=\"dateModified\">April 17</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Document the full deployment setup for <code>sveleton.ramilkarimov.me</code> — server config, nginx, SSL, and the deploy process.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Document server setup (nginx config, web root, SSL via certbot)</li> <li>Document <code>./deploy.sh</code> usage and requirements</li> <li>Add deploy section to <code>CLAUDE.md</code> for future reference</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Docs</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Document the deploy setup</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/move-deploy-to-ci/","url":"/todos/move-deploy-to-ci/","relPath":"/todos/move-deploy-to-ci/","title":"Move Deploy to CI","summary":"","image":"","tags":["CI","Deploy"],"order":{"default":0},"authors":["ramil"],"wordCount":79,"date_published":"2026-04-13T00:00:00-00:00","updated":"2026-04-17T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/move-deploy-to-ci\">Move Deploy To Ci</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Move Deploy <span>to CI</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-04-13\" itemprop=\"datePublished\">April 13</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-04-17\" itemprop=\"dateModified\">April 17</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Currently deployment is manual via <code>./deploy.sh</code>. Move it to\n    GitHub Actions so every push to <code>main</code> deploys automatically to <code>sveleton.ramilkarimov.me</code>.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Add <code>SSH_PRIVATE_KEY</code> secret to GitHub repo</li> <li>Add deploy job to <code>.github/workflows/ci.yml</code> (runs after build,\n      on <code>main</code> only)</li> <li>Deploy via rsync to <code>root@universal.ramilkarimov.me:/var/www/sveleton</code></li> <li>Remove or keep <code>deploy.sh</code> for local use</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">CI</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Automate the deploy</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/reenable-share-button/","url":"/todos/reenable-share-button/","relPath":"/todos/reenable-share-button/","title":"Re-enable Share Button","summary":"","image":"","tags":["UI"],"order":{"default":20260413},"authors":["ramil"],"wordCount":58,"date_published":"2026-04-13T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/reenable-share-button\">Reenable Share Button</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Re-enable <span>Share Button</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-04-13\" itemprop=\"datePublished\">April 13</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>The share post link button was temporarily removed from the publication\n    footer. It needs to be re-enabled once the implementation is ready.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Re-add <code>SharePostLink</code> to <code>Publication.svelte</code> article footer</li> <li>Ensure Yandex Metrics event tracking works correctly</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">UI</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Restore share functionality</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/revise-deploy-process/","url":"/todos/revise-deploy-process/","relPath":"/todos/revise-deploy-process/","title":"Revise Deploy Process","summary":"","image":"","tags":["Deploy"],"order":{"default":0},"authors":["ramil"],"wordCount":38,"date_published":"2026-04-13T00:00:00-00:00","updated":"2026-04-17T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/revise-deploy-process\">Revise Deploy Process</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Revise <span>Deploy Process</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-04-13\" itemprop=\"datePublished\">April 13</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-04-17\" itemprop=\"dateModified\">April 17</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Review the current deployment setup and improve it where needed.</p> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Deploy</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Improve the deploy process</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/add-test-run-to-ci/","url":"/todos/add-test-run-to-ci/","relPath":"/todos/add-test-run-to-ci/","title":"Add test run to CI","summary":"","image":"","tags":["Testing","CI"],"order":{"default":0},"authors":["ramil"],"wordCount":67,"date_published":"2026-04-06T00:00:00-00:00","updated":"2026-04-17T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/add-test-run-to-ci\">Add Test Run To Ci</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Add <span>test run to CI</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-04-06\" itemprop=\"datePublished\">April 6</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-04-17\" itemprop=\"dateModified\">April 17</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p><code>pnpm test:ci</code> (<code>vitest run</code>) is set up and passing locally. Add it to <code>.github/workflows/ci.yml</code> before the build step so failures are caught early.</p> <h2 id=\"change\">Change</h2> <p>In <code>.github/workflows/ci.yml</code>, add after <code>pnpm check</code>:</p> <pre><code>- run: pnpm test:ci</code></pre> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">CI</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Tests run on every push</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/cleanup-magazine-components/","url":"/todos/cleanup-magazine-components/","relPath":"/todos/cleanup-magazine-components/","title":"Cleanup Magazine components","summary":"","image":"","tags":["Content","Daler"],"order":{"default":0},"authors":["ramil"],"wordCount":35,"date_published":"2026-02-28T00:00:00-00:00","updated":"2026-05-05T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/cleanup-magazine-components\">Cleanup Magazine Components</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Cleanup Magazine components<!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-28\" itemprop=\"datePublished\">February 28</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-05-05\" itemprop=\"dateModified\">May 5</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><h2 id=\"tasks\">Tasks</h2> <ul><li>TBD</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Cleanup Magazine components</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Remove all components created specifically for magazine</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/reports/audit-meta-refactoring/","url":"/reports/audit-meta-refactoring/","relPath":"/reports/audit-meta-refactoring/","title":"Audit: Meta Refactoring","summary":"","image":"","tags":["Audit","SEO"],"order":{"default":0},"authors":["ramil"],"excluded":true,"wordCount":798,"date_published":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/reports\">Reports</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/reports/audit-meta-refactoring\">Audit Meta Refactoring</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Audit: <span>Meta Refactoring</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Comprehensive audit of the Meta.svelte self-resolving refactoring, performed\n    by 8 specialized agents in parallel.</p> <h2 id=\"summary\">Executive Summary</h2> <p>The refactoring successfully makes <code>Meta.svelte</code> self-resolve\n    title, description, and new SEO tags from <code>PageMeta</code> exports via\n    synchronous <code>import.meta.glob</code>. The build succeeds and meta tags render\n    correctly in both dev and production. However, the refactoring is\n    incomplete: 66 page files still pass a <code>meta</code> prop to <code>&lt;Publication></code> that no longer accepts it, and <code>CLAUDE.md</code> still documents the old API.</p> <h2 id=\"critical\">Critical Issues</h2> <h3>1. Orphaned meta prop on 66 Publication calls</h3> <p><code>Publication.svelte</code> no longer accepts a <code>meta</code> prop, but 66 page files still pass <code>meta={{ title, description }}</code>. Svelte\n    silently ignores unknown props at runtime, so there is no error, but this is\n    dead code that creates API confusion.</p> <aside><p>Fix: Remove <code>meta={{...}}</code> from all 66 page\n      files. This is a mechanical bulk change.</p></aside> <h3>2. CLAUDE.md shows outdated Publication API</h3> <p>Lines 82-90 of <code>CLAUDE.md</code> show the old pattern with <code>meta={{ title, description }}</code> on <code>&lt;Publication></code>. This no longer works since Publication\n    dropped the prop.</p> <aside><p>Fix: Update the todo page template in <code>CLAUDE.md</code> to remove the <code>meta</code> prop from <code>&lt;Publication></code>.</p></aside> <h3>3. Unused SharePostLink import in PublicationHead.svelte</h3> <p><code>PublicationHead.svelte</code> line 6 imports <code>SharePostLink</code> from <code>$lib</code> but never uses it. This was likely left over from a previous version.</p> <aside><p>Fix: Change <code>import { SharePostLink, Meta } from '$lib'</code> to <code>import { Meta } from '$lib'</code>.</p></aside> <h2 id=\"maintainability\">Maintainability Concerns</h2> <h3>Pages map built 3 times</h3> <p>The same <code>import.meta.glob('/**/+page.svelte', { import: 'meta', eager: true\n      })</code> pattern is duplicated in 3 files:</p> <ul><li><code>Meta.svelte</code> (for head tag resolution)</li> <li><code>Articles.svelte</code> (for article listings)</li> <li><code>pages.remote.js</code> (for server-side metadata)</li></ul> <p>Each builds a nearly identical pages map with the same <code>pathToPublicURL</code> + filter + cover-strip logic. If the glob pattern or mapping logic needs to\n    change, all 3 must be updated.</p> <aside><p>Recommendation: Consider extracting into a shared <code>getPagesMeta()</code> utility. However, since <code>import.meta.glob</code> is a Vite compile-time transform, extracting it to a function that returns\n      the glob result may not be straightforward. Worth investigating.</p></aside> <h3>getCoverUrl duplicated</h3> <p>The <code>getCoverUrl(cover)</code> helper exists in both <code>Meta.svelte</code> and <code>page-renderer.svelte.js</code> with identical logic.</p> <aside><p>Recommendation: Extract to <code>url-utils.js</code>.</p></aside> <h3>Magic numbers for OG image dimensions</h3> <p><code>Meta.svelte</code> hardcodes <code>1200</code> and <code>630</code> for OG image width and height. These are standard Open Graph sizes but would\n    be clearer as named constants.</p> <h2 id=\"consistency\">Consistency Audit</h2> <h3>Glob pattern: Consistent</h3> <p>All 3 files use the same glob pattern, <code>pathToPublicURL</code> prefix ( <code>'/src/routes/'</code>), and cover-stripping destructure. The pattern\n    matches the established convention in <code>Articles.svelte</code>.</p> <h3>Indentation: Mixed</h3> <p>Some files use tabs (newer todo pages), others use spaces (older pages, lib\n    components). This is a pre-existing inconsistency not introduced by this\n    refactoring.</p> <h3>Title variations: By design</h3> <p>Some pages have different titles in <code>PageMeta.title</code> vs the\n    former Publication <code>meta.title</code> (e.g., \"Sync editor settings\" vs \"Sync Biome, Zed and VS Code settings\").\n    Since Meta now resolves from <code>PageMeta.title</code>, the shorter title will appear in <code>&lt;title></code>. This may or may not be desired.</p> <h2 id=\"dead-code\">Dead Code</h2> <ul><li>SharePostLink import in <code>PublicationHead.svelte</code> —\n      imported but unused</li> <li>66 <code>meta={{...}}</code> props on Publication\n      calls — passed but ignored</li> <li>YandexMetricsEventShareLink in <code>SharePostLink.svelte</code> — defined but never called (pre-existing)</li></ul> <h2 id=\"ai-artifacts\">AI Artifacts</h2> <p>Overly verbose JSDoc comments exist in several files (notably <code>Articles.svelte</code> with a 40-line file-level comment block). These are pre-existing and not\n    introduced by this refactoring. The new code in <code>Meta.svelte</code> has\n    appropriate-level documentation.</p> <h2 id=\"tests\">Test Coverage</h2> <p>No tests exist. Vitest 4.0.18 is installed as a devDependency but no test\n    script, config, or test files exist. Key functions that should be tested:</p> <ul><li><code>pathToPublicURL</code> — core routing logic, pure function, easy to test</li> <li><code>getCoverUrl</code> — image URL extraction, pure function</li> <li><code>escape_html</code>, <code>pathEncode</code>, <code>pathDecode</code> — security-critical utilities</li></ul> <h2 id=\"documentation\">Documentation</h2> <ul><li>CLAUDE.md: Outdated — still shows <code>meta</code> prop on\n      Publication</li> <li>MEMORY.md: Accurate — correctly documents the synchronous glob\n      approach and that <code>&lt;svelte:head></code> cannot use async</li> <li>Meta.svelte JSDoc: Accurate — Props typedef correctly shows all\n      fields as optional</li> <li>Publication.svelte JSDoc: Accurate — no <code>meta</code> prop\n      documented</li></ul> <h2 id=\"fine\">What's Fine As-Is</h2> <ul><li>The synchronous glob approach correctly avoids the <code>&lt;svelte:head></code> async limitation</li> <li>Prop fallback chain (<code>pageMeta → prop → default</code>)\n      works correctly</li> <li>New SEO tags (canonical, robots, og:locale, keywords) are correctly\n      conditional</li> <li>Error page correctly falls back to props ( <code>title={page.status}</code>)</li> <li>Build succeeds and produces correct static HTML with all meta tags</li> <li>Cover stripping is consistent with <code>pages.remote.js</code></li> <li>Description field was correctly added to all 68 page meta exports</li></ul> <h2 id=\"action-items\">Action Items</h2> <h3>Must fix</h3> <ol><li>Remove unused <code>SharePostLink</code> import from <code>PublicationHead.svelte</code></li> <li>Update <code>CLAUDE.md</code> todo page template to remove <code>meta</code> prop from Publication</li> <li>Remove orphaned <code>meta={{...}}</code> prop from\n      all 66 page files</li></ol> <h3>Should fix</h3> <ol><li>Extract <code>getCoverUrl</code> to shared utility</li> <li>Review title differences between PageMeta and old Publication meta</li></ol> <h3>Nice to have</h3> <ol><li>Extract OG image dimensions as named constants</li> <li>Investigate consolidating the 3x glob pattern</li> <li>Set up test infrastructure and add tests for <code>pathToPublicURL</code></li></ol> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Audit Complete</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">8-agent parallel audit of the Meta refactoring</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/add-feed-link-tags/","url":"/todos/add-feed-link-tags/","relPath":"/todos/add-feed-link-tags/","title":"Add feed link tags to layout","summary":"","image":"","tags":["Features"],"order":{"default":0},"authors":["ramil"],"wordCount":104,"date_published":"2026-02-09T00:00:00-00:00","updated":"2026-05-04T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/add-feed-link-tags\">Add Feed Link Tags</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Add feed link tags <span>to layout</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-05-04\" itemprop=\"dateModified\">May 4</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>The feed link tags in <code>+layout.svelte</code> were commented out during\n    initial setup and never restored. Without <code>&lt;link rel=\"alternate\"></code> tags, feed readers and browsers cannot auto-discover the site's JSON and XML\n    feeds.</p> <h2 id=\"current-state\">Current State</h2> <ul><li><code>feed.json</code> and <code>feed.xml</code> routes are restored and working</li> <li><code>+layout.svelte</code> has no <code>&lt;link rel=\"alternate\"></code> tags pointing to either feed</li></ul> <h2 id=\"tasks\">Tasks</h2> <ul><li>Add <code>&lt;link rel=\"alternate\" type=\"application/feed+json\" href=\"/feed.json\"></code> to <code>&lt;svelte:head></code> in <code>+layout.svelte</code></li> <li>Add <code>&lt;link rel=\"alternate\" type=\"application/atom+xml\" href=\"/feed.xml\"></code> to <code>&lt;svelte:head></code> in <code>+layout.svelte</code></li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Feed discovery</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Discoverable RSS and JSON feeds</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/add-fields-to-page-meta/","url":"/todos/add-fields-to-page-meta/","relPath":"/todos/add-fields-to-page-meta/","title":"Add Fields to PageMeta","summary":"","image":"","tags":["Types"],"order":{"default":0},"authors":["ramil"],"wordCount":220,"date_published":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/add-fields-to-page-meta\">Add Fields To Page Meta</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Add Fields to <span>PageMeta</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>The <code>PageMeta</code> interface in <code>app.d.ts</code> defines the\n    metadata structure for all pages. It currently supports title, date,\n    authors, tags, sort order, cover image, and todo state. This task is about\n    extending it with additional fields to support richer page metadata.</p> <h2 id=\"current-fields\">Current Fields</h2> <ul><li><code>title</code> — page title (required)</li> <li><code>menuTitle</code> — alternative title for navigation menus</li> <li><code>date</code> — publication date in DD-MM-YYYY format</li> <li><code>updated</code> — last updated date</li> <li><code>authors</code> — author tags or full Author objects</li> <li><code>tags</code> — content tags</li> <li><code>sortOrder</code> — numeric sort order for listings</li> <li><code>cover</code> — cover image</li> <li><code>state</code> — todo state (done, new, in_progress)</li></ul> <h2 id=\"candidates\">Candidate Fields</h2> <ul><li><code>description</code> — SEO meta description, currently only passed to Publication</li> <li><code>draft</code> — boolean to mark unpublished pages</li> <li><code>featured</code> — boolean or number for featured/pinned content</li> <li><code>readingTime</code> — estimated reading time override</li> <li><code>canonical</code> — canonical URL for cross-posted content</li> <li><code>noindex</code> — exclude page from search engines</li> <li><code>lang</code> — page language if different from site default</li> <li><code>category</code> — broader content category beyond tags</li></ul> <h2 id=\"tasks\">Tasks</h2> <ul><li>Decide which fields to add to <code>PageMeta</code></li> <li>Update the interface in <code>app.d.ts</code></li> <li>Update components that consume <code>PageMeta</code> to use new fields</li> <li>Update existing pages if needed</li> <li>Verify type checking passes with <code>pnpm check</code></li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Page metadata</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Richer metadata for pages</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/add-footer-links/","url":"/todos/add-footer-links/","relPath":"/todos/add-footer-links/","title":"Add links to footer","summary":"","image":"","tags":["UI"],"order":{"default":0},"authors":["ramil"],"wordCount":60,"date_published":"2026-02-09T00:00:00-00:00","updated":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/add-footer-links\">Add Footer Links</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Add links to <span>footer</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-02-09\" itemprop=\"dateModified\">February 9</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Add links to the glossary page and the sitemap into the footer for better\n    site navigation.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Add a glossary link to the footer</li> <li>Add a sitemap link to the footer</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Footer Links</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Improve footer navigation</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/add-glossary-page/","url":"/todos/add-glossary-page/","relPath":"/todos/add-glossary-page/","title":"Add glossary page","summary":"","image":"","tags":["Content"],"order":{"default":0},"authors":["ramil"],"wordCount":71,"date_published":"2026-02-09T00:00:00-00:00","updated":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/add-glossary-page\">Add Glossary Page</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Add <span>glossary page</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-02-09\" itemprop=\"dateModified\">February 9</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a glossary page that defines key terms and concepts used across the\n    project.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Create a new route for the glossary page</li> <li>Define glossary data structure (term, definition, related links)</li> <li>Add alphabetical navigation or search/filter</li> <li>Link glossary terms from other pages where relevant</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Glossary</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Project terminology reference</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/add-tests/","url":"/todos/add-tests/","relPath":"/todos/add-tests/","title":"Add tests and CI integration","summary":"","image":"","tags":["Testing","CI"],"order":{"default":20260209},"authors":["ramil"],"featured":true,"wordCount":184,"date_published":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/add-tests\">Add Tests</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Add <span>tests and CI integration</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Vitest is already installed (<code>^4.0.18</code>) but has no configuration,\n    no test scripts, and no test files. This is the umbrella task, split into 4\n    sub-tasks that should be done in order.</p> <h2 id=\"sub-tasks\">Sub-tasks</h2> <ol><li><a href=\"/todos/setup-testing-environment/\">Set up testing environment and CI</a> -- vitest config, scripts, CI pipeline step</li> <li><a href=\"/todos/unit-tests-utilities/\">Unit tests for utility functions</a> -- escape.js, url-utils.js, scroll-to.js</li> <li><a href=\"/todos/unit-tests-endpoints/\">Unit tests for endpoints and renderer</a> -- sitemap, feed, page-renderer</li> <li><a href=\"/todos/component-tests/\">Component tests</a> -- Svelte component rendering with @testing-library/svelte</li></ol> <h2 id=\"order\">Execution order</h2> <p>Task 1 (environment setup) must be done first. Tasks 2 and 3 can be done in\n    parallel after that. Task 4 (component tests) depends on task 1 and may\n    require additional dependencies (<code>@testing-library/svelte</code>).</p> <h2 id=\"e2e\">E2E tests (future consideration)</h2> <p>Playwright for full browser testing. Lower priority since this is a static\n    site, but useful for interactive components.</p> <ul><li>Homepage loads and renders</li> <li>Navigation works (links, breadcrumbs)</li> <li>Todo listing page shows all todos</li> <li>Individual todo pages render content</li> <li>Interactive components: Clock, Timer, Snake game, Pinball</li> <li>Accordion expand/collapse</li> <li>Smooth scroll behavior</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Test coverage</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Ship with confidence</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/cleanup-page-meta/","url":"/todos/cleanup-page-meta/","relPath":"/todos/cleanup-page-meta/","title":"Cleanup PageMeta","summary":"","image":"","tags":["Types"],"order":{"default":20260209},"authors":["ramil"],"wordCount":188,"date_published":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/cleanup-page-meta\">Cleanup Page Meta</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Cleanup <span>PageMeta</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>After adding new fields to <code>PageMeta</code>, several inconsistencies\n    remain between the interface, its consumers, and the runtime data flow. This\n    task addresses duplication, missing type connections, and stale patterns.</p> <h2 id=\"issues\">Issues</h2> <ul><li><code>description</code> is defined in <code>PageMeta</code> but not wired through — pages still\n      duplicate it in the <code>Publication</code> meta prop</li> <li><code>page-renderer.svelte.js</code> reads <code>pageMetadata</code> as untyped <code>Record&lt;string, unknown></code> — should use <code>PageMeta</code></li> <li><code>FeedItem</code> in <code>app.d.ts</code> duplicates fields from <code>PageMeta</code> (tags, authors, cover) with slightly different types</li> <li><code>Publication.svelte</code> MetaConfig typedef duplicates fields that could come from <code>PageMeta</code></li> <li><code>PageModule</code> interface (title, menuTitle) overlaps with <code>PageMeta</code> — consider removing it</li> <li>The <code>cover</code> field is typed as <code>unknown</code> in <code>PageMeta</code> but has a specific shape in <code>FeedItem</code></li></ul> <h2 id=\"tasks\">Tasks</h2> <ul><li>Wire <code>PageMeta.description</code> through Publication so pages don't\n      need to pass it twice</li> <li>Type <code>pageMetadata</code> in <code>page-renderer.svelte.js</code> as <code>PageMeta</code></li> <li>Align <code>FeedItem</code> cover type with <code>PageMeta</code> cover\n      type</li> <li>Consider deriving <code>FeedItem</code> fields from <code>PageMeta</code> using <code>Pick</code></li> <li>Remove <code>PageModule</code> if fully superseded by <code>PageMeta</code></li> <li>Add a shared cover image type to replace <code>unknown</code></li> <li>Verify with <code>pnpm check</code></li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Type hygiene</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Consistent metadata types</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/component-tests/","url":"/todos/component-tests/","relPath":"/todos/component-tests/","title":"Component tests","summary":"","image":"","tags":["Testing"],"order":{"default":20260206},"authors":["ramil"],"wordCount":295,"date_published":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/component-tests\">Component Tests</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Component <span>tests</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Svelte 5 component tests to verify rendering output and behavior. Uses <code>@testing-library/svelte</code> for DOM-based tests or Svelte's <code>render</code> from <code>svelte/server</code> for SSR snapshot tests.</p> <p>Part of <a href=\"/todos/add-tests/\">Add tests and CI integration</a> (sub-task 4 of 4). Requires <a href=\"/todos/setup-testing-environment/\">testing environment setup</a> first.</p> <h2 id=\"setup\">Additional setup</h2> <ul><li>Install <code>@testing-library/svelte</code> (check Svelte 5\n      compatibility)</li> <li>Install <code>jsdom</code> or <code>happy-dom</code> for DOM environment</li> <li>Configure <code>$app/*</code> mocks (stores, navigation, paths,\n      environment)</li></ul> <h2 id=\"priority\">Priority components</h2> <h3><code>Meta.svelte</code></h3> <ul><li>Renders correct <code>&lt;meta></code> tags for title, description</li> <li>Renders <code>og:image</code>, <code>og:title</code>, <code>og:description</code></li> <li>Handles missing optional props</li></ul> <h3><code>TodoCover.svelte</code></h3> <ul><li>Renders different visual states: <code>new</code>, <code>done</code>, <code>in_progress</code></li></ul> <h3><code>PublicationDate.svelte</code></h3> <ul><li>Formats <code>DD-MM-YYYY</code> dates correctly for display</li> <li>Handles <code>updated</code> date</li></ul> <h3><code>ReadingTime.svelte</code></h3> <ul><li>Calculates and displays reading time from word count</li></ul> <h3><code>Accordion.svelte</code></h3> <ul><li>Renders collapsed by default</li> <li>Expands on click/interaction</li> <li>Shows/hides content</li></ul> <h3><code>AnchorHeading.svelte</code></h3> <ul><li>Renders heading element with anchor link</li> <li>Correct <code>id</code> attribute</li></ul> <h2 id=\"nav\">Navigation components</h2> <h3><code>NavAnchor.svelte</code></h3> <ul><li>Renders anchor with correct <code>id</code> and <code>name</code></li></ul> <h3><code>Breadcrumbs.svelte</code></h3> <ul><li>Generates correct breadcrumb trail from URL path</li> <li>Links are correct for each level</li></ul> <h3><code>Nav.svelte</code></h3> <ul><li>Renders navigation items</li> <li>Active state for current page</li></ul> <h2 id=\"content\">Content components</h2> <h3><code>Articles.svelte</code></h3> <ul><li>Renders article list from feed items</li> <li>Handles empty list</li> <li>Correct links and titles</li></ul> <h3><code>PostPreview.svelte</code></h3> <ul><li>Renders preview card with title, summary, date</li> <li>Cover image rendering</li></ul> <h3><code>LinkBlock.svelte</code></h3> <ul><li>Renders link with correct <code>href</code></li></ul> <h3><code>CallToAction.svelte</code></h3> <ul><li>Renders CTA with title and description</li></ul> <h3><code>SharePostLink.svelte</code></h3> <ul><li>Generates correct share URL</li></ul> <h3><code>ReadNext.svelte</code></h3> <ul><li>Renders next post suggestion with title and link</li> <li>Handles missing post gracefully</li></ul> <h3><code>Publication.svelte</code></h3> <ul><li>Full wrapper: renders meta, heading, content, CTA</li> <li>Passes props through to child components</li></ul> <h2 id=\"notes\">Notes</h2> <ul><li>Components using <code>$app/stores</code> (page, navigating) need mocked\n      stores</li> <li>Components using <code>$app/paths</code> (base, assets) need path mocks</li> <li>Some components may use Svelte 5 runes (<code>$state</code>, <code>$derived</code>) -- check testing-library compatibility</li> <li>SSR render tests (<code>svelte/server</code>) are simpler but only verify\n      HTML output, not interactivity</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Component tests</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">UI correctness</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/deduplicate-utility-functions/","url":"/todos/deduplicate-utility-functions/","relPath":"/todos/deduplicate-utility-functions/","title":"Deduplicate utility functions","summary":"","image":"","tags":["Cleanup"],"order":{"default":0},"authors":["ramil"],"wordCount":70,"date_published":"2026-02-09T00:00:00-00:00","updated":"2026-05-04T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/deduplicate-utility-functions\">Deduplicate Utility Functions</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Deduplicate <span>utility functions</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-05-04\" itemprop=\"dateModified\">May 4</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Several pieces of logic are duplicated across the codebase and should be\n    extracted into shared utilities.</p> <h2 id=\"duplicates\">Duplicated Logic</h2> <ul><li><del><strong>Date parsing (DD-MM-YYYY)</strong> - duplicated in <code>PublicationDate.svelte</code> and <code>page-renderer.svelte.js</code></del> — extracted to <code>date-utils.js</code></li> <li><del><strong>getCoverUrl()</strong> - identical implementation in <code>Meta.svelte</code> and <code>page-renderer.svelte.js</code></del> — deduplicated to <code>url-utils.js</code></li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">DRY code</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Less duplication</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/enable-remote-functions/","url":"/todos/enable-remote-functions/","relPath":"/todos/enable-remote-functions/","title":"Enable remote functions","summary":"","image":"","tags":["Build"],"order":{"default":0},"authors":["ramil"],"wordCount":97,"date_published":"2026-02-09T00:00:00-00:00","updated":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/enable-remote-functions\">Enable Remote Functions</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Enable <span>remote functions</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-02-09\" itemprop=\"dateModified\">February 9</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Enable <a href=\"https://svelte.dev/docs/kit/remote-functions\">SvelteKit remote functions</a> to allow <code>.remote.ts</code> files with <code>query</code>, <code>prerender</code>,<code>command</code>, and <code>form</code> functions.</p> <h2 id=\"changes\">Changes to svelte.config.js</h2> <pre><code>export default {\n  kit: {\n    experimental: {\n      remoteFunctions: true\n    }\n  },\n  compilerOptions: {\n    experimental: {\n      async: true\n    }\n  }\n}</code></pre> <h2 id=\"docs\">Docs</h2> <ul><li><a href=\"https://svelte.dev/docs/kit/remote-functions\">Remote functions</a></li> <li><a href=\"https://svelte.dev/docs/kit/$app-server\">$app/server</a></li></ul> <h2 id=\"notes\">Notes</h2> <ul><li>Feature is experimental, APIs may change</li> <li><code>async: true</code> compiler option enables <code>await</code> in component templates</li> <li>Prerequisite for the <a href=\"/todos/create-pages-metadata-module\">pages metadata remote function</a> and <a href=\"/todos/use-remote-function-to-read-next\">ReadNext remote function</a> tasks</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Remote functions</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Server-side type safety</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/extract-hardcoded-config-values/","url":"/todos/extract-hardcoded-config-values/","relPath":"/todos/extract-hardcoded-config-values/","title":"Extract hardcoded config values","summary":"","image":"","tags":["Cleanup"],"order":{"default":20260209},"authors":["ramil"],"wordCount":64,"date_published":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/extract-hardcoded-config-values\">Extract Hardcoded Config Values</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Extract <span>hardcoded config values</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Several values are hardcoded in components that should be extracted into a\n    config or environment variables for portability.</p> <h2 id=\"values\">Hardcoded Values</h2> <ul><li>Yandex Metrics ID <code>34795480</code> in <code>CallToAction.svelte</code> and <code>SharePostLink.svelte</code></li> <li>Base URL <code>https://sveleton.ramilkarimov.me</code> in <code>Img.svelte</code></li> <li>Unused function <code>YandexMetricsEventShareLink()</code> in <code>SharePostLink.svelte</code> (dead code)</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Config cleanup</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Portable configuration</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/finish-svelte5-migration/","url":"/todos/finish-svelte5-migration/","relPath":"/todos/finish-svelte5-migration/","title":"Finish Svelte 5 migration","summary":"","image":"","tags":["Cleanup"],"order":{"default":20260209},"authors":["ramil"],"wordCount":81,"date_published":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/finish-svelte5-migration\">Finish Svelte5 Migration</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Finish <span>Svelte 5 migration</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Some components still use the legacy <code>export let</code> pattern instead\n    of the Svelte 5 <code>$props()</code> rune.</p> <h2 id=\"components\">Components to Migrate</h2> <ul><li><code>src/lib/Accordion.svelte</code>- uses <code>export let</code></li> <li><code>src/lib/AnchorHeading.svelte</code> - uses <code>export let</code></li> <li><code>src/lib/PublicationAuthors.svelte</code> - uses <code>export let</code> (3 props)</li> <li><code>src/lib/Fun/Timer.svelte</code>- uses <code>export let</code></li></ul> <h2 id=\"deprecated\">Deprecated Imports</h2> <ul><li><del><code>src/routes/+error.svelte</code> - uses <code>$app/stores</code> instead of <code>$app/state</code></del> — migrated</li> <li><code>src/routes/Header.svelte</code> - uses <code>$app/stores</code> instead of <code>$app/state</code></li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Svelte 5</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Consistent runes usage</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/fix-breadcrumbs-layout/","url":"/todos/fix-breadcrumbs-layout/","relPath":"/todos/fix-breadcrumbs-layout/","title":"Fix breadcrumbs layout","summary":"","image":"","tags":["Layout"],"order":{"default":0},"authors":["ramil"],"wordCount":35,"date_published":"2026-02-09T00:00:00-00:00","updated":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/fix-breadcrumbs-layout\">Fix Breadcrumbs Layout</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Fix breadcrumbs <span>layout</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-02-09\" itemprop=\"dateModified\">February 9</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Fix layout issues with the breadcrumbs component.</p> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Breadcrumbs fix</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Fix breadcrumbs layout</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/fix-ci-type-errors/","url":"/todos/fix-ci-type-errors/","relPath":"/todos/fix-ci-type-errors/","title":"Fix CI type errors and lint errors","summary":"","image":"","tags":["Cleanup"],"order":{"default":20260209},"authors":["ramil"],"wordCount":79,"date_published":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/fix-ci-type-errors\">Fix Ci Type Errors</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Fix CI <span>type errors and lint errors</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Both <code>pnpm check</code> and <code>pnpm lint</code> are currently\n    failing, which means CI is broken.</p> <h2 id=\"type-errors\">Type Errors</h2> <ul><li><del><code>excluded</code> and <code>featured</code> properties missing from <code>PageMeta</code> interface in <code>src/app.d.ts</code></del> — added</li> <li><del><code>excluded</code> missing from <code>FeedItem</code> interface</del> — added</li> <li><code>cover</code> variable used before declaration in ~30 todo pages</li></ul> <h2 id=\"lint-errors\">Lint Errors</h2> <ul><li><code>useExportType</code> issues across todo pages</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Fix CI</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Green builds again</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/fix-naming-inconsistencies/","url":"/todos/fix-naming-inconsistencies/","relPath":"/todos/fix-naming-inconsistencies/","title":"Fix naming inconsistencies","summary":"","image":"","tags":["Cleanup"],"order":{"default":20260209},"authors":["ramil"],"wordCount":76,"date_published":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/fix-naming-inconsistencies\">Fix Naming Inconsistencies</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Fix <span>naming inconsistencies</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Several naming inconsistencies across the codebase.</p> <h2 id=\"files\">File Names</h2> <ul><li><code>src/lib/Fun/pinball.svelte</code> - should be PascalCase ( <code>Pinball.svelte</code>)</li> <li><code>src/lib/svg-icons/LinkedIn.svelte</code> - should follow <code>*Icon.svelte</code> convention</li></ul> <h2 id=\"props\">Prop Names</h2> <p>Some components use snake_case props instead of camelCase:</p> <ul><li><code>CallToAction.svelte</code> - <code>button_text</code>, <code>button_link</code></li> <li><code>CallToAction-black.svelte</code> - <code>button_text</code>, <code>button_link</code></li> <li><code>PostPreview.svelte</code> - <code>post_title</code>, <code>post_link</code>, <code>cover_src</code>, etc.</li></ul> <h2 id=\"css-typo\">CSS Typo</h2> <ul><li><code>CallToAction-black.svelte:23</code> - CSS class <code>desctiption</code> should be <code>description</code></li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Consistency</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Uniform naming</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/investigate-installhook-404/","url":"/todos/investigate-installhook-404/","relPath":"/todos/investigate-installhook-404/","title":"Investigate installHook.js.map 404","summary":"","image":"","tags":["Cleanup"],"order":{"default":20260209},"authors":["ramil"],"wordCount":106,"date_published":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/investigate-installhook-404\">Investigate Installhook 404</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Investigate <span>installHook.js.map 404</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Dev server logs show: <br/> <code>[404] GET /todos/add-fields-to-page-meta/installHook.js.map</code></p> <p>This is likely a browser extension (React DevTools, Vue DevTools, etc.)\n    injecting <code>installHook.js</code> into the page and then requesting its source map relative to the current\n    page URL. Need to confirm the source and decide whether to suppress or fix.</p> <h2 id=\"investigate\">Things to Check</h2> <ul><li>Does it reproduce with all browser extensions disabled?</li> <li>Which extension injects <code>installHook.js</code>?</li> <li>Does it happen on all todo pages or only this one?</li> <li>Is it harmless noise or does it affect the build/SSG output?</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Debug</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Fix 404 request</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/move-meta-to-root-layout/","url":"/todos/move-meta-to-root-layout/","relPath":"/todos/move-meta-to-root-layout/","title":"Move Meta tag into root layout","summary":"","image":"","tags":["Architecture"],"order":{"default":0},"authors":["ramil"],"wordCount":244,"date_published":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/move-meta-to-root-layout\">Move Meta To Root Layout</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Move Meta tag <span>into root layout</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Currently <code>Meta.svelte</code> is imported and rendered manually in\n    individual pages, listing pages, and inside <code>PublicationHead.svelte</code>. Since Meta already self-resolves\n    title/description/tags from PageMeta via the current URL pathname, it can\n    live in the root layout and work for every page automatically.</p> <h2 id=\"current\">Current usage</h2> <p>Meta is imported and used in these places:</p> <ul><li><code>+page.svelte</code> -- homepage</li> <li><code>+error.svelte</code> -- error page</li> <li><code>todos/+page.svelte</code> -- todos listing</li> <li><code>features/+page.svelte</code> -- features listing</li> <li><code>PublicationHead.svelte</code> -- all publications</li> <li>Several standalone todo pages</li></ul> <h2 id=\"goal\">Goal</h2> <p>Add <code>&lt;Meta /></code> to <code>src/routes/+layout.svelte</code> with no props. It will auto-resolve from PageMeta for every page. Then\n    remove all the individual <code>&lt;Meta></code> usages.</p> <h2 id=\"steps\">Steps</h2> <ol><li>Add Meta to <code>+layout.svelte</code></li> <li>Remove Meta from <code>PublicationHead</code></li> <li>Remove Meta from homepage, todos, features</li> <li>Remove Meta from standalone todo pages</li> <li>Handle the error page -- it uses explicit props since error pages don't\n      have PageMeta. Keep Meta there as a fallback, or add error-specific logic\n      to layout Meta.</li> <li>Verify all pages still have correct meta tags</li></ol> <h2 id=\"edge-cases\">Edge cases</h2> <ul><li>Error page: passes explicit title/description props. Meta falls back to\n      props when PageMeta is not found, so it could stay in both error page and\n      layout. Check for duplicate title tags.</li> <li>Homepage: passes explicit props. Verify PageMeta has the correct\n      title/description.</li> <li>Duplicate canonical: root layout already renders canonical link. Meta also\n      renders one when pageMeta.canonical is set. Avoid conflicts.</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Centralized meta</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">One place, every page</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/organize-distribution-options/","url":"/todos/organize-distribution-options/","relPath":"/todos/organize-distribution-options/","title":"Organize Distribution Options","summary":"","image":"","tags":["Infrastructure"],"order":{"default":20260209},"authors":["ramil"],"wordCount":136,"date_published":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/organize-distribution-options\">Organize Distribution Options</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Organize <span>Distribution Options</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Explore and set up distribution options so the project can be shipped as a\n    static bundle, Docker image, or deployed to edge functions depending on the\n    target environment.</p> <h2 id=\"options\">Options to evaluate</h2> <ul><li><strong>Static build</strong> — current default via <code>@sveltejs/adapter-static</code>, outputs to <code>build/</code></li> <li><strong>Docker</strong> — containerized build for self-hosting (Nginx/Caddy serving static files,\n      or Node server)</li> <li><strong>Edge functions</strong> — Cloudflare Pages, Vercel Edge, Netlify Edge</li> <li><strong>Node server</strong> — <code>@sveltejs/adapter-node</code> for traditional server deployment</li></ul> <h2 id=\"tasks\">Tasks</h2> <ul><li>Document current static adapter setup and its limitations</li> <li>Add a Dockerfile for static build serving (Nginx or Caddy)</li> <li>Evaluate edge deployment adapters (Cloudflare, Vercel, Netlify)</li> <li>Consider multi-adapter setup for different deployment targets</li> <li>Add build scripts or profiles for each distribution option</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Deploy anywhere</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Multiple distribution targets</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/organize-releases-process/","url":"/todos/organize-releases-process/","relPath":"/todos/organize-releases-process/","title":"Organize Releases Process","summary":"","image":"","tags":["Infrastructure"],"order":{"default":20260209},"authors":["ramil"],"wordCount":57,"date_published":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/organize-releases-process\">Organize Releases Process</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Organize <span>Releases Process</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Set up a structured release process with versioning, changelogs, and\n    deployment workflow.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Define versioning strategy (semver, date-based, etc.)</li> <li>Set up changelog generation</li> <li>Configure release workflow (GitHub Releases, tags)</li> <li>Document the release process</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Ship with confidence</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Structured release workflow</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/remove-unused-dependencies/","url":"/todos/remove-unused-dependencies/","relPath":"/todos/remove-unused-dependencies/","title":"Remove unused dependencies","summary":"","image":"","tags":["Cleanup"],"order":{"default":20260209},"authors":["ramil"],"wordCount":81,"date_published":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/remove-unused-dependencies\">Remove Unused Dependencies</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Remove <span>unused dependencies</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Several dependencies in <code>package.json</code> are installed but never\n    used in the codebase.</p> <h2 id=\"unused-deps\">Unused Dependencies</h2> <ul><li><code>flowbite</code> (4.0.1) - not imported anywhere</li> <li><code>flowbite-svelte</code> (1.31.0) - not imported anywhere</li> <li><code>fast-glob</code> (3.3.3) - not referenced in codebase</li> <li><code>@sveltejs/adapter-node</code> (5.5.2) - static adapter is used instead</li> <li><code>vitest</code> (4.0.18) - installed but no tests or config exist. <strong>Note:</strong> needed for planned <a href=\"/todos/add-tests/\">testing tasks</a>, do not remove</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Cleanup</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Leaner package.json</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/replace-navanchor-with-anchors/","url":"/todos/replace-navanchor-with-anchors/","relPath":"/todos/replace-navanchor-with-anchors/","title":"Replace NavAnchor with normal anchors","summary":"","image":"","tags":["Architecture"],"order":{"default":0},"authors":["ramil"],"wordCount":274,"date_published":"2026-02-09T00:00:00-00:00","updated":"2026-05-04T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/replace-navanchor-with-anchors\">Replace Navanchor With Anchors</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Replace NavAnchor <span>with normal anchors</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-05-04\" itemprop=\"dateModified\">May 4</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>The <code>NavAnchor</code> component is used throughout publication pages to\n    create section anchors for the sidebar navigation. It could be replaced with\n    plain HTML anchor elements, reducing the component abstraction.</p> <h2 id=\"current\">Current behavior</h2> <p><code>NavAnchor</code> does three things:</p> <ol><li>Renders a <code>&lt;div></code> with an <code>id</code> attribute for\n      anchor linking</li> <li>Registers itself with the sidebar <code>Nav</code> component via <code>addItem()</code>/<code>removeItem()</code> (from <code>Nav.svelte</code>)</li> <li>Tracks its DOM position via <code>use:updateTopPosition</code> action\n      for scroll-spy behavior</li></ol> <p>Usage pattern:</p> <pre><code>&lt;NavAnchor id=\"section-id\" name=\"Section Name\">&lt;/NavAnchor>\n&lt;h2>Section Name&lt;/h2></code></pre> <h2 id=\"goal\">Goal</h2> <p>Replace with plain anchors, e.g.:</p> <pre><code>&lt;h2 id=\"section-id\">Section Name&lt;/h2></code></pre> <h2 id=\"challenge\">Challenge: sidebar navigation</h2> <p>The key complexity is that NavAnchor is not just an anchor -- it registers\n    with the sidebar Nav for table-of-contents generation and scroll-spy.\n    Removing NavAnchor requires an alternative way to:</p> <ul><li>Discover section headings for the sidebar table of contents</li> <li>Track scroll position to highlight the active section</li></ul> <h2 id=\"approaches\">Possible approaches</h2> <h3>Option A: DOM-based heading discovery</h3> <p>Nav component queries the DOM for headings with <code>id</code> attributes\n    (e.g. <code>h2[id]</code>) and builds the TOC automatically. Uses <code>IntersectionObserver</code> for scroll-spy instead of manual position tracking.</p> <h3>Option B: Svelte action on headings</h3> <p>Create a <code>use:navSection</code> action that replaces NavAnchor's\n    registration logic. Headings become <code>&lt;h2 id=\"foo\" use:navSection></code>.</p> <h3>Option C: Keep registration, lose the component</h3> <p>Move the anchor+registration into an action or into the heading elements\n    directly, but still use the <code>addItem</code>/<code>removeItem</code> pattern from Nav.</p> <h2 id=\"scope\">Scope</h2> <p>NavAnchor is used in many pages across the codebase. This is a bulk\n    replacement task.</p> <ul><li>All publication pages (via Publication wrapper pattern)</li> <li>Feature pages</li> <li>Todo pages</li> <li>Standalone pages</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Simpler anchors</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Less abstraction, same result</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/restore-og-image-generation/","url":"/todos/restore-og-image-generation/","relPath":"/todos/restore-og-image-generation/","title":"Restore dynamic OG image generation","summary":"","image":"","tags":["Features"],"order":{"default":20260209},"authors":["ramil"],"wordCount":142,"date_published":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/restore-og-image-generation\">Restore Og Image Generation</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Restore dynamic <span>OG image generation</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>The <code>og/</code> route was disabled during the initial setup. Currently <code>Meta.svelte</code> uses the cover image directly via <code>getCoverUrl()</code> instead of a purpose-built 1200x630 OG image. Social sharing previews are\n    either missing or use an arbitrarily sized cover.</p> <h2 id=\"current-state\">Current State</h2> <ul><li>No <code>src/routes/og/</code> route exists</li> <li><code>Meta.svelte</code> sets <code>og:image</code> to the raw cover image src (<code>getCoverUrl(cover)</code>)</li> <li>OG image meta tags claim 1200x630 PNG but the actual image may be a\n      different size and format</li></ul> <h2 id=\"tasks\">Tasks</h2> <ul><li>Create <code>src/routes/og/[...path]/+server.js</code> route that\n      generates 1200x630 OG images</li> <li>Decide on generation approach (satori, puppeteer, canvas, or static\n      template)</li> <li>Update <code>Meta.svelte</code> to point <code>og:image</code> at the\n      generated OG endpoint instead of the raw cover</li> <li>Ensure OG images are prerendered at build time for static hosting</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">OG images</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Better social sharing</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/setup-testing-environment/","url":"/todos/setup-testing-environment/","relPath":"/todos/setup-testing-environment/","title":"Set up testing environment and CI","summary":"","image":"","tags":["Testing","CI"],"order":{"default":0},"authors":["ramil"],"wordCount":222,"date_published":"2026-02-09T00:00:00-00:00","updated":"2026-05-15T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/setup-testing-environment\">Setup Testing Environment</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Set up <span>testing environment and CI</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-05-15\" itemprop=\"dateModified\">May 15</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Vitest <code>^4.0.18</code> is installed but completely unconfigured. This\n    task sets up the foundation so that subsequent test-writing tasks can just\n    add <code>.test.js</code> files and they work.</p> <p>Part of <a href=\"/todos/add-tests/\">Add tests and CI integration</a> (sub-task 1 of 4).</p> <h2 id=\"vitest-config\">Vitest config</h2> <p>Create <code>vitest.config.js</code> (or extend <code>vite.config.js</code> ):</p> <ul><li>Resolve <code>$lib</code> alias to <code>src/lib</code></li> <li>Resolve <code>$styles</code> alias to <code>src/styles</code></li> <li>Mock or stub <code>$app/*</code> imports (paths, environment, stores,\n      navigation)</li> <li>Set <code>environment: 'node'</code> as default (override per-file for DOM\n      tests)</li> <li>Configure <code>include</code> pattern: <code>src/**/*.test.{js,ts}</code></li></ul> <h2 id=\"scripts\">Package scripts</h2> <p>Add to <code>package.json</code>:</p> <pre><code>\"test\": \"vitest\",\n\"test:ci\": \"vitest run\"</code></pre> <p><code>test</code> runs in watch mode for development. <code>test:ci</code> runs once and exits for CI.</p> <h2 id=\"ci\">CI integration</h2> <p>Update <code>.github/workflows/ci.yml</code> to add test step before build:</p> <pre><code>- run: pnpm install --frozen-lockfile\n- run: pnpm lint\n- run: pnpm check\n- run: pnpm test:ci\n- run: pnpm build</code></pre> <aside><p>Tests run before build for faster feedback on failures.</p></aside> <h2 id=\"smoke-test\">Smoke test</h2> <p>Create one minimal test file (<code>src/lib/__tests__/smoke.test.js</code>)\n    to verify the setup works end-to-end before writing real tests.</p> <h2 id=\"deps\">Dependencies to consider</h2> <ul><li><code>@testing-library/svelte</code> -- for component tests (can be added later in the component tests task)</li> <li><code>jsdom</code> or <code>happy-dom</code> -- for tests that need DOM APIs (scroll-to.js,\n      component tests)</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Testing infra</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Foundation for all tests</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/unit-tests-endpoints/","url":"/todos/unit-tests-endpoints/","relPath":"/todos/unit-tests-endpoints/","title":"Unit tests for endpoints and renderer","summary":"","image":"","tags":["Testing"],"order":{"default":20260207},"authors":["ramil"],"wordCount":377,"date_published":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/unit-tests-endpoints\">Unit Tests Endpoints</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Unit tests for <span>endpoints and renderer</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Tests for server-side logic: sitemap generation helpers, RSS feed sanitizer,\n    and the page renderer. Most of these functions are currently not exported\n    and need to be made testable first.</p> <p>Part of <a href=\"/todos/add-tests/\">Add tests and CI integration</a> (sub-task 3 of 4). Requires <a href=\"/todos/setup-testing-environment/\">testing environment setup</a> first. Can be done in parallel with <a href=\"/todos/unit-tests-utilities/\">utility tests</a>.</p> <h2 id=\"prerequisite\">Prerequisite: export helper functions</h2> <p>Before writing tests, these currently-private functions need to be exported\n    (or extracted into separate testable modules):</p> <ul><li><code>sitemap-appendix.xml/+server.js</code>:<code>getRouteFromPath</code> , <code>calculatePriority</code>,<code>extractSections</code></li> <li><code>feed.xml/+server.js</code>: <code>sanitizeContentForRSS</code></li> <li><code>page-renderer.svelte.js</code>: <code>getCoverUrl</code>, <code>createSvelteKitStateMocks</code>, <code>createRenderContext</code></li></ul> <aside><p>Extracting into separate files (e.g. <code>sitemap-helpers.js</code>, <code>feed-helpers.js</code>) is cleaner than exporting from +server.js\n      files, which have SvelteKit conventions around exports.</p></aside> <h2 id=\"sitemap\">Sitemap helpers</h2> <p>From <code>src/routes/sitemap-appendix.xml/+server.js</code>:</p> <h3><code>getRouteFromPath(filePath)</code></h3> <ul><li>Strips <code>+page.svelte</code> and <code>..</code> prefix</li> <li>Prepends base path</li></ul> <h3><code>calculatePriority(path)</code></h3> <ul><li><code>/</code> (root) returns <code>\"0.9\"</code></li> <li>Each nesting level reduces by 0.1</li> <li>Minimum priority is <code>\"0.1\"</code> (deeply nested paths don't go\n      below)</li> <li>Returns string with one decimal place</li></ul> <h3><code>extractSections(pagePaths)</code></h3> <ul><li>Extracts parent sections from page paths</li> <li>Returns sorted, deduplicated array</li> <li>Each section has trailing slash</li> <li>Handles deeply nested paths (creates all intermediate sections)</li></ul> <h2 id=\"feed\">Feed sanitizer</h2> <p>From <code>src/routes/feed.xml/+server.js</code>:</p> <h3><code>sanitizeContentForRSS(html)</code></h3> <ul><li>Removes <code>onload</code>, <code>onerror</code> and other event handler\n      attributes</li> <li>Removes single-quoted event handlers</li> <li>Removes <code>style</code> attributes (both quote types)</li> <li>Removes <code>javascript:</code> URLs</li> <li>Removes <code>data-*</code> attributes</li> <li>Removes <code>class</code> attributes</li> <li>Removes <code>id</code> attributes</li> <li>Preserves actual content text and tag structure</li> <li>Test with HTML containing all pattern types combined</li></ul> <h2 id=\"renderer\">Page renderer</h2> <p>From <code>src/lib/page-renderer.svelte.js</code>:</p> <h3><code>getCoverUrl(cover)</code></h3> <ul><li>Returns empty string for <code>null</code>/<code>undefined</code>/falsy</li> <li>Returns the string directly if <code>cover</code> is a string</li> <li>Extracts <code>img.src</code> from object form</li> <li>Returns empty string if object has no <code>img.src</code></li></ul> <h3><code>createSvelteKitStateMocks(filePath, pageData)</code></h3> <ul><li>Returns object with <code>url</code>, <code>params</code>, <code>route</code>, <code>data</code>, <code>form</code>, <code>error</code>, <code>status</code></li> <li><code>url</code> is a valid URL object based on filePath</li> <li><code>data.info</code> merges defaults with provided <code>pageData</code></li> <li>Default date is <code>'01-01-2024'</code></li></ul> <h3><code>createRenderContext</code></h3> <ul><li>Returns a Map</li> <li>Has <code>'meta'</code> key with a Store instance</li> <li>Has <code>'__request__'</code> key with page mock</li></ul> <h3>Date formatting in <code>renderBlogPage</code></h3> <ul><li><code>DD-MM-YYYY</code> converts to <code>YYYY-MM-DDT00:00:00-00:00</code></li> <li>Fallback to <code>01-01-2024</code> when no date provided</li></ul> <h3><code>EXCLUDE_PATHS</code> filtering</h3> <ul><li>Pages matching excluded paths return <code>null</code></li> <li>Pages not in the set are rendered normally</li></ul> <aside><p><code>page-renderer.svelte.js</code> imports <code>svelte/server</code> and <code>cheerio</code>. Testing <code>renderBlogPage</code> end-to-end\n      requires Svelte SSR support in the test environment. Testing the helper\n      functions in isolation is simpler.</p></aside> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Endpoint tests</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Server logic correctness</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/unit-tests-utilities/","url":"/todos/unit-tests-utilities/","relPath":"/todos/unit-tests-utilities/","title":"Unit tests for utility functions","summary":"","image":"","tags":["Testing"],"order":{"default":20260208},"authors":["ramil"],"wordCount":291,"date_published":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/unit-tests-utilities\">Unit Tests Utilities</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Unit tests for <span>utility functions</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Pure functions that can be tested directly with minimal or no mocking. These\n    are the easiest tests to write and provide immediate value.</p> <p>Part of <a href=\"/todos/add-tests/\">Add tests and CI integration</a> (sub-task 2 of 4). Requires <a href=\"/todos/setup-testing-environment/\">testing environment setup</a> first.</p> <h2 id=\"escape\"><code>src/lib/escape.js</code></h2> <h3><code>escape_html(value, is_attr)</code></h3> <ul><li>Content mode: escapes <code>&amp;</code> and <code>&lt;</code></li> <li>Attribute mode: escapes <code>&amp;</code>, <code>&lt;</code>, and <code>\"</code></li> <li>Passthrough: strings with no special characters return unchanged</li> <li>Edge cases: <code>null</code>, <code>undefined</code>, numbers, empty\n      string</li> <li>Multiple special characters in one string</li> <li>Special characters at start, middle, and end of string</li></ul> <h3><code>pathEncode(str, maxInputLen)</code></h3> <ul><li>Roundtrip: <code>pathDecode(pathEncode(str)) === str</code> for various\n      inputs</li> <li>URL-safety: output contains no <code>+</code>, <code>/</code>, or <code>=</code> characters</li> <li>Truncation: input longer than <code>maxInputLen</code> gets truncated\n      before encoding</li> <li>Custom <code>maxInputLen</code> parameter</li> <li>Unicode strings (emoji, CJK, diacritics)</li> <li>Empty string</li></ul> <h3><code>pathDecode(str)</code></h3> <ul><li>Decodes valid base64url strings</li> <li>Fallback: returns original string on invalid input (does not throw)</li></ul> <h2 id=\"url-utils\"><code>src/lib/url-utils.js</code></h2> <h3><code>pathToPublicURL(filePath, prefix)</code></h3> <ul><li>Strips <code>+page.svelte</code> suffix</li> <li>Strips route group prefixes like <code>(demo)/</code></li> <li>Default prefix <code>../</code> replaced with <code>/</code></li> <li>Custom prefix parameter</li> <li>Adds trailing slash</li> <li>Nested routes: <code>../blog/post-slug/+page.svelte</code> becomes <code>/blog/post-slug/</code></li></ul> <h2 id=\"scroll-to\"><code>src/lib/scroll-to.js</code></h2> <h3>Easing functions</h3> <p>The easing functions are not exported directly, but can be tested by\n    extracting them or by testing through the module's internal structure.</p> <ul><li><code>easeInOutCubic</code>, <code>easeOutSine</code>, <code>easeInOutSine</code>, <code>easeInOutQuint</code></li> <li>Boundary: <code>f(0) = 0</code> and <code>f(1) = 1</code> for all easing\n      functions</li> <li>Midpoint: <code>f(0.5)</code> is reasonable (between 0 and 1)</li> <li>Monotonicity: output increases as input increases from 0 to 1</li></ul> <aside><p>The easing equations object is not exported. Either export it for testing,\n      or test indirectly. The <code>scrollTo</code> and <code>scrollToY</code> functions need DOM (<code>window</code>,<code>requestAnimationFrame</code> ) so they need jsdom/happy-dom environment.</p></aside> <h3><code>scrollTo(element, speed, easing)</code></h3> <ul><li>Returns early without throwing when <code>element</code> is <code>null</code></li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Utility tests</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Pure functions, easy wins</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/update-meta-component/","url":"/todos/update-meta-component/","relPath":"/todos/update-meta-component/","title":"Update Meta Component","summary":"","image":"","tags":["SEO"],"order":{"default":0},"authors":["ramil"],"wordCount":160,"date_published":"2026-02-09T00:00:00-00:00","updated":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/update-meta-component\">Update Meta Component</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Update <span>Meta Component</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-02-09\" itemprop=\"dateModified\">February 9</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p><code>Meta.svelte</code> now self-resolves title, description, and SEO tags using a synchronous <code>import.meta.glob</code> PageMeta lookup keyed by the current pathname via <code>$app/state</code>.\n    Props are still accepted as fallbacks for pages without <code>PageMeta</code> exports (error page).</p> <aside><p>The original plan used <code>getPages()</code> remote function, but <code>&lt;svelte:head></code> renders synchronously and cannot use <code>await</code>. The synchronous glob achieves the same result.</p></aside> <h2 id=\"what-changed\">What Changed</h2> <h3>Meta.svelte</h3> <p>Builds a pages map via <code>import.meta.glob</code> and resolves <code>pages[page.url.pathname]</code>. Title and description come from <code>PageMeta</code> with prop fallbacks. New tags added:</p> <ul><li><code>&lt;link rel=\"canonical\"></code> from <code>canonical</code></li> <li><code>&lt;meta name=\"robots\"></code> from <code>noindex</code></li> <li><code>&lt;meta property=\"og:locale\"></code> from <code>lang</code></li> <li><code>&lt;meta name=\"keywords\"></code> from <code>tags</code></li></ul> <h3>Publication / PublicationHead</h3> <p><code>meta</code> prop removed from <code>Publication</code> and <code>PublicationHead</code>. <code>&lt;Meta /></code> is now called with\n    no props.</p> <h3>Page meta exports</h3> <p>Added <code>description</code> field to every page's <code>PageMeta</code> export, migrated from the former <code>Publication</code> meta prop.</p> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Zero-prop Meta</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Self-resolving page metadata</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/use-img-component-for-author-avatars/","url":"/todos/use-img-component-for-author-avatars/","relPath":"/todos/use-img-component-for-author-avatars/","title":"Use Img component for author avatars","summary":"","image":"","tags":["Features"],"order":{"default":0},"authors":["ramil"],"wordCount":132,"date_published":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/use-img-component-for-author-avatars\">Use Img Component For Author Avatars</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Use Img component <span>for author avatars</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Author avatars are stored in <code>static/images/authors/</code> and the <code>avatar</code> field is defined in <code>src/lib/authors.js</code>, but <code>PublicationAuthors.svelte</code> doesn't render them yet. Use the common <code>Img</code> component so\n    avatars go through the same image pipeline as everything else (srcset,\n    LQIP).</p> <h2 id=\"current-state\">Current State</h2> <ul><li><code>Author</code> interface in <code>src/app.d.ts</code> has an optional <code>avatar</code> field</li> <li><code>src/lib/authors.js</code> has avatar paths set (e.g. <code>/images/authors/ramil.avif</code>)</li> <li><code>PublicationAuthors.svelte</code> only renders author names, no images</li></ul> <h2 id=\"tasks\">Tasks</h2> <ul><li>Update <code>PublicationAuthors.svelte</code> to render avatar via <code>Img</code> component</li> <li>Look up full author data from <code>authors</code> map using the tag</li> <li>Handle missing avatars gracefully (initials fallback or hide image)</li> <li>Migrate from <code>export let</code> to <code>$props()</code> while at it\n      (Svelte 5)</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Author avatars</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Consistent image handling</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/use-remote-function-to-read-next/","url":"/todos/use-remote-function-to-read-next/","relPath":"/todos/use-remote-function-to-read-next/","title":"Use remote function to ReadNext","summary":"","image":"","tags":["Content"],"order":{"default":0},"authors":["ramil"],"wordCount":141,"date_published":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/use-remote-function-to-read-next\">Use Remote Function To Read Next</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Use remote function <span>to ReadNext</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-09\" itemprop=\"datePublished\">February 9</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>The <code>ReadNext</code> component should suggest related articles based on\n    shared tags, excluding the current article.</p> <h2 id=\"current-state\">Current State</h2> <p>Currently reads from <code>page.data.readNextPosts</code> which is not\n    populated. The component needs to self-resolve suggestions from the feed.</p> <h2 id=\"requirements\">Requirements</h2> <ul><li>Load articles from the feed that share at least one tag with the current\n      article</li> <li>Exclude the current article from results</li> <li>Sort by number of shared tags (most relevant first)</li> <li>Limit to 3-4 suggestions</li> <li>Fall back to recent articles if no tag matches found</li></ul> <h2 id=\"tasks\">Tasks</h2> <ul><li>Resolve current page tags from PageMeta (via <code>buildPagesMap</code> or\n      feed data)</li> <li>Filter feed items by shared tags, excluding current URL</li> <li>Rank by tag overlap count</li> <li>Pass filtered posts to the ReadNext template</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Remote ReadNext</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Fetch next articles remotely</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/features/","url":"/features/","relPath":"/features/","title":"Features","summary":"","image":"","order":{"default":20260208},"excluded":true,"wordCount":1,"date_published":"2026-02-08T00:00:00-00:00","content_html":"<!--[--><div class=\"ids__wrapper-wide\"><h1>Features</h1> <div class=\"articles svelte-1s2ms6o compact fancy\"><!--[--><!--]--> <!--[-1--><!--]--></div><!----></div><!--]-->"},{"id":"/features/component-library/","url":"/features/component-library/","relPath":"/features/component-library/","title":"Component Library","summary":"","image":"/_app/immutable/assets/cover.Ck5vS_AJ.avif","tags":["Components"],"order":{"default":20260208},"authors":["ramil"],"wordCount":156,"date_published":"2026-02-08T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/features\">Features</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/features/component-library\">Component Library</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Component <span>Library</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-08\" itemprop=\"datePublished\">February 8</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><h2 id=\"overview\">Overview</h2> <p>Sveleton provides a collection of reusable UI components optimized for\n    content-rich media projects. All components are exported from <code>$lib</code> for easy importing throughout your application.</p> <h2 id=\"key-components\">Key Components</h2> <p>The component library includes the following building blocks:</p> <p><strong>Articles</strong> - Grid layout component for displaying collections of articles or posts.</p> <p><strong>PostPreview</strong> - Card component for article previews with metadata and thumbnails.</p> <p><strong>Accordion</strong> - Collapsible content sections for FAQ-style layouts.</p> <p><strong>Img</strong> - Responsive image component powered by <code>@zerodevx/svelte-img</code> with automatic srcset generation and LQIP placeholders.</p> <p><strong>LinkBlock</strong> - Clickable card component for featured links and CTAs.</p> <p><strong>SharePostLink</strong> - Social sharing buttons for content distribution.</p> <p><strong>CallToAction</strong> - Prominent CTA sections for conversion optimization.</p> <p><strong>AnchorHeading</strong> - Headings with automatic anchor links for deep linking.</p> <aside><p>All components follow the Intuition Design System and are optimized for\n      static site generation with SvelteKit.</p></aside> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Sveleton</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Bootstrap your next media project</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/features/feeds/","url":"/features/feeds/","relPath":"/features/feeds/","title":"JSON and XML Feeds","summary":"","image":"/_app/immutable/assets/cover.lbay0dt-.avif","tags":["Content"],"order":{"default":20260208},"authors":["ramil"],"wordCount":154,"date_published":"2026-02-08T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/features\">Features</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/features/feeds\">Feeds</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->JSON and <span>XML Feeds</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-08\" itemprop=\"datePublished\">February 8</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Sveleton automatically generates content feeds for RSS readers and\n    aggregators. Both modern JSON Feed and traditional Atom XML formats are\n    supported, ensuring your content reaches the widest possible audience.</p> <h2 id=\"json-feed\">JSON Feed</h2> <p>The <code>/feed.json</code> endpoint serves a JSON Feed 1.1 compliant feed.\n    This modern format is easier to parse and more developer-friendly than XML.\n    The feed includes all your published articles with titles, descriptions,\n    dates, authors, and cover images.</p> <p>Content extraction happens server-side using Cheerio to parse each article's\n    HTML and generate clean feed items. This ensures feed readers get properly\n    formatted content without any layout artifacts.</p> <h2 id=\"xml-feed\">XML Feed</h2> <p>The <code>/feed.xml</code> endpoint provides an Atom-format XML feed for\n    traditional RSS readers. Like the JSON feed, it includes full article\n    metadata and content, ensuring compatibility with all major feed readers and\n    aggregation services.</p> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Sveleton</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Bootstrap your next media project</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/features/image-optimization/","url":"/features/image-optimization/","relPath":"/features/image-optimization/","title":"Image Optimization","summary":"","image":"/_app/immutable/assets/cover.iORoWzZB.avif","tags":["Build"],"order":{"default":20260208},"authors":["ramil"],"wordCount":169,"date_published":"2026-02-08T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/features\">Features</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/features/image-optimization\">Image Optimization</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Image <span>Optimization</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-08\" itemprop=\"datePublished\">February 8</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/cover.DT5_Pqg3.avif 197w, /_app/immutable/assets/cover.6wOSTk_Q.avif 263w, /_app/immutable/assets/cover.Ne5wwxTB.avif 349w, /_app/immutable/assets/cover.BIe3fckn.avif 360w, /_app/immutable/assets/cover.D_pvR5s4.avif 385w, /_app/immutable/assets/cover.BT5VTWJV.avif 414w, /_app/immutable/assets/cover.Dv8n2GyW.avif 768w, /_app/immutable/assets/cover.iORoWzZB.avif 1200w\"/><!--]--> <img src=\"/_app/immutable/assets/cover.iORoWzZB.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1200 / 630; background-image: url(/_app/immutable/assets/cover.BXO2wrgh.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!----> <p>Sveleton automatically optimizes images at build time using <code>vite-imagetools</code>. Every image is transformed into multiple sizes\n    and formats, ensuring fast loading times across all devices and network\n    conditions.</p> <h2 id=\"how-it-works\">How It Works</h2> <p>Images are processed during the Vite build step, generating responsive\n    variants from 197px to 1920px wide in AVIF format. The system automatically\n    creates a <code>srcset</code> attribute with all variants, letting browsers\n    choose the optimal size for each viewport.</p> <p>LQIP (Low Quality Image Placeholder) support provides instant visual\n    feedback. A tiny, blurred version of the image appears immediately while the\n    full image loads in the background, improving perceived performance.</p> <h2 id=\"usage\">Usage</h2> <p>Import images directly — no query parameters needed. Responsive variants and\n    LQIP placeholders are applied automatically via <code>defaultDirectives</code> in <code>vite.config.js</code>.</p> <aside><p>The <code>&lt;Img></code> component handles all the complexity: it shows\n      the LQIP, loads the appropriate size for the viewport, and provides smooth\n      transitions between placeholder and full image.</p></aside> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Sveleton</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Bootstrap your next media project</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/features/navigation/","url":"/features/navigation/","relPath":"/features/navigation/","title":"Navigation System","summary":"","image":"/_app/immutable/assets/cover.25KFmKLK.avif","tags":["Components"],"order":{"default":20260208},"authors":["ramil"],"wordCount":142,"date_published":"2026-02-08T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/features\">Features</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/features/navigation\">Navigation</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Navigation <span>System</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-08\" itemprop=\"datePublished\">February 8</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><h2 id=\"table-of-contents\">Table of Contents</h2> <p>The <code>Nav</code> component provides an automatic sidebar table of\n    contents that generates navigation links from <code>NavAnchor</code> elements placed throughout your content. Simply add <code>NavAnchor</code> components before each section heading to create jump links.</p> <p>The navigation updates automatically as users scroll, highlighting the\n    current section and providing smooth anchor-based scrolling between content\n    sections.</p> <h2 id=\"breadcrumbs\">Breadcrumbs</h2> <p>The <code>Breadcrumbs</code> component generates hierarchical navigation\n    automatically based on your route structure. It helps users understand their\n    current location within the site and provides quick access to parent pages.</p> <p>For site-wide navigation, the <code>sitemap</code> page provides a complete\n    overview of all available content organized by category and type.</p> <aside><p>Both components require no manual configuration - they work automatically\n      based on your page structure and routing.</p></aside> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Sveleton</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Bootstrap your next media project</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/features/publication-system/","url":"/features/publication-system/","relPath":"/features/publication-system/","title":"Publication System","summary":"","image":"/_app/immutable/assets/cover.OMVKkncT.avif","tags":["Content"],"order":{"default":20260208},"authors":["ramil"],"wordCount":184,"date_published":"2026-02-08T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/features\">Features</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/features/publication-system\">Publication System</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Publication <span>System</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-08\" itemprop=\"datePublished\">February 8</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>The <code>Publication</code> component is the foundation of Sveleton's\n    article publishing system. It wraps your content and automatically adds all\n    the metadata, navigation, and layout elements needed for a professional\n    publication.</p> <h2 id=\"overview\">Overview</h2> <p>Every article wrapped in the <code>Publication</code> component gets\n    automatic breadcrumb navigation, author bylines, publication and update\n    dates, and estimated reading time. The component also handles the article's\n    table of contents navigation, allowing readers to jump between sections\n    using <code>NavAnchor</code> components.</p> <p>At the end of each article, the <code>ReadNext</code> carousel automatically\n    suggests related content based on tags and categories. This keeps readers\n    engaged and helps them discover more of your content.</p> <h2 id=\"components\">Components</h2> <p>The system includes several supporting components: <code>PublicationAuthors</code> for displaying author information with avatars and links, <code>Breadcrumbs</code> for site navigation, <code>Nav</code> for the in-page table of contents, and <code>CallToAction</code> for adding engagement prompts at the end of articles.</p> <aside><p>All publication metadata is defined in the page's module script using the <code>meta</code> export, ensuring type safety and consistency across your entire site.</p></aside> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Sveleton</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Bootstrap your next media project</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/features/seo-and-meta-tags/","url":"/features/seo-and-meta-tags/","relPath":"/features/seo-and-meta-tags/","title":"SEO and Meta Tags","summary":"","image":"/_app/immutable/assets/cover.C3Fpq6Lk.avif","tags":["Content"],"order":{"default":20260208},"authors":["ramil"],"wordCount":182,"date_published":"2026-02-08T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/features\">Features</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/features/seo-and-meta-tags\">Seo And Meta Tags</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->SEO and <span>Meta Tags</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-08\" itemprop=\"datePublished\">February 8</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Sveleton includes a comprehensive <code>Meta</code> component that handles\n    all your SEO needs out of the box. Every page gets proper meta tags for\n    search engines and social media platforms without any additional\n    configuration.</p> <h2 id=\"what-is-included\">What Is Included</h2> <p>The <code>Meta</code> component automatically generates OpenGraph tags for\n    Facebook and LinkedIn, Twitter Card markup for enhanced tweet previews, and\n    Schema.org Article structured data for rich search results. All pages\n    include canonical URLs to prevent duplicate content issues.</p> <p>Each publication page can specify its own title, description, and cover\n    image through the <code>meta</code> prop. These values are used consistently\n    across all meta tag formats to ensure your content appears correctly when\n    shared on any platform.</p> <h2 id=\"usage\">Usage</h2> <p>Simply wrap your content in the <code>Publication</code> component and pass\n    the meta object with your page's title, description, and optional cover\n    image. The component handles everything else automatically, including\n    generating the proper meta tags, setting up breadcrumbs, and injecting\n    Schema.org markup into the page head.</p> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Sveleton</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Bootstrap your next media project</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/features/static-site-generation/","url":"/features/static-site-generation/","relPath":"/features/static-site-generation/","title":"Static Site Generation","summary":"","image":"/_app/immutable/assets/cover.CR8QPPm9.avif","tags":["Build"],"order":{"default":20260208},"authors":["ramil"],"wordCount":185,"date_published":"2026-02-08T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/features\">Features</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/features/static-site-generation\">Static Site Generation</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Static Site <span>Generation</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-08\" itemprop=\"datePublished\">February 8</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Sveleton uses SvelteKit's <code>adapter-static</code> to generate fully\n    pre-rendered HTML pages at build time. Every route is converted to static\n    HTML and output to the <code>build/</code> directory, making the site\n    incredibly fast and suitable for hosting on any static file server.</p> <h2 id=\"how-it-works\">How It Works</h2> <p>During the build process, SvelteKit crawls all routes starting from the root\n    and generates static HTML files. The adapter outputs a <code>200.html</code> fallback file for client-side routing, ensuring smooth navigation between\n    pages without full page reloads.</p> <p>All pages are pre-rendered by default using SvelteKit's <code>prerender = true</code> configuration. This means content is generated once at build time, not on\n    each request, resulting in optimal performance and SEO.</p> <h2 id=\"benefits\">Benefits</h2> <p>Static site generation offers significant advantages for media projects:\n    blazing-fast page loads, perfect SEO crawlability, and simple deployment to\n    any CDN or static host. No server required.</p> <aside><p>The entire site can be deployed to GitHub Pages, Netlify, Vercel, or any\n      static hosting provider. Just point them at the <code>build/</code> directory.</p></aside> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Sveleton</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Bootstrap your next media project</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/migrate-to-lightning-css/","url":"/todos/migrate-to-lightning-css/","relPath":"/todos/migrate-to-lightning-css/","title":"Migrate to Lightning CSS","summary":"","image":"","tags":["Build"],"order":{"default":0},"authors":["ramil"],"wordCount":174,"date_published":"2026-02-08T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/migrate-to-lightning-css\">Migrate To Lightning Css</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Migrate to <span>Lightning CSS</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-08\" itemprop=\"datePublished\">February 8</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Replace the current PostCSS pipeline with Lightning CSS. Lightning CSS is a\n    fast CSS parser, transformer, and minifier written in Rust, with built-in\n    support for nesting, custom media queries, and modern CSS features without\n    needing separate plugins.</p> <h2 id=\"motivation\">Motivation</h2> <ul><li>Significantly faster CSS processing (Rust-based)</li> <li>Native support for CSS nesting, no plugin needed</li> <li>Built-in vendor prefixing and browser target support</li> <li>Vite has built-in Lightning CSS integration</li> <li>Reduce dependency count by removing PostCSS plugins</li></ul> <h2 id=\"tasks\">Tasks</h2> <ul><li>Enable <code>css.lightningcss</code> in <code>vite.config.js</code></li> <li>Replace <code>postcss-nested-props</code> usage with standard CSS nesting</li> <li>Replace <code>postcss-simple-vars</code> with CSS custom properties</li> <li>Replace <code>postcss-easy-import</code> with native CSS imports</li> <li>Remove <code>postcss-preset-env</code> (Lightning CSS handles transforms)</li> <li>Remove <code>postcss.config.cjs</code></li> <li>Update <code>svelte-preprocess</code> config if needed</li> <li>Test all component styles for regressions</li></ul> <h2 id=\"risks\">Risks</h2> <ul><li><code>postcss-nested-props</code> shorthand has no direct equivalent in Lightning CSS — need to expand\n      manually</li> <li><code>postcss-simple-vars</code> (<code>$var</code> syntax) needs migrating to <code>var(--var)</code></li> <li>Some edge cases in nesting behavior may differ between PostCSS and\n      Lightning CSS</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Build performance</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Faster CSS processing</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/migrate-lighthouse-and-links-check/","url":"/todos/migrate-lighthouse-and-links-check/","relPath":"/todos/migrate-lighthouse-and-links-check/","title":"Migrate Lighthouse and Links Check","summary":"","image":"","tags":["Infrastructure"],"order":{"default":20260206},"authors":["ramil"],"wordCount":184,"date_published":"2026-02-06T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/migrate-lighthouse-and-links-check\">Migrate Lighthouse And Links Check</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Migrate <span>Lighthouse and Links Check</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-06\" itemprop=\"datePublished\">February 6</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Migrate Lighthouse CI audits and broken links checking into this repository.</p> <h2 id=\"context\">Context</h2> <p>SvelteKit's prerender crawler only validates <strong>internal</strong> links. External URLs (<code>https://...</code>) are silently discarded by <code>is_root_relative()</code> in the prerender loop — no handler, callback, or plugin hook ever sees them.\n    There is no built-in or planned feature for external link validation.</p> <h2 id=\"approach\">Approach</h2> <p>Use <a href=\"https://github.com/lycheeverse/lychee\">lychee</a> (same as\n    timestripe) as a post-build link checker against the <code>build/</code> output. Lychee is a fast Rust-based tool that checks both internal and\n    external links in HTML files.</p> <ul><li>Install via <code>brew install lychee</code> (local) and GitHub Action\n      (CI)</li> <li>Run against <code>./build/</code> after <code>pnpm build</code></li> <li>Add a <code>check:links</code> script (not <code>postbuild</code> — avoid\n      slowing local dev)</li> <li>Configure <code>.lychee.toml</code> for excludes, timeouts, accepted\n      status codes</li></ul> <h2 id=\"tasks\">Tasks</h2> <ul><li>Migrate Lighthouse CI configuration and scripts</li> <li>Add <code>lychee</code> as the broken links checker (replaces previous\n      solution)</li> <li>Add <code>.lychee.toml</code> config with sensible defaults</li> <li>Add <code>check:links</code> script to <code>package.json</code></li> <li>Integrate both into the CI/CD pipeline (GitHub Actions)</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Quality checks in-repo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Lighthouse and links check migration</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/rename-project-to-sveleton/","url":"/todos/rename-project-to-sveleton/","relPath":"/todos/rename-project-to-sveleton/","title":"Rename Project to Sveleton","summary":"","image":"","tags":["Project"],"order":{"default":0},"authors":["ramil"],"wordCount":52,"date_published":"2026-02-02T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/rename-project-to-sveleton\">Rename Project To Sveleton</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Rename Project <span>to Sveleton</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-02-02\" itemprop=\"datePublished\">February 2</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Rename the project from Sveleton to Sveleton for a cleaner, shorter name.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Update package.json name</li> <li>Update PROJECT_NAME in src/lib/index.js</li> <li>Update README.md</li> <li>Update CLAUDE.md</li> <li>Rename repository (if applicable)</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Project</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Simplify the name</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/add-demos-page/","url":"/todos/add-demos-page/","relPath":"/todos/add-demos-page/","title":"Add demos page","summary":"","image":"","tags":["Content","Daler"],"order":{"default":20260127},"authors":["ramil"],"wordCount":62,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/add-demos-page\">Add Demos Page</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Add <span>demos page</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a dedicated page to showcase interactive demos and Fun components\n    like games, timers, and animations.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Create <code>/demos/</code> route</li> <li>Add navigation link to demos page</li> <li>Showcase Fun components (Clock, Timer, Snake, Pinball, etc.)</li> <li>Add interactive examples with descriptions</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Interactive demos</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Showcase Fun components</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/demo-accordion/","url":"/todos/demo-accordion/","relPath":"/todos/demo-accordion/","title":"Demo: Accordion","summary":"","image":"","tags":["Content"],"order":{"default":20260127},"authors":["ramil"],"wordCount":45,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/demo-accordion\">Demo Accordion</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Demo: <span>Accordion</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a demo page showcasing the <code>Accordion</code> component with\n    interactive examples.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Add usage examples for <code>Accordion</code></li> <li>Document available props</li> <li>Show different configurations and states</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Component demo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Accordion showcase</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/demo-anchor-heading/","url":"/todos/demo-anchor-heading/","relPath":"/todos/demo-anchor-heading/","title":"Demo: AnchorHeading","summary":"","image":"","tags":["Content"],"order":{"default":20260127},"authors":["ramil"],"wordCount":46,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/demo-anchor-heading\">Demo Anchor Heading</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Demo: <span>AnchorHeading</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a demo page showcasing the <code>AnchorHeading</code> component with\n    interactive examples.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Add usage examples for <code>AnchorHeading</code></li> <li>Document available props</li> <li>Show different configurations and states</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Component demo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">AnchorHeading showcase</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/demo-articles/","url":"/todos/demo-articles/","relPath":"/todos/demo-articles/","title":"Demo: Articles","summary":"","image":"","tags":["Content"],"order":{"default":20260127},"authors":["ramil"],"wordCount":45,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/demo-articles\">Demo Articles</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Demo: <span>Articles</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a demo page showcasing the <code>Articles</code> component with\n    interactive examples.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Add usage examples for <code>Articles</code></li> <li>Document available props</li> <li>Show different configurations and states</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Component demo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Articles showcase</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/demo-authors/","url":"/todos/demo-authors/","relPath":"/todos/demo-authors/","title":"Demo: Authors","summary":"","image":"","tags":["Content"],"order":{"default":20260127},"authors":["ramil"],"wordCount":45,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/demo-authors\">Demo Authors</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Demo: <span>Authors</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a demo page showcasing the <code>Authors</code> component with\n    interactive examples.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Add usage examples for <code>Authors</code></li> <li>Document available props</li> <li>Show different configurations and states</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Component demo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Authors showcase</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/demo-call-to-action/","url":"/todos/demo-call-to-action/","relPath":"/todos/demo-call-to-action/","title":"Demo: CallToAction","summary":"","image":"","tags":["Content"],"order":{"default":20260127},"authors":["ramil"],"wordCount":47,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/demo-call-to-action\">Demo Call To Action</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Demo: <span>CallToAction</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a demo page showcasing the <code>CallToAction</code> component with\n    interactive examples.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Add usage examples for <code>CallToAction</code></li> <li>Document available props</li> <li>Show different configurations and states</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Component demo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">CallToAction showcase</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/demo-call-to-action-black/","url":"/todos/demo-call-to-action-black/","relPath":"/todos/demo-call-to-action-black/","title":"Demo: CallToAction-black","summary":"","image":"","tags":["Content"],"order":{"default":20260127},"authors":["ramil"],"wordCount":48,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/demo-call-to-action-black\">Demo Call To Action Black</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Demo: <span>CallToAction-black</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a demo page showcasing the <code>CallToAction-black</code> component\n    with interactive examples.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Add usage examples for <code>CallToAction-black</code></li> <li>Document available props</li> <li>Show different configurations and states</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Component demo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">CallToAction-black showcase</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/demo-feed-json/","url":"/todos/demo-feed-json/","relPath":"/todos/demo-feed-json/","title":"Demo: Feed JSON","summary":"","image":"","tags":["Content"],"order":{"default":20260127},"authors":["ramil"],"wordCount":43,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/demo-feed-json\">Demo Feed Json</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Demo: <span>Feed JSON</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a demo page showcasing the <code>/feed.json</code> route.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Document the purpose of <code>/feed.json</code></li> <li>Show example output</li> <li>Document configuration options</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Route demo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Feed JSON showcase</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/demo-feed-xml/","url":"/todos/demo-feed-xml/","relPath":"/todos/demo-feed-xml/","title":"Demo: Feed XML","summary":"","image":"","tags":["Content"],"order":{"default":20260127},"authors":["ramil"],"wordCount":43,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/demo-feed-xml\">Demo Feed Xml</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Demo: <span>Feed XML</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a demo page showcasing the <code>/feed.xml</code> route.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Document the purpose of <code>/feed.xml</code></li> <li>Show example output</li> <li>Document configuration options</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Route demo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Feed XML showcase</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/demo-img/","url":"/todos/demo-img/","relPath":"/todos/demo-img/","title":"Demo: Img","summary":"","image":"","tags":["Content"],"order":{"default":20260127},"authors":["ramil"],"wordCount":45,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/demo-img\">Demo Img</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Demo: <span>Img</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a demo page showcasing the <code>Img</code> component with\n    interactive examples.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Add usage examples for <code>Img</code></li> <li>Document available props</li> <li>Show different configurations and states</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Component demo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Img showcase</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/demo-link-block/","url":"/todos/demo-link-block/","relPath":"/todos/demo-link-block/","title":"Demo: LinkBlock","summary":"","image":"","tags":["Content"],"order":{"default":20260127},"authors":["ramil"],"wordCount":46,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/demo-link-block\">Demo Link Block</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Demo: <span>LinkBlock</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a demo page showcasing the <code>LinkBlock</code> component with\n    interactive examples.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Add usage examples for <code>LinkBlock</code></li> <li>Document available props</li> <li>Show different configurations and states</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Component demo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">LinkBlock showcase</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/demo-meta/","url":"/todos/demo-meta/","relPath":"/todos/demo-meta/","title":"Demo: Meta","summary":"","image":"","tags":["Content"],"order":{"default":20260127},"authors":["ramil"],"wordCount":45,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/demo-meta\">Demo Meta</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Demo: <span>Meta</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a demo page showcasing the <code>Meta</code> component with\n    interactive examples.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Add usage examples for <code>Meta</code></li> <li>Document available props</li> <li>Show different configurations and states</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Component demo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Meta showcase</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/demo-post-preview/","url":"/todos/demo-post-preview/","relPath":"/todos/demo-post-preview/","title":"Demo: PostPreview","summary":"","image":"","tags":["Content"],"order":{"default":20260127},"authors":["ramil"],"wordCount":46,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/demo-post-preview\">Demo Post Preview</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Demo: <span>PostPreview</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a demo page showcasing the <code>PostPreview</code> component with\n    interactive examples.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Add usage examples for <code>PostPreview</code></li> <li>Document available props</li> <li>Show different configurations and states</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Component demo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">PostPreview showcase</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/demo-publication-authors/","url":"/todos/demo-publication-authors/","relPath":"/todos/demo-publication-authors/","title":"Demo: PublicationAuthors","summary":"","image":"","tags":["Content"],"order":{"default":-1},"authors":["ramil"],"wordCount":67,"date_published":"2026-01-27T00:00:00-00:00","updated":"2026-05-14T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/demo-publication-authors\">Demo Publication Authors</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Demo: <span>PublicationAuthors</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-05-14\" itemprop=\"dateModified\">May 14</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a demo page showcasing the <code>PublicationAuthors</code> component\n    with interactive examples.</p> <aside><p>Canceled: PublicationAuthors was merged into Authors with a variant prop\n      (byline, compact, credits). See <a href=\"/todos/demo-authors/\">Demo: Authors</a>.</p></aside> <h2 id=\"tasks\">Tasks</h2> <ul><li>Add usage examples for <code>PublicationAuthors</code></li> <li>Document available props</li> <li>Show different configurations and states</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Component demo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">PublicationAuthors showcase</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/demo-publication-date/","url":"/todos/demo-publication-date/","relPath":"/todos/demo-publication-date/","title":"Demo: PublicationDate","summary":"","image":"","tags":["Content"],"order":{"default":20260127},"authors":["ramil"],"wordCount":46,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/demo-publication-date\">Demo Publication Date</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Demo: <span>PublicationDate</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a demo page showcasing the <code>PublicationDate</code> component\n    with interactive examples.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Add usage examples for <code>PublicationDate</code></li> <li>Document available props</li> <li>Show different configurations and states</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Component demo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">PublicationDate showcase</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/demo-read-next/","url":"/todos/demo-read-next/","relPath":"/todos/demo-read-next/","title":"Demo: ReadNext","summary":"","image":"","tags":["Content"],"order":{"default":20260127},"authors":["ramil"],"wordCount":89,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/demo-read-next\">Demo Read Next</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Demo: <span>ReadNext</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a demo page showcasing the <code>ReadNext</code> component, which\n    suggests related articles based on shared tags.</p> <h2 id=\"current-state\">Current State</h2> <p>The ReadNext implementation is complete (see <a href=\"/todos/use-remote-function-to-read-next/\">Use remote function to ReadNext</a>). It reads from <code>page.data.readNextPosts</code> populated by <code>getReadNext()</code> in <code>+layout.server.js</code>, and delegates rendering to <code>Articles</code> in compact mode.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Create a demo page with usage examples</li> <li>Show how tag-based matching and fallback behavior works</li> <li>Document the <code>getReadNext()</code> remote function API</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Component demo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">ReadNext showcase</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/demo-reading-time/","url":"/todos/demo-reading-time/","relPath":"/todos/demo-reading-time/","title":"Demo: ReadingTime","summary":"","image":"","tags":["Content"],"order":{"default":20260127},"authors":["ramil"],"wordCount":46,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/demo-reading-time\">Demo Reading Time</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Demo: <span>ReadingTime</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a demo page showcasing the <code>ReadingTime</code> component with\n    interactive examples.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Add usage examples for <code>ReadingTime</code></li> <li>Document available props</li> <li>Show different configurations and states</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Component demo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">ReadingTime showcase</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/demo-share-post-link/","url":"/todos/demo-share-post-link/","relPath":"/todos/demo-share-post-link/","title":"Demo: SharePostLink","summary":"","image":"","tags":["Content"],"order":{"default":20260127},"authors":["ramil"],"wordCount":47,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/demo-share-post-link\">Demo Share Post Link</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Demo: <span>SharePostLink</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a demo page showcasing the <code>SharePostLink</code> component with\n    interactive examples.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Add usage examples for <code>SharePostLink</code></li> <li>Document available props</li> <li>Show different configurations and states</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Component demo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">SharePostLink showcase</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/demo-sitemap/","url":"/todos/demo-sitemap/","relPath":"/todos/demo-sitemap/","title":"Demo: Sitemap","summary":"","image":"","tags":["Content"],"order":{"default":20260127},"authors":["ramil"],"wordCount":40,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/demo-sitemap\">Demo Sitemap</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Demo: <span>Sitemap</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a demo page showcasing the <code>/sitemap/</code> route.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Document the purpose of <code>/sitemap/</code></li> <li>Show example output</li> <li>Document configuration options</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Route demo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Sitemap showcase</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/demo-sitemap-appendix/","url":"/todos/demo-sitemap-appendix/","relPath":"/todos/demo-sitemap-appendix/","title":"Demo: Sitemap Appendix","summary":"","image":"","tags":["Content"],"order":{"default":20260127},"authors":["ramil"],"wordCount":43,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/demo-sitemap-appendix\">Demo Sitemap Appendix</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Demo: <span>Sitemap Appendix</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a demo page showcasing the <code>/sitemap-appendix.xml</code> route.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Document the purpose of <code>/sitemap-appendix.xml</code></li> <li>Show example output</li> <li>Document configuration options</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Route demo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Sitemap Appendix showcase</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/demo-todo-cover/","url":"/todos/demo-todo-cover/","relPath":"/todos/demo-todo-cover/","title":"Demo: TodoCover","summary":"","image":"","tags":["Content"],"order":{"default":20260127},"authors":["ramil"],"wordCount":46,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/demo-todo-cover\">Demo Todo Cover</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Demo: <span>TodoCover</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a demo page showcasing the <code>TodoCover</code> component with\n    interactive examples.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Add usage examples for <code>TodoCover</code></li> <li>Document available props</li> <li>Show different configurations and states</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Component demo</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">TodoCover showcase</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/fix-time-to-read/","url":"/todos/fix-time-to-read/","relPath":"/todos/fix-time-to-read/","title":"Fix time to read","summary":"","image":"","tags":["Features"],"order":{"default":0},"authors":["ramil"],"wordCount":59,"date_published":"2026-01-27T00:00:00-00:00","updated":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/fix-time-to-read\">Fix Time To Read</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Fix <span>time to read</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-02-09\" itemprop=\"dateModified\">February 9</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Fix the reading time estimation feature to accurately calculate and display\n    reading time for articles.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Investigate current ReadingTime component</li> <li>Fix word count calculation</li> <li>Ensure proper display in article pages</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Reading time</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Accurate estimates</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/sync-editor-settings/","url":"/todos/sync-editor-settings/","relPath":"/todos/sync-editor-settings/","title":"Sync editor settings","summary":"","image":"","tags":["Infrastructure"],"order":{"default":20260127},"authors":["ramil"],"wordCount":79,"date_published":"2026-01-27T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/sync-editor-settings\">Sync Editor Settings</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Sync <span>editor settings</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-27\" itemprop=\"datePublished\">January 27</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Ensure Biome, Zed, and VS Code all use consistent formatting and linting\n    settings.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Configure Zed to use Biome for formatting</li> <li>Configure VS Code to use Biome extension</li> <li>Add <code>.vscode/settings.json</code> with Biome as default formatter</li> <li>Add <code>.zed/settings.json</code> with Biome configuration</li> <li>Ensure indent style (tabs) and width (4) match across all tools</li> <li>Test formatting consistency across editors</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Consistent tooling</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Same settings everywhere</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/daler/","url":"/daler/","relPath":"/daler/","title":"Todos for Daler","summary":"","image":"","order":{"default":20260126},"wordCount":3,"date_published":"2026-01-26T00:00:00-00:00","content_html":"<!--[--><div class=\"ids__wrapper-wide\"><h1>Todos for Daler</h1> <div class=\"articles svelte-1s2ms6o compact fancy\"><!--[--><!--]--> <!--[-1--><!--]--></div><!----></div><!--]-->"},{"id":"/todos/add-optional-snippet-for-article-preview/","url":"/todos/add-optional-snippet-for-article-preview/","relPath":"/todos/add-optional-snippet-for-article-preview/","title":"Add optional snippet for article preview","summary":"","image":"","tags":["Features"],"order":{"default":0},"authors":["ramil"],"wordCount":191,"date_published":"2026-01-26T00:00:00-00:00","updated":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/add-optional-snippet-for-article-preview\">Add Optional Snippet For Article Preview</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Add optional <span>snippet</span> for article preview<!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-26\" itemprop=\"datePublished\">January 26</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-02-09\" itemprop=\"dateModified\">February 9</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Currently the <code>PostPreview</code> component only displays the article\n    title, cover image, and authors. Adding an optional Svelte snippet would\n    allow rich preview content for articles.</p> <h2 id=\"problem\">Problem</h2> <p>Svelte snippets cannot be passed through JSON. The current architecture:</p> <ol><li>Pages export metadata in <code>&lt;script module></code></li> <li><code>page-renderer.svelte.js</code> extracts exports into JSON feed</li> <li><code>Articles.svelte</code> reads from <code>page.data.feed</code> (JSON)</li> <li><code>PostPreview.svelte</code> renders from JSON data</li></ol> <p>Svelte snippets are runtime constructs that cannot be serialized to JSON.</p> <h2 id=\"solution\">Solution</h2> <p>Import all page modules directly in the layout and map them to feed items,\n    bypassing JSON serialization for snippet data.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Import all page modules in layout using <code>import.meta.glob</code></li> <li>Create a map from feed item URLs to page modules</li> <li>Extract snippet from page module and pass to <code>PostPreview</code></li> <li>Update <code>PostPreview.svelte</code> to accept and render optional\n      snippet prop</li></ul> <h2 id=\"considerations\">Considerations</h2> <ul><li>Performance impact of importing all page modules in layout</li> <li>May want different snippet visibility for compact vs fancy layouts</li> <li>Snippet should be optional - fall back to title-only preview</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Better previews</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Rich article snippets</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/create-new-homepage/","url":"/todos/create-new-homepage/","relPath":"/todos/create-new-homepage/","title":"Create new homepage","summary":"","image":"","tags":["Content"],"order":{"default":0},"authors":["ramil"],"wordCount":126,"date_published":"2026-01-26T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/create-new-homepage\">Create New Homepage</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Create <span>new homepage</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-26\" itemprop=\"datePublished\">January 26</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Currently the homepage redirects to <code>/todos/</code>. Create a proper\n    landing page for the Sveleton project.</p> <h2 id=\"about\">About Sveleton</h2> <p>Sveleton is a bootstrap project based on the Intuition Design System, built\n    on the foundations of intuition.team and timestripe.com for quick-starting\n    new media projects with everything ready for content writing, SEO, and more.</p> <h2 id=\"requirements\">Requirements</h2> <ul><li>Welcome message explaining what Sveleton is (see above)</li> <li>Links to key sections (Todos, Sitemap)</li> <li>Clean, minimal design consistent with the rest of the site</li> <li>Proper meta tags for SEO</li></ul> <h2 id=\"implementation\">Implementation</h2> <ul><li>Replace <code>src/routes/+page.server.js</code> redirect with actual <code>+page.svelte</code></li> <li>Use existing design patterns from todo pages</li> <li>Keep it simple - this is a demo/template project</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">New homepage</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Welcome visitors properly</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/create-pages-metadata-module/","url":"/todos/create-pages-metadata-module/","relPath":"/todos/create-pages-metadata-module/","title":"Create pages metadata module","summary":"","image":"","tags":["Build"],"order":{"default":0},"authors":["ramil"],"featured":true,"wordCount":301,"date_published":"2026-01-26T00:00:00-00:00","updated":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/create-pages-metadata-module\">Create Pages Metadata Module</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Create <span>pages metadata module</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-26\" itemprop=\"datePublished\">January 26</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-02-09\" itemprop=\"dateModified\">February 9</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Create a pages metadata module using a <a href=\"https://svelte.dev/docs/kit/remote-functions\">SvelteKit remote function</a> (<code>prerender</code>) instead of a plain client-side module with <code>import.meta.glob</code>. This keeps the glob/metadata resolution on\n    the server and prerendered at build time.</p> <h2 id=\"goal\">Goal</h2> <p>Provide a single module that exports all page metadata, enabling:</p> <ul><li>Type-safe access to page metadata</li> <li>Easy iteration over all pages (for sitemap, feeds, navigation)</li> <li>Consistent metadata structure across the app</li> <li>Server-side only execution (no glob in the client bundle)</li></ul> <h2 id=\"docs\">Relevant Docs</h2> <ul><li><a href=\"https://svelte.dev/docs/kit/remote-functions\">Remote functions</a> - overview of query, form, command, and prerender</li> <li><a href=\"https://svelte.dev/docs/kit/$app-server\">$app/server</a> - API reference for <code>query</code>, <code>prerender</code>, etc.</li></ul> <h2 id=\"approach\">Approach</h2> <p>Use a <code>prerender</code> remote function since page metadata only\n    changes at build time. The result gets cached and prerendered during the\n    build, so no runtime server is needed for the static site.</p> <h2 id=\"implementation\">Implementation</h2> <p>1. Enable remote functions in <code>svelte.config.js</code>:</p> <pre><code>export default { kit: { experimental: { remoteFunctions: true } } }</code></pre> <p>2. Create <code>src/routes/pages.remote.ts</code>:</p> <pre><code>import { prerender } from '$app/server';\n\nconst modules = import.meta.glob('/src/routes/**/+page.svelte', {\n  import: 'meta',\n  eager: true,\n});\n\nexport const getPages = prerender(async () => {\n  return Object.entries(modules).map(([path, meta]) => {\n    const url = path\n      .replace('/src/routes', '')\n      .replace('/+page.svelte', '')\n      .replace(/\\([^)]+\\)\\//g, '') || '/';\n    return { url, ...meta };\n  });\n});</code></pre> <p>3. Use in components:</p> <pre><code>&lt;script>\n  import { getPages } from './pages.remote';\n&lt;/script>\n\n{#each await getPages() as page}\n  &lt;a href={page.url}>{page.title}&lt;/a>\n{/each}</code></pre> <h2 id=\"consumers\">Consumers to Update</h2> <ul><li><code>src/lib/index.js</code> - remove the <code>pages</code> export (currently uses <code>import.meta.glob</code> on client)</li> <li><code>src/lib/page-renderer.svelte.js</code> - use remote function instead of glob</li> <li><code>src/routes/sitemap/+page.server.js</code> - use remote function</li> <li><code>src/routes/feed.json/+server.js</code> - use remote function</li></ul> <h2 id=\"config\">Config Requirements</h2> <ul><li>Enable <code>experimental.remoteFunctions</code> in <code>svelte.config.js</code></li> <li>Enable <code>compilerOptions.experimental.async</code> for <code>await</code> in templates</li> <li>Remote function files use <code>.remote.ts</code> extension</li> <li>Cannot be placed in <code>src/lib/server/</code></li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Centralized metadata</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Single source of truth</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/fix-preview-generation/","url":"/todos/fix-preview-generation/","relPath":"/todos/fix-preview-generation/","title":"Fix preview generation","summary":"","image":"","tags":["Features"],"order":{"default":-1},"authors":["ramil"],"wordCount":44,"date_published":"2026-01-26T00:00:00-00:00","updated":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/fix-preview-generation\">Fix Preview Generation</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Fix <span>preview generation</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-26\" itemprop=\"datePublished\">January 26</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-02-09\" itemprop=\"dateModified\">February 9</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Superseded by <a href=\"/todos/restore-og-image-generation/\">Restore dynamic OG image generation</a>, which has more detailed tasks and current state analysis.</p> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Fix previews</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Better social sharing</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/remove-background/","url":"/todos/remove-background/","relPath":"/todos/remove-background/","title":"Remove background","summary":"","image":"","tags":["Cleanup"],"order":{"default":0},"authors":["ramil"],"wordCount":51,"date_published":"2026-01-26T00:00:00-00:00","updated":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/remove-background\">Remove Background</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Remove <span>background</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-26\" itemprop=\"datePublished\">January 26</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-02-09\" itemprop=\"dateModified\">February 9</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Remove or simplify the decorative background styles from the site.</p> <h2 id=\"tasks\">Tasks</h2> <ul><li>Remove background image/gradient styles</li> <li>Clean up related CSS variables</li> <li>Ensure consistent appearance across pages</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Clean background</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Simplify visual design</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/update-readme-and-claude-md/","url":"/todos/update-readme-and-claude-md/","relPath":"/todos/update-readme-and-claude-md/","title":"Update README and CLAUDE.md","summary":"","image":"","tags":["Content"],"order":{"default":0},"authors":["ramil"],"wordCount":96,"date_published":"2026-01-26T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/update-readme-and-claude-md\">Update Readme And Claude Md</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Update <span>README and CLAUDE.md</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-26\" itemprop=\"datePublished\">January 26</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Update project documentation to reflect the current state after removing\n    magazine/Timestripe content.</p> <h2 id=\"about\">About Sveleton</h2> <p>Sveleton is a bootstrap project based on the Intuition Design System, built\n    on the foundations of intuition.team and timestripe.com for quick-starting\n    new media projects with everything ready for content writing, SEO, and more.</p> <h2 id=\"readme\">README.md</h2> <p>DONE - Updated with project description and commands.</p> <h2 id=\"claude-md\">CLAUDE.md</h2> <p>DONE - Updated with project overview, current structure, and todo page\n    instructions.</p> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Documentation</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Keep docs up to date</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/re-enable-imagetools/","url":"/todos/re-enable-imagetools/","relPath":"/todos/re-enable-imagetools/","title":"Re-enable imagetools","summary":"","image":"","tags":["Build"],"order":{"default":0},"authors":["ramil"],"wordCount":151,"date_published":"2026-01-25T00:00:00-00:00","updated":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/re-enable-imagetools\">Re Enable Imagetools</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Re-enable <span>imagetools</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-25\" itemprop=\"datePublished\">January 25</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-02-09\" itemprop=\"dateModified\">February 9</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>The <code>vite-imagetools</code> plugin was disabled in <code>vite.config.js</code> because it caused the build to freeze during the transform step.</p> <h2 id=\"problem\">Problem</h2> <p>The build would hang indefinitely after showing Svelte warnings, around the\n    transform step. This is likely due to:</p> <ul><li>Processing 340+ images with <code>?as=run</code> imports</li> <li>Each image being converted to 9 different widths (197-1920px)</li> <li>AVIF format conversion being CPU-intensive</li> <li>Possible memory issues or infinite loops in image processing</li></ul> <h2 id=\"investigation\">Investigation Steps</h2> <ul><li>Try building with fewer images first</li> <li>Check if specific images cause the freeze</li> <li>Monitor memory usage during build</li> <li>Try reducing the number of output widths</li> <li>Check imagetools version and changelog for known issues</li> <li>Consider using a different image optimization approach</li></ul> <h2 id=\"current-state\">Current State</h2> <p>The imagetools plugin is commented out in <code>vite.config.js</code>.\n    Images are imported directly without optimization.</p> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Image optimization</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Restore image processing</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/reduce-build-logging/","url":"/todos/reduce-build-logging/","relPath":"/todos/reduce-build-logging/","title":"Reduce build logging","summary":"","image":"","tags":["Build"],"order":{"default":0},"authors":["ramil"],"wordCount":135,"date_published":"2026-01-25T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/reduce-build-logging\">Reduce Build Logging</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Reduce <span>build logging</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-25\" itemprop=\"datePublished\">January 25</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>The build output is very verbose with many warnings. Add a way to toggle\n    detailed logging.</p> <h2 id=\"current-warnings\">Current Warnings</h2> <ul><li>Svelte a11y warnings (media captions, click handlers, etc.)</li> <li>State referenced locally warnings</li> <li>Missing anchor ID warnings from prerender</li> <li>CSS syntax warnings</li> <li>Component naming warnings</li></ul> <h2 id=\"solution\">Solution</h2> <p>Options to reduce logging:</p> <ul><li>Add <code>onwarn</code> handler in <code>svelte.config.js</code> to filter\n      warnings</li> <li>Use environment variable like <code>VERBOSE=1 pnpm build</code> to toggle</li> <li>Configure <code>handleMissingId: 'ignore'</code> in SvelteKit config for\n      anchor warnings</li> <li>Set <code>compilerOptions.warningFilter</code> in svelte.config.js</li></ul> <h2 id=\"example\">Example</h2> <pre><code>// svelte.config.js\nconst config = {\n    onwarn: (warning, handler) => {\n        if (process.env.VERBOSE) {\n            handler(warning);\n        } else if (warning.code === 'a11y_media_has_caption') return;\n        else if (warning.code === 'state_referenced_locally') return;\n        else handler(warning);\n    }\n};</code></pre> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Clean output</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Less noise in build logs</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/cleanup-all-warnings/","url":"/todos/cleanup-all-warnings/","relPath":"/todos/cleanup-all-warnings/","title":"Cleanup all warnings","summary":"","image":"","tags":["Cleanup"],"order":{"default":0},"authors":["ramil"],"wordCount":204,"date_published":"2026-01-23T00:00:00-00:00","updated":"2026-01-26T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/cleanup-all-warnings\">Cleanup All Warnings</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Cleanup <span>all warnings</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-23\" itemprop=\"datePublished\">January 23</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-01-26\" itemprop=\"dateModified\">January 26</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Fix all warnings from build process, svelte-check, and linting to achieve\n    clean output.</p> <h2 id=\"status\">Current Status</h2> <ul><li><strong>pnpm check</strong>: 0 errors, 0 warnings</li> <li><strong>pnpm build</strong>: 6 warnings (see below)</li></ul> <h2 id=\"build-warnings\">Build Warnings</h2> <h3>1. tsconfig.json base config (2 warnings)</h3> <pre><code>Cannot find base config file \"./.svelte-kit/tsconfig.json\"</code></pre> <p><strong>Cause:</strong> esbuild runs in parallel with vite, starts before SvelteKit generates\n    tsconfig.</p> <p><strong>Status:</strong> Added <code>svelte-kit sync</code> to build script but warning persists due\n    to parallel execution. Harmless - build succeeds.</p> <h3>2. CSS :has() selector (4 warnings)</h3> <pre><code>Expected identifier but found whitespace\nUnexpected \"has(\"</code></pre> <p><strong>Location:</strong> <code>src/styles/ids/settings.pcss:82</code></p> <pre><code>html:has(.theme_dark) { ... }</code></pre> <p><strong>Cause:</strong> esbuild's CSS parser doesn't fully support :has() pseudo-selector.</p> <p><strong>Fix options:</strong></p> <ul><li>Ignore (CSS works fine in browser, just parser warning)</li> <li>Refactor to use JS-based theme switching instead of :has()</li> <li>Use @supports or fallback approach</li></ul> <h2 id=\"approach\">Recommended Approach</h2> <ol><li><strong>tsconfig warning</strong>: Leave as-is, it's harmless and resolves\n      on build</li> <li><strong>:has() warning</strong>: Keep for now - modern CSS feature that\n      works in browsers. Consider refactoring only if it causes actual issues.</li></ol> <aside><p>All warnings are cosmetic - the build succeeds and output works correctly.\n      These can be addressed later if needed.</p></aside> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Zero warnings</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Clean build output</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/enable-disabled-features/","url":"/todos/enable-disabled-features/","relPath":"/todos/enable-disabled-features/","title":"Enable disabled features","summary":"","image":"","tags":["Features"],"order":{"default":-1},"authors":["ramil"],"wordCount":159,"date_published":"2026-01-23T00:00:00-00:00","updated":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/enable-disabled-features\">Enable Disabled Features</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Enable <span>disabled features</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-23\" itemprop=\"datePublished\">January 23</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-02-09\" itemprop=\"dateModified\">February 9</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Re-enable features that were temporarily disabled or mocked during the\n    initial project setup.</p> <h2 id=\"disabled-routes\">Disabled Routes</h2> <p>Routes that were moved to <code>src/lib/disabled-routes/</code>:</p> <ul><li><del><code>feed.json</code> - JSON feed endpoint</del> — restored</li> <li><del><code>feed.xml</code> - RSS/Atom feed endpoint</del> — restored</li> <li><del><code>sitemap-appendix.xml</code> - Sitemap XML endpoint</del> — restored</li> <li><code>og/</code> - Dynamic OG image generation — <a href=\"/todos/restore-og-image-generation/\">separate todo</a></li> <li><del><code>sitemap/</code> - Sitemap page</del> — restored</li></ul> <h2 id=\"mocked-features\">Mocked Features</h2> <ul><li><del><code>src/routes/+layout.server.js</code> - Feed fetch returns empty <code>{ items: [] }</code></del> — restored, fetches from <code>/feed.json</code></li> <li><del><code>src/routes/+layout.server.js</code> - Module scanning commented out</del> — restored</li> <li><code>src/routes/+layout.svelte</code> - Feed links commented out — <a href=\"/todos/add-feed-link-tags/\">separate todo</a></li> <li><code>src/lib/Meta.svelte</code> - OG image uses cover directly instead of generated image — <a href=\"/todos/restore-og-image-generation/\">separate todo</a></li> <li><del><code>src/lib/Articles.svelte</code> - Uses <code>feed?.items ?? []</code> fallback</del> — acceptable now that feed is live</li></ul> <h2 id=\"remaining\">Remaining</h2> <ul><li><a href=\"/todos/restore-og-image-generation/\">Restore dynamic OG image generation</a></li> <li><a href=\"/todos/add-feed-link-tags/\">Add feed link tags to layout</a></li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Full functionality</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Restore all features</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/investigate-build-freeze/","url":"/todos/investigate-build-freeze/","relPath":"/todos/investigate-build-freeze/","title":"Investigate build freeze","summary":"","image":"","tags":["Build"],"order":{"default":0},"authors":["ramil"],"wordCount":99,"date_published":"2026-01-23T00:00:00-00:00","updated":"2026-02-09T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/investigate-build-freeze\">Investigate Build Freeze</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Investigate <span>build freeze</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-23\" itemprop=\"datePublished\">January 23</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-02-09\" itemprop=\"dateModified\">February 9</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>The <code>pnpm build</code> command freezes at some point. Need to identify\n    the cause and fix it.</p> <h2 id=\"investigation\">Investigation Steps</h2> <ul><li>Run <code>pnpm build</code> and observe where it hangs</li> <li>Check for infinite loops or circular dependencies</li> <li>Check vite-imagetools processing (large images, many images)</li> <li>Check for problematic imports or dynamic imports</li> <li>Try building with verbose output</li></ul> <h2 id=\"potential-causes\">Potential Causes</h2> <ul><li>vite-imagetools processing too many images</li> <li>Circular dependencies in imports</li> <li>Large asset processing</li> <li>Memory issues during build</li> <li>Plugin conflicts</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Build stability</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Reliable builds</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/restore-meta-context/","url":"/todos/restore-meta-context/","relPath":"/todos/restore-meta-context/","title":"Restore meta context","summary":"","image":"","tags":["Features"],"order":{"default":-1},"authors":["ramil"],"wordCount":58,"date_published":"2026-01-23T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/restore-meta-context\">Restore Meta Context</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Restore <span>meta context</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-23\" itemprop=\"datePublished\">January 23</time><!----> <!--[-1--><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>The <code>getContext('meta')</code> call in <code>src/lib/meta.svelte</code> was commented out to investigate build freeze.</p> <h2 id=\"location\">Location</h2> <p>File: <code>src/lib/meta.svelte:68</code></p> <h2 id=\"task\">Task</h2> <ul><li>Uncomment the <code>getContext('meta')</code> line</li> <li>Verify build still works after restoring</li> <li>If build freezes again, investigate why this call causes issues</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Meta context</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">Restore functionality</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/todos/set-up-gh-actions/","url":"/todos/set-up-gh-actions/","relPath":"/todos/set-up-gh-actions/","title":"Set up GitHub Actions","summary":"","image":"","tags":["Infrastructure"],"order":{"default":0},"authors":["ramil"],"featured":true,"wordCount":128,"date_published":"2026-01-23T00:00:00-00:00","updated":"2026-04-17T00:00:00-00:00","content_html":"<!--[--><article itemscope=\"\" itemtype=\"https://schema.org/Article\" class=\"main\"><section class=\"article-info\"><!--[0--><nav class=\"breadcrumbs svelte-1jovwxm\" aria-label=\"breadcrumb\"><!--[--><!--[-1--><!--]--> <!--[-1--><a href=\"/src\">Src</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes\">Routes</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)\">(demo)</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos\">Todos</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[-1--><a href=\"/src/routes/(demo)/todos/set-up-gh-actions\">Set Up Gh Actions</a><!--]--><!--[0--><span class=\"separator svelte-1jovwxm\">></span><!--]--> <!--[0--><span class=\"current-page svelte-1jovwxm\">+page.svelte</span><!--]--><!--]--></nav><!--]--><!----> <h1 itemprop=\"headline\"><!---->Set up <span>GitHub Actions</span><!----></h1> <div class=\"after-header svelte-x84cjg\"><ul class=\"authors byline svelte-ocxnsb\"><!--[--><li class=\"author ramil svelte-ocxnsb\" itemprop=\"author\" itemscope=\"\" itemtype=\"https://schema.org/Organization\"><!--[0--><picture><!--[--><source type=\"image/avif\" srcset=\"/_app/immutable/assets/ramil.DJHUn9oQ.avif 197w\" sizes=\"48px\"/><!--]--> <img src=\"/_app/immutable/assets/ramil.Dcc4DoX5.avif\" alt=\"\" loading=\"lazy\" style=\"aspect-ratio: 1; background-image: url(/_app/immutable/assets/ramil.DjQEOsBN.avif); background-size: cover;\" onload=\"this.__e=event\" onerror=\"this.__e=event\"/></picture><!--]--> <span class=\"meta svelte-ocxnsb\"><span class=\"name svelte-ocxnsb\" itemprop=\"name\">Ramil Karimov</span> <!--[0--><span class=\"role svelte-ocxnsb\">developer</span><!--]--></span></li><!--]--></ul><!----></div> <!--[0--><div class=\"info svelte-x84cjg\"><time datetime=\"2026-01-23\" itemprop=\"datePublished\">January 23</time><!----> <!--[0--><span>·  Updated on</span> <time class=\"updated\" datetime=\"2026-04-17\" itemprop=\"dateModified\">April 17</time><!----><!--]--> <!--[-1--><!--]--><!----> <!--[-1--><!--]--></div><!--]--><!----></section> <section><p>Configure GitHub Actions for automated builds, linting, and deployment.</p> <h2 id=\"subtasks\">Subtasks</h2> <h3>1. CI workflow</h3> <ul><li>Create <code>.github/workflows/ci.yml</code></li> <li>Configure pnpm caching for faster installs</li> <li>Add linting job (<code>pnpm lint</code>)</li> <li>Add type-checking job (<code>pnpm check</code>)</li> <li>Add build job (<code>pnpm build</code>)</li> <li>Run on push and PR to <code>main</code></li></ul> <h3>2. Deployment workflow</h3> <ul><li>Create <code>.github/workflows/deploy.yml</code></li> <li>Build and deploy to GitHub Pages (or target host)</li> <li>Run only on push to <code>main</code></li></ul> <h3>3. Quality gates</h3> <ul><li>Require CI to pass before merging PRs</li> <li>Add branch protection rules for <code>main</code></li></ul> <h2 id=\"workflow-structure\">Workflow Structure</h2> <ul><li><strong>on push/PR to main</strong>: Run lint, check, build</li> <li><strong>on push to main</strong>: Deploy to production</li></ul> <div class=\"ids__space XS\"></div><!----></section> <!--[0--><section class=\"read-next\"><!--[-1--><!--]--><!----></section> <section class=\"call-to-action\"><div class=\"cta  svelte-82cwq4\" itemscope=\"\" itemtype=\"https://schema.org/Offer\"><div class=\"cover-for-small svelte-82cwq4\"></div> <svg class=\"big-logo svelte-82cwq4\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-20 0 190 190\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" class=\"svelte-82cwq4\"></path></svg> <svg class=\"logo svelte-82cwq4\" viewBox=\"-20 0 190 190\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M110.16 123.68L107.74 130.45C107.74 130.45 99.84 129.02 93.07 130.61C86.3 132.2 57.63 143.09 57.63 143.09C57.63 143.09 54.24 146.61 51.96 149.09C48.36 153.21 41.96 151.24 43.88 142.83C42.02 141.12 39.88 136.92 39.88 136.92L43.6 131.92C43.6 131.92 49.6 136.78 55.22 135.22C56.94 134.74 61.13 133.33 66.11 131.61C61.75 129.34 58.24 127.52 56.93 126.87C50.93 123.87 50.08 126.87 44.68 126.11C41.62 125.66 39.09 118.5 44.6 117.73C42.9 115.44 45.38 109.96 45.38 109.96L51.38 108.34C51.38 108.34 52.32 115.97 61.67 120.83C64.3 122.19 70 125.26 75.67 128.26C84.48 125.14 92.67 122.19 92.67 122.19C92.67 122.19 97.55 115.47 98.92 113.04C105.53 110.32 108.71 116.18 105.68 120.04C107.9 120.44 110.16 123.68 110.16 123.68ZM88.66 116.37L64.9 116C65.9 103 64.52 100.6 55.08 97.3C50.65 82.54 58.15 59.56 83.32 62.65C108.49 65.74 108.7 88.26 102.13 101.51C91.3 102.26 89.87 105.43 88.66 116.37ZM72.24 82.9C62.82 81.74 60.61 96 70.64 97.21C79.81 98.34 81.62 84.05 72.24 82.9ZM89.94 88.2C83.35 87.39 81.8 97.35 88.82 98.2C95.23 99 96.5 89 89.94 88.2ZM87.09 137.88L89.72 135.27C99.46 139.19 104.98 135.86 104.98 135.86L108.75 141.74C108.75 141.74 106.39 146.47 103.66 146.92C107.75 152.36 100.51 157.09 97.01 154.54C95.15 149.66 93.62 145.99 93.62 145.99L82.26 139.99L84.16 137.33L87.09 137.88Z\" fill=\"white\" class=\"svelte-82cwq4\"></path></svg> <div class=\"description svelte-82cwq4\"><p class=\"title svelte-82cwq4\" itemprop=\"name\">Automate everything</p> <p class=\"subtitle svelte-82cwq4\" itemprop=\"description\">CI/CD pipeline with GitHub Actions</p> <a class=\"button svelte-82cwq4\" href=\"https://sveleton.ramilkarimov.me/\" itemprop=\"url\">Get Started</a> <div itemprop=\"seller\" itemscope=\"\" itemtype=\"https://schema.org/Organization\" style=\"display: none;\"><meta itemprop=\"name\" content=\"Sveleton\"/> <meta itemprop=\"url\" content=\"https://sveleton.com/\"/></div></div> <div class=\"arrow svelte-82cwq4\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 -960 960 960\" fill=\"#fff\" aria-hidden=\"true\" class=\"svelte-82cwq4\"><path d=\"M647-440H160v-80h487L423-744l57-56 320 320-320 320-57-56 224-224Z\" class=\"svelte-82cwq4\"></path></svg></div></div><!----></section><!--]--></article><!--]-->"},{"id":"/reports/","url":"/reports/","relPath":"/reports/","title":"Reports","summary":"","image":"","excluded":true,"wordCount":1,"date_published":"2024-01-01T00:00:00-00:00","content_html":"<!--[--><div class=\"ids__wrapper-wide\"><h1>Reports</h1> <div class=\"articles svelte-1s2ms6o compact\"><!--[--><!--]--> <!--[-1--><!--]--></div><!----></div><!--]-->"},{"id":"/glossary/","url":"/glossary/","relPath":"/glossary/","title":"Glossary","summary":"","image":"","wordCount":219,"date_published":"2024-01-01T00:00:00-00:00","content_html":"<!--[--><div class=\"ids__wrapper-wide glossary\"><h1>Glossary</h1> <dl><dt>CTA</dt> <dd>Call to Action. A prompt encouraging the reader to take a specific action,\n      such as subscribing or reading more.</dd> <dt>IDS</dt> <dd>Intuition Design System. The design system that provides styles,\n      components, and conventions used throughout the project.</dd> <dt>LQIP</dt> <dd>Low Quality Image Placeholder. A tiny blurred preview of an image\n      displayed while the full-resolution version loads.</dd> <dt>NavAnchor</dt> <dd>A navigation anchor component that creates linkable sections within a\n      page, used for in-page table of contents.</dd> <dt>PageMeta</dt> <dd>A TypeScript type describing page metadata: title, description, date,\n      authors, tags, and sort order. Exported from each page's module script.</dd> <dt>Publication</dt> <dd>The main content wrapper component providing article layout, heading slot,\n      and an optional CTA section.</dd> <dt>Remote Functions</dt> <dd>A SvelteKit experimental feature that allows server-side functions to be\n      called from the client. Used for prerendering page metadata.</dd> <dt>Sitemap</dt> <dd>A page listing all routes in the project, organized hierarchically for\n      navigation and SEO.</dd> <dt>Sveleton</dt> <dd>This project. A bootstrap template built on the Intuition Design System\n      for quick-starting media projects with SvelteKit.</dd> <dt>SvelteKit</dt> <dd>The full-stack framework powering this project, used here as a static site\n      generator with the static adapter.</dd> <dt>TodoCover</dt> <dd>A component rendering the visual cover for todo pages, with states: new,\n      done, and canceled.</dd> <dt>vite-imagetools</dt> <dd>A Vite plugin for image optimization. Configured with default directives\n      to produce AVIF format, responsive widths, and LQIP automatically.</dd></dl></div><!--]-->"}]}