<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="en">
	<title>Estela Franco</title>
	<subtitle>Hello and welcome to my personal website! Here I share about web performance, technical SEO and web development.</subtitle>
	<link href="https://estelafranco.com/feed/feed.xml" rel="self"/>
	<link href="https://estelafranco.com/"/>
	<updated>2025-04-17T00:00:00Z</updated>
	<id>https://estelafranco.com</id>
	<author>
		<name>Estela Franco</name>
		<email>estela.francoc@gmail.com</email>
	</author>
	
	<entry>
		<title>The modern web can do more than you think</title>
		<link href="https://estelafranco.com/blog/web-capabilities/"/>
		<updated>2025-04-17T00:00:00Z</updated>
		<id>https://estelafranco.com/blog/web-capabilities/</id>
		<content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;span style=&quot;color:var(--lightgray)&quot;&gt;&lt;em&gt;This is the first post in a new series where I&#39;ll explore the native powers of the modern web and why they matter more than ever.&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;the-web&#39;s-not-dead&quot; tabindex=&quot;-1&quot;&gt;The web&#39;s not dead &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/web-capabilities/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;No, the web&#39;s not dead. Far from it, it&#39;s just getting &lt;em&gt;really&lt;/em&gt; good. Intrigued? Please continue reading.&lt;/p&gt;
&lt;p&gt;Lately, I&#39;ve found myself way more curious about what browsers can actually do. I&#39;ve always loved the open nature of the web, and unless I absolutely have to, I don&#39;t want to install another app on my mobile. I&#39;m tired (ok, &lt;em&gt;tired&lt;/em&gt; is not the word I have in mind, but I&#39;m trying to be polite) of being forced to download an app just to do a basic task. It&#39;s frustrating how many websites still assume you&#39;ll install their app to get the &amp;quot;real&amp;quot; experience, leaving the mobile web version slow, clumsy, or missing key features.&lt;/p&gt;
&lt;p&gt;But here&#39;s the thing: it doesn&#39;t have to be that way.&lt;/p&gt;
&lt;p&gt;Modern browsers have leveled up. The web now supports features that used to be exclusive to native apps such as offline storage, background sync, push notifications, or even installing apps to your home screen. And you can use all of it without the overhead of an app store, a native wrapper, or a multi-week dev cycle just to push a fix.&lt;/p&gt;
&lt;p&gt;This series is all about those &lt;strong&gt;powerful browser features&lt;/strong&gt;: what they are, why they matter, and how to use them to build fast, capable, user-friendly web apps.&lt;/p&gt;
&lt;h2 id=&quot;why-this-is-important&quot; tabindex=&quot;-1&quot;&gt;Why this is important &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/web-capabilities/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The web has become a universal space, offering a significant advantage in accessibility. Unlike native apps that require users to find, download, and install specific software for their device, websites are by nature more open. A simple web address allows almost anyone with an internet connection to instantly access your content, making it easier to reach a wider audience and be more inclusive.&lt;/p&gt;
&lt;p&gt;However, people expect more from the web now. They want fast loading, offline access, background updates, and smooth, native-feeling interactions.&lt;/p&gt;
&lt;p&gt;And luckily, the browser is ready to deliver. We just need to start using it right.&lt;/p&gt;
&lt;h2 id=&quot;what-you&#39;ll-learn-in-this-series&quot; tabindex=&quot;-1&quot;&gt;What you&#39;ll learn in this series &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/web-capabilities/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I&#39;ll go hands-on with the tools that are evolving the web even beyond the typical &amp;quot;app feel&amp;quot;. I&#39;ll show you how to leverage today&#39;s web capabilities to push the boundaries and unlock the full potential of the native web. Here&#39;s what&#39;s coming:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Native web APIs that rival native apps&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;App-like experience and offline capabilities (beyond PWAs)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Integration with hardware and OS&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Progressive enhancement that actually works&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Trustworthy UX using permissions &amp;amp; privacy controls&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;...and what&#39;s coming next in Chrome, Firefox, and friends&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/web-capabilities/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This isn&#39;t about replacing native apps. It&#39;s about knowing when you don&#39;t need one — and building smarter, leaner experiences on the platform that&#39;s already in every user&#39;s pocket.&lt;/p&gt;
&lt;p&gt;And let&#39;s end this first chapter with a simple question: &lt;strong&gt;What actually makes a web app feel like a real app?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We&#39;ll explore that in Chapter 2.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Create a Blog with Eleventy and Storyblok</title>
		<link href="https://estelafranco.com/blog/eleventy-storyblok-3/"/>
		<updated>2024-05-13T00:00:00Z</updated>
		<id>https://estelafranco.com/blog/eleventy-storyblok-3/</id>
		<content type="html">&lt;p&gt;&lt;span style=&quot;color:var(--lightgray)&quot;&gt;&lt;em&gt;This is the third post in a series of articles called &amp;quot;Eleventy and Storyblok&amp;quot; to learn how to use this combination to create a web project.&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;border-radius=10px;background-color:var(--lightwhite);color:var(--darkergray);padding:0.5em;border-radius:10px;&quot;&gt;
&lt;p&gt;&lt;span&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Too much text for you? Don&#39;t worry! You have all the code described in this tutorial in this template repository: &lt;a style=&quot;color:#0c64f2;&quot; href=&quot;https://github.com/guaca/11ty-storyblok-template/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/guaca/11ty-storyblok-template/&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Keep in mind, however, that you will need to create your &lt;strong&gt;.env&lt;/strong&gt; file with the proper variables described in this article for the template to work.&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Now that you&#39;re familiar with why &lt;a href=&quot;https://www.11ty.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Eleventy&lt;/a&gt; + &lt;a href=&quot;https://get.storyblok.com/estela-franco-cuenca&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Storyblok&lt;/a&gt; is my ideal combination and how to seamlessly query data from Storyblok for use in an Eleventy project, it&#39;s time for the next exciting step: let&#39;s embark on creating a complete blog site using these two phenomenal technologies!&lt;/p&gt;
&lt;h2 id=&quot;creating-the-blog-architecture-in-storyblok&quot; tabindex=&quot;-1&quot;&gt;Creating the Blog Architecture in Storyblok &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The desired blog content architecture has the following levels:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;├── Homepage
├── articles
│   └── article-1
│   └── article-2
│   └── article-n
├── categories
│   └── category-1
│   └── category-2
│   └── category-n
└── authors
    └── author-1
    └── author-2
    └── author-n
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So first you need to create a new site in Storyblok (you already learned how to do this in my &lt;a href=&quot;https://estelafranco.com/blog/eleventy-storyblok-2/&quot; target=&quot;_blank&quot;&gt;previous article&lt;/a&gt;). Got it? Then let&#39;s create the data architecture and some initial content in it!&lt;/p&gt;
&lt;h3 id=&quot;removing-the-boilerplate-content&quot; tabindex=&quot;-1&quot;&gt;Removing the boilerplate content &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Remove the default content that &lt;a href=&quot;https://get.storyblok.com/estela-franco-cuenca&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Storyblok&lt;/a&gt; adds when you create a new site. We will create the blocks and stories we need from scratch.&lt;/p&gt;
&lt;h3 id=&quot;creating-the-initial-blocks:-author-and-category&quot; tabindex=&quot;-1&quot;&gt;Creating the initial Blocks: Author and Category &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Let&#39;s start by creating the &lt;code&gt;Author&lt;/code&gt; type. To do this, go to the &lt;code&gt;Block Library&lt;/code&gt; (which should be empty if you have deleted all the default blocks) tab and create a new block named &lt;code&gt;Author&lt;/code&gt;. Select the option &lt;code&gt;Content type block&lt;/code&gt;.&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/create-author-block.webp&quot; alt=&quot;Create new block form. The technical name field is filled with Author. The content type block option is checked&quot; loading=&quot;lazy&quot;&gt;
&lt;p&gt;Let&#39;s edit it and define the required fields:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name (text)&lt;/li&gt;
&lt;li&gt;Bio (textarea)&lt;/li&gt;
&lt;li&gt;Avatar (asset - images)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Remember to mark them as &lt;code&gt;Required field&lt;/code&gt; if they are mandatory.&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/create-author-block-fields.webp&quot; alt=&quot;Fields of the Author block: Name, Bio and Avatar&quot; loading=&quot;lazy&quot;&gt;
&lt;p&gt;Let&#39;s repeat the process to create the &lt;code&gt;Category&lt;/code&gt; type. Still in the &lt;code&gt;Block Library&lt;/code&gt;, create a new &lt;code&gt;Content type block&lt;/code&gt; type. In this case, the name is &lt;code&gt;Category&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In this case, and to keep it simple for this tutorial, I have only defined one field called (surprise) &lt;code&gt;Category&lt;/code&gt;.&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/create-category-block.webp&quot; alt=&quot;The Category blok only has a field in it, and it is called Category&quot; loading=&quot;lazy&quot;&gt;
&lt;h2 id=&quot;creating-the-first-stories:-authors-and-categories&quot; tabindex=&quot;-1&quot;&gt;Creating the first stories: Authors and Categories &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now that we have created two content types, let&#39;s create the first stories! To do that, go to the &lt;code&gt;Content&lt;/code&gt; section (which should be empty) and create a new &lt;code&gt;Folder&lt;/code&gt;.&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/create-content-folder.webp&quot; alt=&quot;There is a menu under the &#39;Create new&#39; button with two options: Story or Folder&quot; loading=&quot;lazy&quot;&gt;
&lt;p&gt;Let&#39;s start with the &lt;code&gt;Authors&lt;/code&gt;! During the definition of the folder, restrict the content type to &lt;code&gt;Author&lt;/code&gt;. I also recommend you to check the &lt;code&gt;Disable visual editor (Form only)&lt;/code&gt; as we won&#39;t use the visual editor in this tutorial.&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/create-authors-folder.webp&quot; alt=&quot;New Folder form, with the fields Name (Authors), Slug (authors), Parent folder (Root), Content type (Restrict to content types - Author) and Folder content settings (disable visual editor option is checked)&quot; loading=&quot;lazy&quot;&gt;
&lt;p&gt;You&#39;re now inside the (empty) Authors folder. Create a new &lt;code&gt;Story&lt;/code&gt;. The pop-up will ask you for some basic data:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name (required). Let&#39;s create the &lt;code&gt;Author 1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Slug (it&#39;s generated based on the name).&lt;/li&gt;
&lt;li&gt;Parent folder. In this case, the Authors folder is the parent folder.&lt;/li&gt;
&lt;li&gt;Content type (required). Select &lt;code&gt;Author&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/create-author-story-basic-info.webp&quot; alt=&quot;New Content Story form, with the fields Name (Author 1), Slug (author-1), Parent folder (Authors), and Content type (Author)&quot; loading=&quot;lazy&quot;&gt;
&lt;p&gt;In the next screen, you will see the form with the fields that we defined when creating the &lt;code&gt;Author&lt;/code&gt; type. Fill them and hit &lt;code&gt;Save&lt;/code&gt;.&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/create-author-story-fields.webp&quot; alt=&quot;Author 1 form, with the fields Name, Bio and Avatar&quot; loading=&quot;lazy&quot;&gt;
&lt;p&gt;You can repeat the process and create some more authors. In my case, I have created another one, called (surprise) &lt;code&gt;Author 2&lt;/code&gt;.&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/author-stories.webp&quot; alt=&quot;Authors folder has two stories in it: Author 1 and Author 2&quot; loading=&quot;lazy&quot;&gt;
&lt;p&gt;Let&#39;s now move on and create some &lt;code&gt;Categories&lt;/code&gt;. You can repeat the process and create the &lt;code&gt;Categories&lt;/code&gt; folder, which should be restricted to the &lt;code&gt;Category&lt;/code&gt; content type. Remember to check the &lt;code&gt;Disable visual editor (Form only)&lt;/code&gt; checkbox as we&#39;re not using this feature in this tutorial.&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/create-categories-folder.webp&quot; alt=&quot;New Folder form, with the fields Name (Categories), Slug (categories), Parent folder (Root), Content type (Restrict to content types - Category) and Folder content settings (disable visual editor option is checked)&quot; loading=&quot;lazy&quot;&gt;
&lt;p&gt;Now that you&#39;re inside the &lt;code&gt;Categories&lt;/code&gt; folder, create a new story. In this case, it also asks you for some basic information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name (required). For this example, I&#39;m super creative and I have created the &lt;code&gt;Category One&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Slug (it&#39;s generated from the name).&lt;/li&gt;
&lt;li&gt;Parent folder: Categories.&lt;/li&gt;
&lt;li&gt;Content type: Select &lt;code&gt;Category&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;In the next screen, you will see the category form asking for the &lt;code&gt;Category&lt;/code&gt;. In this basic example, this field is also &lt;code&gt;Category One&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/create-category-one.webp&quot; alt=&quot;New Content Story form, with the fields Name (Category One), Slug (category-one), Parent folder (Categories) and Content type (Category)&quot; loading=&quot;lazy&quot;&gt;
&lt;h2 id=&quot;and-what-about-the-articles&quot; tabindex=&quot;-1&quot;&gt;And what about the Articles? &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yes, I know. This is supposed to be a blog site, but I haven&#39;t covered the articles yet, right? That&#39;s because we&#39;re going step by step. And this is the step to start creating Articles.&lt;/p&gt;
&lt;p&gt;Let&#39;s start by creating the &lt;code&gt;Article&lt;/code&gt; content type. Remember how to do this? Correct! Go to the &lt;code&gt;Block Library&lt;/code&gt; and create a new &lt;code&gt;Block&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Technical name: Article.&lt;/li&gt;
&lt;li&gt;Select block type: Content type block.
And press &lt;code&gt;Add Block&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/create-article-block.webp&quot; alt=&quot;Create new block form. The technical name field is filled with Article. The Content type block option is checked&quot; loading=&quot;lazy&quot;&gt;
&lt;p&gt;Now edit it to add the fields.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Title: Text.&lt;/li&gt;
&lt;li&gt;PublicationDate: Date/Time.&lt;/li&gt;
&lt;li&gt;Author. And that&#39;s why we created the authors first! Choose the &lt;code&gt;Single-Option&lt;/code&gt; type and choose the following source details:
&lt;ul&gt;
&lt;li&gt;Source: stories&lt;/li&gt;
&lt;li&gt;Path to the folder of stories: authors/&lt;/li&gt;
&lt;li&gt;Restrict to content type: Author&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Category. Similar to what we have done for &lt;code&gt;Author&lt;/code&gt;. It is also a &lt;code&gt;Single-Option&lt;/code&gt; type and these are the source details:
&lt;ul&gt;
&lt;li&gt;Source: stories&lt;/li&gt;
&lt;li&gt;Path to the folder of stories: categories/&lt;/li&gt;
&lt;li&gt;Restrict to content type: Category&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Body. Select &lt;code&gt;Markdown&lt;/code&gt;, but check the &lt;code&gt;Rich-text as default&lt;/code&gt; checkbox. This will allow you to have a WYSIWYG interface, but it will be saved (and served) as Markdown. As I mentioned in the first article of this series, Markdown is one of the template languages that you can use in your project. Therefore, choosing &lt;code&gt;Markdown&lt;/code&gt; will be easier to manage than using the &lt;code&gt;Richtext&lt;/code&gt; option.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And you already have the &lt;code&gt;Article&lt;/code&gt; block created!&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/create-article-block-fields.webp&quot; alt=&quot;Create new block form. The technical name field is filled with Article. The Content type block option is checked&quot; loading=&quot;lazy&quot;&gt;
&lt;p&gt;Let&#39;s now create the first article. Go to the &lt;code&gt;Content&lt;/code&gt; section and create a new &lt;code&gt;Folder&lt;/code&gt; called &lt;code&gt;Articles&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name: Articles.&lt;/li&gt;
&lt;li&gt;Slug (it&#39;s generated from the Name).&lt;/li&gt;
&lt;li&gt;Parent folder: Root.&lt;/li&gt;
&lt;li&gt;Content type: Restrict content types to Articles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once again, remember to disable the visual editor (Form only).&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/create-article-one-basic-info.webp&quot; alt=&quot;Create new content story form with the fields Name (Article 1), Slug (article-1), Parent folder (Articles) and Content type (Article). The Content type block option is checked&quot; loading=&quot;lazy&quot;&gt;
&lt;p&gt;And now you will see the form to create your first article. You&#39;ve seen that I am being very creative with the content I&#39;m using in this new blog site, so you won&#39;t be surprised by my first article:&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/create-article-one.webp&quot; alt=&quot;Create new block form. The technical name field is filled with Article. The Content type block option is checked&quot; loading=&quot;lazy&quot;&gt;
&lt;p&gt;As you can see, the Author and Category were selected from the drop-down list.&lt;/p&gt;
&lt;p&gt;You can repeat these steps to generate a few more articles. I have created a total of 3 articles for this tutorial.&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/articles-storyblok.webp&quot; alt=&quot;The Articles folder with tree articles in it: Article 1, Article 2 and Article 3&quot; loading=&quot;lazy&quot;&gt;
&lt;h2 id=&quot;creating-a-homepage&quot; tabindex=&quot;-1&quot;&gt;Creating a Homepage &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Last but not least, we need a homepage for our brand new blog site. You&#39;ve seen how creative I&#39;ve been with the rest of the content. So, the homepage can&#39;t be any different!&lt;/p&gt;
&lt;p&gt;Let&#39;s create the &lt;code&gt;Block&lt;/code&gt; first. As usual, go to the &lt;code&gt;Block library&lt;/code&gt; and create a new one with the following information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Technical name: Page (I used this, but feel free to use whatever works better for you).&lt;/li&gt;
&lt;li&gt;Select block type: Content type block.&lt;/li&gt;
&lt;/ul&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/create-page-block.webp&quot; alt=&quot;Create new block form. The technical name is set to Page and &#39;content type block&#39; is the selected block type&quot; loading=&quot;lazy&quot;&gt;
&lt;p&gt;And now, let&#39;s define the fields:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Heading: Text.&lt;/li&gt;
&lt;li&gt;Subtitle: Text.&lt;/li&gt;
&lt;li&gt;Highlights: Multi-Options
&lt;ul&gt;
&lt;li&gt;Source: Stories&lt;/li&gt;
&lt;li&gt;Path to folder of stories: articles/&lt;/li&gt;
&lt;li&gt;Restrict to content type: Article&lt;/li&gt;
&lt;li&gt;Minimum: 3&lt;/li&gt;
&lt;li&gt;Maximum: 5&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, our homepage will have a heading, a subtitle and a list of the top articles.&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/create-page-block-fields.webp&quot; alt=&quot;Create new block form. The technical name is set to Page and &#39;content type block&#39; is the selected block type&quot; loading=&quot;lazy&quot;&gt;
&lt;p&gt;Let&#39;s now create the homepage content. Go to &lt;code&gt;Content&lt;/code&gt;, create a new Story and the pop-up will ask you for some basic information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name (required)&lt;/li&gt;
&lt;li&gt;Slug (it&#39;s generated from the name)&lt;/li&gt;
&lt;li&gt;Parent folder: Root&lt;/li&gt;
&lt;li&gt;Content type: Page&lt;/li&gt;
&lt;/ul&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/create-content-home.webp&quot; alt=&quot;New content story form. The name is set to Home, slug is home, parent folder is root and content type is set to page&quot; loading=&quot;lazy&quot;&gt;
&lt;p&gt;On the next screen, you will see the visual editor enabled. This is happening because Storyblok does offer to disable the visual editor when creating a Folder, but not when creating a Story. Let&#39;s disable it as we&#39;re not going to use it in this tutorial.&lt;/p&gt;
&lt;p&gt;To do it, access the &lt;code&gt;Entry configuration&lt;/code&gt; from the navbar above the visual editor. This will open a pop-up and you will see the &lt;code&gt;Edit mode&lt;/code&gt; options. Check the &lt;code&gt;Form-only&lt;/code&gt; one.&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/disable-visual-editor.webp&quot; alt=&quot;There is a pop-up named &#39;Entry configuration&#39;. The Edit mode is set to &#39;form-only&#39;&quot; loading=&quot;lazy&quot;&gt;
&lt;p&gt;Ok, it looks easier this way, right? Let&#39;s fill the fields with my already-famous creative content:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Heading: This is the Homepage&lt;/li&gt;
&lt;li&gt;Subtitle: Welcome to the homepage of this amazing web site!&lt;/li&gt;
&lt;li&gt;Highlights: In my example, I created 3 articles and I will select them all. An important detail: it&#39;s a reordable drag-and-drop list, so feel free to sort them however you like.&lt;/li&gt;
&lt;/ul&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/create-content-home-fields.webp&quot; alt=&quot;Home page form, with the heading (This is the homepage), subtitle (Welcome to the homepage of this amazing web site!) and highlights (article 3, article 1 and article 2)&quot; loading=&quot;lazy&quot;&gt;
&lt;p&gt;And that&#39;s it! You have your headless CMS created and ready to generate new content.&lt;/p&gt;
&lt;h2 id=&quot;wait.-and-what-about-seo&quot; tabindex=&quot;-1&quot;&gt;Wait. And what about SEO? &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If this question has crossed your mind, THANK YOU! Because we need more people who care about making our sites &amp;quot;SEO friendly&amp;quot; since the first stage of the project.&lt;/p&gt;
&lt;p&gt;And if you haven&#39;t thought about it, don&#39;t worry. I&#39;m here to add this topic just in time.&lt;/p&gt;
&lt;h3 id=&quot;create-the-seo-block&quot; tabindex=&quot;-1&quot;&gt;Create the SEO block &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Let&#39;s go to the &lt;code&gt;Block Library&lt;/code&gt; and create a new nestable block. Call it &lt;code&gt;SEO&lt;/code&gt;. Define a minimum and maximum of 1 block.&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/create-seo-block.webp&quot; alt=&quot;Create new block form. The technical name is set to SEO, and the &#39;nestable block&#39; is the selected block type.&quot; loading=&quot;lazy&quot;&gt;
&lt;p&gt;Add the following fields:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;title: text.&lt;/li&gt;
&lt;li&gt;description: text.&lt;/li&gt;
&lt;li&gt;canonical: text.&lt;/li&gt;
&lt;li&gt;noindex: boolean. The default value will be disabled.&lt;/li&gt;
&lt;li&gt;og_title: text.&lt;/li&gt;
&lt;li&gt;og_description: text.&lt;/li&gt;
&lt;li&gt;og_image: asset (image).&lt;/li&gt;
&lt;/ul&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/create-seo-block-fields.webp&quot; alt=&quot;The pop-up shows the fields that have been created: title, description, noindex, canonical, og_title, og_description and og_image.&quot; loading=&quot;lazy&quot;&gt;
&lt;h3 id=&quot;add-the-seo-block-to-the-other-blocks&quot; tabindex=&quot;-1&quot;&gt;Add the SEO block to the other blocks &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We want to be able to define the proper SEO and Social Media data for all the stories we have already created, so we need to add it to the related content types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Article&lt;/li&gt;
&lt;li&gt;Author&lt;/li&gt;
&lt;li&gt;Category&lt;/li&gt;
&lt;li&gt;Page&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you&#39;ve added the SEO block to them, you can access the content and add the SEO data:&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/add-seo-block-article.webp&quot; alt=&quot;The pop-up shows the fields that have been created: title, description, noindex, canonical, og_title, og_description and og_image.&quot; loading=&quot;lazy&quot;&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/add-seo-block-article-one.webp&quot; alt=&quot;The pop-up shows the fields that have been created: title, description, noindex, canonical, og_title, og_description and og_image.&quot; loading=&quot;lazy&quot;&gt;
&lt;h2 id=&quot;creating-the-eleventy-project&quot; tabindex=&quot;-1&quot;&gt;Creating the Eleventy project &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Alright, you&#39;ve got the content, but now it&#39;s time to build the site that will put that content to use, right? The following steps will help you achieve the desired project structure:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;├── src
│   └── _data
│   │    └── articles.js
│   │    └── authors.js
│   │    └── categories.js
│   │    └── home.js
│   │    └── metadata.json
│   └── includes
│   │    └── layouts
│   │    │    └── base.njk
│   │    └── footer.njk
│   │    └── head.njk
│   │    └── header.njk
│   └── public
│   │   └── css
│   │       └── styles.css
│   └── utils
│   │   └── storyblok.js
│   └── article-page.njk
│   └── articles-list.njk
│   └── author-page.njk
│   └── authors-list.njk
│   └── category-page.njk
│   └── categories-list.njk
│   └── index.njk
└── eleventy.js
└── .env
└── .gitignore
└── package.json
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;setting-up-and-configuring-the-eleventy-project&quot; tabindex=&quot;-1&quot;&gt;Setting up and configuring the Eleventy project &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You already learned how to do this in my &lt;a href=&quot;https://estelafranco.com/blog/eleventy-storyblok-2/&quot;&gt;previous article&lt;/a&gt;, so I&#39;ll make it faster this time.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4 id=&quot;1.-create-and-access-your-project-(and-open-it-using-vscode)&quot; tabindex=&quot;-1&quot;&gt;1. Create and access your project (and open it using VSCode) &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;mkdir myproject
cd myproject
code .
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;h4 id=&quot;2.-create-your-package.json-file-in-the-root-directory-and-paste-the-following-lines:&quot; tabindex=&quot;-1&quot;&gt;2. Create your &lt;code&gt;package.json&lt;/code&gt; file in the root directory and paste the following lines: &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token string-property property&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token string-property property&quot;&gt;&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;npx @11ty/eleventy&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token string-property property&quot;&gt;&quot;start&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;npx @11ty/eleventy --serve&quot;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token string-property property&quot;&gt;&quot;devDependencies&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token string-property property&quot;&gt;&quot;@11ty/eleventy&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^2.0.1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token string-property property&quot;&gt;&quot;dotenv&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^16.4.1&quot;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;h4 id=&quot;3.-install-dependencies&quot; tabindex=&quot;-1&quot;&gt;3. Install dependencies &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;npm install
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;4.-create-the-.env-file-in-the-root-directory&quot; tabindex=&quot;-1&quot;&gt;4. Create the &lt;code&gt;.env&lt;/code&gt; file in the root directory &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;STORYBLOK_API_KEY&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;[your-storyblok-token-goes-here]&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;DOMAIN&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;[your-website-domain-goes-here]&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;5.-create-the-eleventy.js-config-file&quot; tabindex=&quot;-1&quot;&gt;5. Create the &lt;code&gt;eleventy.js&lt;/code&gt; config file &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;dotenv&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;eleventyConfig&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token comment&quot;&gt;// Add the .env domain as GlobalData to use in SEO meta data&lt;/span&gt;&lt;br&gt; eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addGlobalData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;domain&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;DOMAIN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token comment&quot;&gt;// Add the current year ad GlobalData to use in the footer &lt;/span&gt;&lt;br&gt; eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addGlobalData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;year&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getFullYear&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token comment&quot;&gt;// Filter articles by Author slug&lt;/span&gt;&lt;br&gt; eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addFilter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;filterArticlesByAuthor&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;articles&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; authorFullSlug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; filteredArticles &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; articles&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;article&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; article&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Author&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fullSlug &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; authorFullSlug&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token comment&quot;&gt;// Sort the filtered articles by PublicationDate in descending order&lt;/span&gt;&lt;br&gt;   filteredArticles&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;b&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PublicationDate&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PublicationDate&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; filteredArticles&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;span class=&quot;token comment&quot;&gt;// Filter articles by Category slug&lt;/span&gt;&lt;br&gt; eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addFilter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;filterArticlesByCategory&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;articles&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; categoryFullSlug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; filteredArticles &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; articles&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;article&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; article&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Category&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fullSlug &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; categoryFullSlug&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token comment&quot;&gt;// Sort the filtered articles by PublicationDate in descending order&lt;/span&gt;&lt;br&gt;   filteredArticles&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;b&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PublicationDate&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PublicationDate&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; filteredArticles&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt; &lt;span class=&quot;token comment&quot;&gt;// Sort the authors  by name: &lt;/span&gt;&lt;br&gt; eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addFilter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;sortAuthorsByName&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;authors&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; authors&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;localeCompare&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;b&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt; &lt;span class=&quot;token comment&quot;&gt;// Pass Trhough Copy&lt;/span&gt;&lt;br&gt; eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addPassthroughCopy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token string-property property&quot;&gt;&quot;./src/public/&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token literal-property property&quot;&gt;dir&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span class=&quot;token literal-property property&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;src&#39;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What have we done here? Let&#39;s go one by one:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Initializing &lt;code&gt;dotenv&lt;/code&gt;
This initial line populates env variables into process.env and makes it available in the config file.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add Global Data
We&#39;re adding the &lt;code&gt;DOMAIN&lt;/code&gt; enviroment variable as Global Data, ensuring it&#39;s available throughout the project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Filter articles by Author
We&#39;ve defined a new filter to retrieve articles authored by a specific author. This filter will be applied on the Author&#39;s page to list all articles authored by that individual. Additionally, the articles will be sorted by PublicationDate in descending order.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Filter articles by Category
Similar to the previous filter, here we&#39;re filtering articles belonging to a specific Category. This filter will be utilized on the Category&#39;s page to list all articles within that particular Category. Once again, the articles are sorted by PublicationDate in descending order.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sort authors by name
This filter enables us to arrange the list of authors alphabetically by their names.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;6.-create-the-src-greater-_data-greater-metadata.json-file&quot; tabindex=&quot;-1&quot;&gt;6. Create the &lt;code&gt;src &amp;gt; _data &amp;gt; metadata.json&lt;/code&gt; file &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token property&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;My site&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token property&quot;&gt;&quot;language&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;en&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Welcome to my blog site!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token property&quot;&gt;&quot;image&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;[fallback-image-for-social-media-goes-here]&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;7.-create-the-src-greater-_includes-greater-head.njk-file&quot; tabindex=&quot;-1&quot;&gt;7. Create the &lt;code&gt;src &amp;gt; _includes &amp;gt; head.njk&lt;/code&gt; file &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-njk&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;equiv&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;X-UA-Compatible&quot;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;IE=edge&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;viewport&quot;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;width=device-width, initial-scale=1.0&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;link&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/css/styles.css&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;description&quot;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;{{ description or metadata.description }}&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;link&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;canonical&quot;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;{{ canonical or domain+page.url }}&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;noindex&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;true&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;robots&quot;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;noindex&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;endif&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;property&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;og:title&quot;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;{{ og_title or title or metadata.title }}&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;property&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;og:description&quot;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;{{ og_description or description or metadata.description }}&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;property&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;og:image&quot;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;{{ og_image or metadata.image }}&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;twitter:card&quot;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;summary_large_image&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;twitter:title&quot;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;{{ og_title or title or metadata.title }}&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;twitter:image&quot;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;{{ og_image or metadata.image }}&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This might seem a bit overwhelming, right? It&#39;s because we&#39;re integrating Nunjucks variables and conditionals (using curly braces) with HTML tags. However, it&#39;s just as straightforward and incredible as you saw in the previous code.&lt;/p&gt;
&lt;p&gt;For example &lt;code&gt;&amp;lt;link rel=&amp;quot;canonical&amp;quot; href=&amp;quot;{{ canonical or domain+page.url }}&amp;quot;&amp;gt;&lt;/code&gt; generates a canonical link with the canonical URL sourced from the frontmatter data. If that&#39;s missing, it constructs a canonical URL by combining the domain (Global Data) with the URL of the current page. BOOM!&lt;/p&gt;
&lt;h4 id=&quot;8.-create-the-src-greater-_includes-greater-header.njk-file&quot; tabindex=&quot;-1&quot;&gt;8. Create the &lt;code&gt;src &amp;gt; _includes &amp;gt; header.njk&lt;/code&gt; file &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;nav&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;header-nav&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;header-home&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;My site&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;header-list&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;header-item&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/articles/&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Articles&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;header-item&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/authors/&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Authors&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;header-item&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/categories/&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Categories&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;nav&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;9.-create-the-src-greater-_includes-greater-footer.njk-file&quot; tabindex=&quot;-1&quot;&gt;9. Create the &lt;code&gt;src &amp;gt; _includes &amp;gt; footer.njk&lt;/code&gt; file &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-njk&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;footer&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   © &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;year&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;All&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;Rights&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;Reserved&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;footer&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;10.-create-the-src-greater-_includes-greater-layouts-greater-base.njk-file&quot; tabindex=&quot;-1&quot;&gt;10. Create the &lt;code&gt;src &amp;gt; _includes &amp;gt; layouts &amp;gt; base.njk&lt;/code&gt; file &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-njk&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;!&lt;span class=&quot;token variable&quot;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;html&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;{{ metadata.language }}&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;head.njk&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;header.njk&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;main&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;flex-grow:1;&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;safe&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;footer.njk&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That seemed a bit weird, didn&#39;t it? Let&#39;s break it down step by step.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;lang&lt;/code&gt; attribute in the HTML comes from the metadata.json file, where we&#39;ve set the language.&lt;/li&gt;
&lt;li&gt;We utilize &lt;code&gt;include&lt;/code&gt; to pull in the templates we&#39;ve created (&lt;code&gt;head&lt;/code&gt;, &lt;code&gt;header&lt;/code&gt; and &lt;code&gt;footer&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;11.-create-the-src-greater-utils-greater-storyblok.js-file&quot; tabindex=&quot;-1&quot;&gt;11. Create the &lt;code&gt;src &amp;gt; utils &amp;gt; storyblok.js&lt;/code&gt; file &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;dotenv&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetchAPI&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;query&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; variables&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; preview &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; res &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;https://gapi.storyblok.com/v1/api&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span class=&quot;token literal-property property&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;POST&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;     &lt;span class=&quot;token literal-property property&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token string-property property&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;application/json&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token literal-property property&quot;&gt;Token&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;STORYBLOK_TOKEN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token literal-property property&quot;&gt;Version&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;published&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;     &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;     &lt;span class=&quot;token literal-property property&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;       query&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;       variables&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;     &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;br&gt;   &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; json &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;errors&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;     console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;errors&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;     &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Failed to fetch API&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;   console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This code may sound familiar because we&#39;ve already covered it in the &lt;a href=&quot;https://estelafranco.com/blog/eleventy-storyblok-2/&quot; target=&quot;_blank&quot;&gt;previous article&lt;/a&gt;. Remember, I&#39;m using the &lt;code&gt;published&lt;/code&gt; version, but you might opt for the &lt;code&gt;draft&lt;/code&gt; version if this template isn&#39;t intended for a production site.&lt;/p&gt;
&lt;h4 id=&quot;12.-create-your-src-greater-_data-greater-articles.js-file.&quot; tabindex=&quot;-1&quot;&gt;12. Create your &lt;code&gt;src &amp;gt; _data &amp;gt; articles.js&lt;/code&gt; file. &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;It will generate the global &lt;code&gt;articles&lt;/code&gt; data file, which you&#39;ll utilize to create your article pages. This is the code for this file:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fetchAPI &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;../utils/storyblok.js&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getArticles&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetchAPI&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&lt;br&gt; {&lt;br&gt;   ArticleItems {&lt;br&gt;     items {&lt;br&gt;       full_slug&lt;br&gt;       content {&lt;br&gt;         Body&lt;br&gt;         PublicationDate&lt;br&gt;         Title&lt;br&gt;         Author {&lt;br&gt;           name&lt;br&gt;           fullSlug&lt;br&gt;         }&lt;br&gt;         Category {&lt;br&gt;           name&lt;br&gt;           fullSlug&lt;br&gt;         }&lt;br&gt;         SEO&lt;br&gt;       }&lt;br&gt;     }&lt;br&gt;   }&lt;br&gt; }  &lt;br&gt; &lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; data&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;ArticleItems&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;13.-create-the-src-greater-article-pages.njk-file&quot; tabindex=&quot;-1&quot;&gt;13. Create the &lt;code&gt;src  &amp;gt; article-pages.njk&lt;/code&gt; file &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-njk&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;pagination&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;articles&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;alias&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;permalink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ article.full_slug }}/&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;layouts&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;base&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;njk&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;templateEngineOverride&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;njk&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;md&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;eleventyComputed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ article.content.SEO[0].title }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ article.content.SEO[0].description }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;canonical&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ article.content.SEO[0].canonical }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;noindex&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ article.content.SEO[0].noindex }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;og_title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ article.content.SEO[0].og_title }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;og_description&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ article.content.SEO[0].og_description }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;og_image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ article.content.SEO[0].og_image.filename }}&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Title&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/{{ article.content.Author.fullSlug }}&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Author&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/{{ article.content.Category.fullSlug }}&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Category&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;PublicationDate&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Body&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;safe&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Yes, that&#39;s a lot of SEO and Social Media metadata, but it&#39;s necessary! You might be wondering why this data is under &lt;code&gt;eleventyComputed&lt;/code&gt; instead of being set directly, like we did with &lt;code&gt;permalink&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;And that&#39;s a great question! We can only use variables and shortcodes in &lt;code&gt;permalink&lt;/code&gt; and &lt;code&gt;eleventyComputed&lt;/code&gt;. Therefore, we don&#39;t need to set the permalink under eleventyComputed, but the rest of the custom fields must be placed there to ensure they are dynamicly updated.&amp;quot;&lt;/p&gt;
&lt;h4 id=&quot;14.-create-the-src-greater-articles-list.njk-file&quot; tabindex=&quot;-1&quot;&gt;14. Create the &lt;code&gt;src &amp;gt; articles-list.njk&lt;/code&gt; file &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;This template will list all the published articles.&lt;/p&gt;
&lt;pre class=&quot;language-njk&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;permalink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/articles/&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;layouts&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;base&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;njk&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Articles&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;This is the list of Articles&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Articles&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;articles&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/{{ article.full_slug }}&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Title&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;endfor&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;15.-repeat-steps-12-through-14-but-this-time-creating-the-files-related-to-authors&quot; tabindex=&quot;-1&quot;&gt;15. Repeat steps 12 through 14, but this time creating the files related to &lt;code&gt;Authors&lt;/code&gt; &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Filename: src &amp;gt; _data &amp;gt; authors.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fetchAPI &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;../utils/storyblok.js&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getAuthors&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetchAPI&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&lt;br&gt; {&lt;br&gt;   AuthorItems {&lt;br&gt;     items {&lt;br&gt;       full_slug&lt;br&gt;       content {&lt;br&gt;         Name&lt;br&gt;         Bio&lt;br&gt;         Avatar {&lt;br&gt;           filename&lt;br&gt;         }&lt;br&gt;         SEO&lt;br&gt;       }&lt;br&gt;     }&lt;br&gt;   }&lt;br&gt; }&lt;br&gt; &lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; data&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;AuthorItems&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Filename: src &amp;gt; author-page.njk&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-njk&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;pagination&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;authors&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;alias&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;author&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;permalink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ author.full_slug }}/&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;layouts&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;base&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;njk&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;eleventyComputed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ author.content.SEO[0].title }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ author.content.SEO[0].description }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;canonical&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ author.content.SEO[0].canonical }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;noindex&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ author.content.SEO[0].noindex }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;og_title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ author.content.SEO[0].og_title }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;og_description&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ author.content.SEO[0].og_description }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;og_image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ author.content.SEO[0].og_image.filename }}&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;author-info&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;author-avatar&quot;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;{{ author.content.Avatar.filename }}&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h1&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;author-name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Name&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Bio&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h2&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Articles&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;by&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Name&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h2&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   &lt;br&gt;   &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;targetAuthorFullSlug&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;full_slug&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;filteredArticles&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;articles&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;filterArticlesByAuthor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;targetAuthorFullSlug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;filteredArticles&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;           &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;               &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;                   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h3&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/{{ article.full_slug }}&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Title&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h3&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;                   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Publication&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;PublicationDate&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;               &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;           &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;           &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;No&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;articles&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;found&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;this&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;endfor&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Filename: src &amp;gt; authors-list.njk&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-njk&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;permalink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/authors/&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;layouts&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;base&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;njk&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Authors&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;This is the list of Authors&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Authors&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;author&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;authors&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;sortAuthorsByName&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/{{ author.full_slug }}&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;author&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Name&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;endfor&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;16.-repeat-steps-12-through-14-but-this-time-creating-files-related-to-categories&quot; tabindex=&quot;-1&quot;&gt;16. Repeat steps 12 through 14, but this time creating files related to &lt;code&gt;Categories&lt;/code&gt; &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Filename: src &amp;gt; _data &amp;gt; categories.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fetchAPI &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;../utils/storyblok.js&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getCategories&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetchAPI&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&lt;br&gt; {&lt;br&gt;   CategoryItems {&lt;br&gt;     items {&lt;br&gt;       full_slug&lt;br&gt;       content {&lt;br&gt;         Category&lt;br&gt;         SEO&lt;br&gt;       }&lt;br&gt;     }&lt;br&gt;   }&lt;br&gt; }&lt;br&gt; &lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; data&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;CategoryItems&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Filename: src &amp;gt; category-page.njk&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-njk&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;pagination&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;categories&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;alias&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;category&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;permalink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ category.full_slug }}/&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;layouts&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;base&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;njk&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;eleventyComputed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ category.content.SEO[0].title }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ category.content.SEO[0].description }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;canonical&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ category.content.SEO[0].canonical }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;noindex&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ category.content.SEO[0].noindex }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;og_title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ category.content.SEO[0].og_title }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;og_description&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ category.content.SEO[0].og_description }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;og_image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ category.content.SEO[0].og_image.filename }}&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;category&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Category&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;   &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;targetCategoryFullSlug&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;category&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;full_slug&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;filteredArticles&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;articles&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;filterArticlesByCategory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;targetCategoryFullSlug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;filteredArticles&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;           &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;               &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;                   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h3&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/{{ article.full_slug }}&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Title&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h3&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;                   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Publication&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;PublicationDate&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;               &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;           &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;           &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;No&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;articles&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;found&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;this&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;category&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;endfor&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Filename: src &amp;gt; categories-list.njk&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-njk&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;permalink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/categories/&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;layouts&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;base&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;njk&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Categories&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;This is the list of Categories&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Categories&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;category&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;categories&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/{{ category.full_slug }}&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;category&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Category&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;       &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;endfor&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;17.-create-the-home-related-files&quot; tabindex=&quot;-1&quot;&gt;17. Create the &lt;code&gt;Home&lt;/code&gt; related files &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;In this case, we need the &lt;code&gt;Home id&lt;/code&gt;. You can find it using the GAPI browser, &lt;a href=&quot;https://estelafranco.com/blog/eleventy-storyblok-2/#create-the-graphql-query&quot; target=&quot;_blank&quot;&gt;as I explained in my previous article&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Once you have the home id, add the variable in the &lt;code&gt;.env&lt;/code&gt; file:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-diff&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token unchanged&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; STORYBLOK_API_KEY=&quot;[your-storyblok-token-goes-here]&quot;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; DOMAIN=&quot;[your-website-domain-goes-here]&quot;&lt;br&gt;&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt; HOME_ID=&quot;[your-home-id]&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Create the &lt;code&gt;src &amp;gt; _data &amp;gt; home.js&lt;/code&gt; file and add the following code in it:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;dotenv&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fetchAPI &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;../utils/storyblok&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getHome&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetchAPI&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&lt;br&gt; {&lt;br&gt;   PageItem(id: &quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;HOME_ID&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;) {&lt;br&gt;     content {&lt;br&gt;       Heading&lt;br&gt;       Subtitle&lt;br&gt;       Highlights {&lt;br&gt;         fullSlug&lt;br&gt;         name&lt;br&gt;         content&lt;br&gt;       }&lt;br&gt;       SEO&lt;br&gt;     }&lt;br&gt;   }&lt;br&gt; }  &lt;br&gt; &lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; data&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;PageItem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Create the &lt;code&gt;src &amp;gt; index.njk&lt;/code&gt; file:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-njk&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;pagination&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;home&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;permalink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;layouts&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;base&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;njk&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token variable&quot;&gt;eleventyComputed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ home.content.SEO[0].title }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ home.content.SEO[0].description }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;canonical&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ home.content.SEO[0].canonical }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;noindex&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ home.content.SEO[0].noindex }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;og_title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ home.content.SEO[0].og_title }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;og_description&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ home.content.SEO[0].og_description }}&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token variable&quot;&gt;og_image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ home.content.SEO[0].og_image.filename }}&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;home&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Heading&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h1&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;home-subtitle&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;home&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Subtitle&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h2&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Highlighted&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;Articles&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;h2&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;home&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Highlights&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;fullSlug&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Title&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;endfor&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;18.-create-the-src-greater-public-greater-css-greater-styles.css-file&quot; tabindex=&quot;-1&quot;&gt;18. Create the &lt;code&gt;src &amp;gt; public &amp;gt; css &amp;gt; styles.css&lt;/code&gt; file &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Colors */&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token selector&quot;&gt;:root&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token property&quot;&gt;--darkgray&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #202124&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token property&quot;&gt;--purple&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #713973&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token property&quot;&gt;--white&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #FFF&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--white&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--darkgray&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; flex&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;flex-direction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; column&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;br&gt; &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; system&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;-apple-system&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;system-ui&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;BlinkMacSystemFont&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;Roboto-Light&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;sans-serif&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;clamp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1.1em&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0.25vw + 0.8em&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 1.25em&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;min-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100vh&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token selector&quot;&gt;header&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; flex&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;justify-content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; space-between&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;border-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px solid &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--darkgray&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token selector&quot;&gt;footer&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;border-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px solid &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--darkgray&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;text-align&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token selector&quot;&gt;main&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;flex-grow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 4em auto 0 auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;60em&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 90%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token selector&quot;&gt;.header-home&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;text-decoration&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.5em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 600&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--darkgray&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token selector&quot;&gt;&amp;amp;:hover&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--purple&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token selector&quot;&gt;.header-nav&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; flex&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;align-items&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; center&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;60em&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 90%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token selector&quot;&gt;.header-list&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;margin-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;list-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; left&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;margin-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; flex&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;justify-content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; flex-end&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;flex-grow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;list-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token selector&quot;&gt;.header-item&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token selector&quot;&gt;&amp;amp; a&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span class=&quot;token property&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 1em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;     &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--darkgray&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;     &lt;span class=&quot;token property&quot;&gt;text-decoration&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;     &lt;span class=&quot;token selector&quot;&gt;&amp;amp;:hover&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--purple&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;     &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token selector&quot;&gt;.author-avatar&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 75px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token selector&quot;&gt;.author-name&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token property&quot;&gt;margin-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.5em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token selector&quot;&gt;.author-info&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; flex&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token property&quot;&gt;flex-direction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; row&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token selector&quot;&gt;p:empty&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;run-it-locally&quot; tabindex=&quot;-1&quot;&gt;Run it locally &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You&#39;re nearly finished! With your content in Storyblok and your code stored in a local repository, it&#39;s time to run it locally and ensure everything appears as intended.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm start
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Executing this command will run Eleventy locally, making your brand new (local) site accessible at port 8080. If port 8080 is already in use, the correct port will be displayed in the console.&lt;/p&gt;
&lt;h2 id=&quot;demo-and-template-repository&quot; tabindex=&quot;-1&quot;&gt;Demo and Template Repository &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You can see this blog site in action here: &lt;a href=&quot;https://11ty-storyblok.netlify.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://11ty-storyblok.netlify.app&lt;/a&gt;&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/home.webp&quot; alt=&quot;Blog site homepage.&quot; loading=&quot;lazy&quot;&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/articles-list.webp&quot; alt=&quot;Blog site articles list.&quot; loading=&quot;lazy&quot;&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/article-page.webp&quot; alt=&quot;Blog site article page.&quot; loading=&quot;lazy&quot;&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-blog/author-page.webp&quot; alt=&quot;Blog site author page.&quot; loading=&quot;lazy&quot;&gt;
&lt;p&gt;In addition, you have all the code described in this tutorial in this template repository: &lt;a href=&quot;https://github.com/guaca/11ty-storyblok-template/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/guaca/11ty-storyblok-template/&lt;/a&gt;. So, you can create your own blog site by clicking the &amp;quot;Use this template&amp;quot; button.&lt;/p&gt;
&lt;h2 id=&quot;what&#39;s-next&quot; tabindex=&quot;-1&quot;&gt;What&#39;s next? &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This tutorial has guided you through configuring and building a blog site, utilizing Storyblok for data storage and Eleventy for page generation. Once completed, you can deploy your Eleventy project to your preferred Jamstack hosting service. By setting up appropriate workflows and hooks, you can ensure that your site updates automatically whenever you publish a new story in Storyblok.&lt;/p&gt;
&lt;p&gt;You have all these steps defined in this &lt;a href=&quot;https://estelafranco.com/blog/storyblok-astro/#4.-deploy-the-project-on-netlify&quot; target=&quot;_blank&quot;&gt;article&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;can-i-use-the-storyblok-visual-editor-with-eleventy&quot; tabindex=&quot;-1&quot;&gt;Can I use the Storyblok Visual Editor with Eleventy? &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-3/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Long answer short? Yes but it&#39;s not straightforward.&lt;/p&gt;
&lt;p&gt;Long answer: Yes, you can leverage it by configuring an edge function to refresh the API/GAPI data from Storyblok upon updates. Eleventy generates data during build time. Consequently, even after saving new data, the data won&#39;t be updated in the Visual Editor preview unless the edge function rebuilds it.&lt;/p&gt;
&lt;p&gt;Storyblok&#39;s visual editor seamlessly integrates with other frameworks like Next or Nuxt, allowing you to observe content updates instantly, even without saving changes. However, this functionality is not supported by static site generators.&lt;/p&gt;
&lt;p&gt;In the next article in this series, I will use Netlify Edge functions to leverage the Storyblok Visual Editor to make working with the editor easier and more intuitive. Stay tuned!&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>How to connect Eleventy and Storyblok</title>
		<link href="https://estelafranco.com/blog/eleventy-storyblok-2/"/>
		<updated>2024-01-31T00:00:00Z</updated>
		<id>https://estelafranco.com/blog/eleventy-storyblok-2/</id>
		<content type="html">&lt;p&gt;&lt;span style=&quot;color:var(--lightgray)&quot;&gt;&lt;em&gt;This is the second post in a series of articles called &amp;quot;Eleventy and Storyblok&amp;quot; to learn how to use this combination to create a web project.&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Before getting into the matter, I really recommend you to read my first article of this series if you haven&#39;t yet. Take a moment to check it out and discover why Evleventy and Storyblok is my perfect combination and why you should start using it to take advantage of these two technologies. You can read it &lt;a href=&quot;https://estelafranco.com/blog/eleventy-storyblok/&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So, in this second article I explain you how to connect &lt;a href=&quot;https://www.11ty.dev&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Eleventy&lt;/a&gt; and &lt;a href=&quot;https://get.storyblok.com/estela-franco-cuenca&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Storyblok&lt;/a&gt; to start consuming content generated in this amazing Headless CMS.&lt;/p&gt;
&lt;h2 id=&quot;technical-requirements&quot; tabindex=&quot;-1&quot;&gt;Technical requirements &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-2/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This article will show you step by step how to query data from Storyblok to use it in an Eleventy project. You&#39;ll need a computer with the following features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Node.js. Eleventy requires Node.js 14. I&#39;ve used v20.10.0 in the examples provided.
&lt;ul&gt;
&lt;li&gt;You can check if you have Node installed by running &lt;code&gt;node --version&lt;/code&gt; in a terminal window.&lt;/li&gt;
&lt;li&gt;If the command is not found or returns a number less than 14, you will need to download and install &lt;a href=&quot;https://nodejs.org/en/download/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Node.js&lt;/a&gt; before proceeding to the next step.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A code editor. I use &lt;a href=&quot;https://code.visualstudio.com/download&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;VSCode&lt;/a&gt;, but feel free to use your favorite.&lt;/li&gt;
&lt;li&gt;A Storyblok account. You can create yours &lt;a href=&quot;https://get.storyblok.com/estela-franco-cuenca&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Basic knowledge of HTML, CSS, JavaScript, Markdown, and the command line is helpful.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you have all the technical requirements in place, it&#39;s time to create the project.&lt;/p&gt;
&lt;h2 id=&quot;creating-a-project-in-storyblok&quot; tabindex=&quot;-1&quot;&gt;Creating a project in Storyblok &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-2/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First of all, let&#39;s create a basic Storyblok space for this project!&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Log in to Storyblok and create a new space by clicking &lt;strong&gt;Add Space&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;img loading=&quot;lazy&quot; class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/create-new-space-storyblok.jpg&quot;&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Select the &lt;strong&gt;New Space&lt;/strong&gt; option, enter a name for the space, and select the server location (EU by default):&lt;/li&gt;
&lt;/ol&gt;
&lt;img loading=&quot;lazy&quot; class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/new-space-storyblok.jpg&quot;&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;You can review the structure and sample content details. By default, you&#39;ll find the following components:&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;A Home page in the &lt;code&gt;Content&lt;/code&gt; section:&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;img loading=&quot;lazy&quot; class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/sample-content-storyblok-eleventy.webp&quot;&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;When you access it, you will see the &amp;quot;Welcome to the Visual Editor&amp;quot; page by default, and the components of the page in the right sidebar:&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;img loading=&quot;lazy&quot; class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-sample.webp&quot;&gt;
&lt;p&gt;As you can see, the Home page has a &lt;code&gt;body&lt;/code&gt; component with two block elements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Teaser: this is a text component. The current value of this field is &amp;quot;Hello world!&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;img loading=&quot;lazy&quot; class=&quot;tmpl-img-narrow&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-sample-teaser.webp&quot;&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Grid: this is a block component, with 3 text elements in it (with the text &amp;quot;Feature 1&amp;quot;, &amp;quot;Feature 2&amp;quot;, and &amp;quot;Feature 3&amp;quot; text on them).&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;img loading=&quot;lazy&quot; class=&quot;tmpl-img-narrow&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-sample-grid.webp&quot;&gt;
&lt;/blockquote&gt;
&lt;p&gt;We&#39;ll cover this later, but understanding the architecture of data is key to creating the right elements in your front-end development.&lt;/p&gt;
&lt;h2 id=&quot;creating-a-project-in-eleventy&quot; tabindex=&quot;-1&quot;&gt;Creating a project in Eleventy &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-2/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Eleventy does not require you to use any JavaScript framework or library. And you can have a basic project up and running in literally less than 1 minute:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open a terminal&lt;/li&gt;
&lt;li&gt;Create a folder for your new project&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;mkdir myproject
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Access the project&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;cd myproject
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Create an &lt;code&gt;index.md&lt;/code&gt; file. The &lt;code&gt;.md&lt;/code&gt; extension is for markdown.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;echo &#39;# Page header&#39; &amp;gt; index.md
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Run Eleventy. This command compiles the index.md file (but &lt;code&gt;.md&lt;/code&gt; is only one of many valid file extensions) into the output folder(&lt;code&gt;_site&lt;/code&gt; by default), ready to be upload to your favorite hosting service.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;npx @11ty/eleventy
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;You should get something like this:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;[11ty] Writing _site/index.html from ./index.md (liquid)
[11ty] Wrote 1 file in 0.03 seconds (v2.0.1)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;However, you may want to run Eleventy from a local development server while working on it. Run Eleventy locally with this code:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;npx @11ty/eleventy --serve
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;You will get something like this:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;[11ty] Writing _site/index.html from ./index.md (liquid)
[11ty] Wrote 1 file in 0.04 seconds (v2.0.1)
[11ty] Watching…
[11ty] Server at http://localhost:8080/
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Open &lt;code&gt;http://localhost:8080&lt;/code&gt; in your browser and you will see your website.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;setting-up-and-configuring-the-eleventy-project&quot; tabindex=&quot;-1&quot;&gt;Setting up and configuring the Eleventy project &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-2/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So far, so simple, right? Your project should have the following architecture:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;├── _site
│   └── index.html
└── index.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But let&#39;s add a few more things to prepare our project for our Storyblok integration.&lt;/p&gt;
&lt;p&gt;We&#39;ve created our first page, index.html, using one of the valid file extensions (.md). But this is just one of many options you can use for your templates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTML: *.html&lt;/li&gt;
&lt;li&gt;Markdown: *.md&lt;/li&gt;
&lt;li&gt;WebC: *.webc&lt;/li&gt;
&lt;li&gt;JavaScript: *.11ty.js&lt;/li&gt;
&lt;li&gt;Liquid: *.liquid&lt;/li&gt;
&lt;li&gt;Nunjucks: *.njk&lt;/li&gt;
&lt;li&gt;Handlebars: *.hbs&lt;/li&gt;
&lt;li&gt;Mustache: *.mustache&lt;/li&gt;
&lt;li&gt;EJS: *.ejs&lt;/li&gt;
&lt;li&gt;Haml: *.haml&lt;/li&gt;
&lt;li&gt;Pug: *.pug&lt;/li&gt;
&lt;li&gt;Custom: *.*&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I will use &lt;code&gt;.md&lt;/code&gt; and &lt;code&gt;.njk&lt;/code&gt; in this article, but feel free to use the template languages you feel more comfortable with.&lt;/p&gt;
&lt;p&gt;There&#39;s plenty of options to use, combine and override the template language. You can find all the details &lt;a href=&quot;https://www.11ty.dev/docs/languages/&quot; rel=&quot;nofollow noopener noreferrer&quot; target=&quot;_blank&quot;&gt;in the documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In addition to pages, you can use layouts to wrap other content. So let&#39;s open the project in VSCode and let&#39;s create a base layout to define the common HTML elements for all pages:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;doctype&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;en&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;utf-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;viewport&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;width=device-width, initial-scale=1.0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;{{ title }}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;    {{ content | safe }}&lt;br&gt;  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Save this file as &lt;code&gt;base.njk&lt;/code&gt; in a new &lt;code&gt;_includes/layouts&lt;/code&gt; folder. Your project now has the following structure:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;├── _includes
│   └── layouts
│       └── base.njk
├── _site
│   └── index.html
└── index.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now you can add the &lt;code&gt;base.njk&lt;/code&gt; layout to your &lt;code&gt;index.md&lt;/code&gt; page. To do this, add the following information to your existing file&lt;/p&gt;
&lt;pre class=&quot;language-diff-md&quot;&gt;&lt;code class=&quot;language-diff-md&quot;&gt;&lt;span class=&quot;token inserted-sign inserted language-md&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token hr punctuation&quot;&gt;---&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt; layout: layouts/base.njk&lt;br&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt; title: This is my homepage&lt;br&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token hr punctuation&quot;&gt;---&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;br&gt;# Page header&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What have been done here? The content between the two &lt;code&gt;---&lt;/code&gt; marks is the &lt;strong&gt;front matter&lt;/strong&gt;. This is a YAML block at the top of the file and is a standard convention used by many Static Site Generators (SSG). So you&#39;re probably familiar with it if you&#39;ve used other SSGs in the past. The content in the front matter is key-value pairs that provide information on how to generate data for this page.&lt;/p&gt;
&lt;p&gt;In this case, two key-value pairs have been added:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;layout: This is the route of the desired layout to apply to the page.&lt;/li&gt;
&lt;li&gt;title: This is the title of the page. As mentioned earlier in the &lt;code&gt;base.njk&lt;/code&gt; file, this information will be used in the &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; tag.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;get-the-api-token-from-storyblok&quot; tabindex=&quot;-1&quot;&gt;Get the API token from Storyblok &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-2/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;An API token is necessary to follow the next steps. By default, you can see your preview token on the &amp;quot;Welcome to the Visual Editor&amp;quot; page. But you can find it (or create a new one) in &lt;code&gt;Settings &amp;gt; Access Tokens&lt;/code&gt; as well.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/visual-editor-token.webp&quot;&gt;
&lt;img loading=&quot;lazy&quot; class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/settings-access-token.webp&quot;&gt;
&lt;h2 id=&quot;how-to-query-the-storyblok-data-from-eleventy&quot; tabindex=&quot;-1&quot;&gt;How to query the Storyblok data from Eleventy &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-2/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;create-the-graphql-query&quot; tabindex=&quot;-1&quot;&gt;Create the GraphQL query &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-2/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In this article, I will be using the &lt;strong&gt;GraphQL Content Delivery API&lt;/strong&gt;. This is a read-only endpoint and is optimized for fast content delivery.&lt;/p&gt;
&lt;p&gt;Use the following endpoint to send GraphQL requests:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://gapi.storyblok.com/v1/api
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note that you need to append the region code if you are using different regions. For example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://gapi-us.storyblok.com/v1/api
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you haven&#39;t used GraphQL schemas before, I have good news for you! Storyblok has a playground where you can explore the functionalities and create the right query. You can access it using this URL with your Access Token in it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://gapi-browser.storyblok.com/?token=insert-here-your-access-token
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this case, we want to get the Home page data:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Teaser (Hello world!)&lt;/li&gt;
&lt;li&gt;Grid
&lt;ul&gt;
&lt;li&gt;Feature 1&lt;/li&gt;
&lt;li&gt;Feature 2&lt;/li&gt;
&lt;li&gt;Feature 3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, this will be our query:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  PageItem(id: &amp;quot;insert-your-home-id&amp;quot;) {
    name
    content {
      body
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can find your Home id running the following query in the playground:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  PageItems {
    items {
      id
      name
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And it will return the id and the name:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &amp;quot;data&amp;quot;: {
    &amp;quot;PageItems&amp;quot;: {
      &amp;quot;items&amp;quot;: [
        {
          &amp;quot;id&amp;quot;: xxxxxxxxxx,
          &amp;quot;name&amp;quot;: &amp;quot;Home&amp;quot;
        }
      ]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ok, now we know what data we want to get from Storyblok. But how to do it?&lt;/p&gt;
&lt;h3 id=&quot;data-in-eleventy&quot; tabindex=&quot;-1&quot;&gt;Data in Eleventy &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-2/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Eleventy can use data from several different sources. However, when merging data, there is a priority order for data sources. From highest to lowest priority:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Computed data&lt;/li&gt;
&lt;li&gt;Front matter data in a template&lt;/li&gt;
&lt;li&gt;Template data files&lt;/li&gt;
&lt;li&gt;Directory data files&lt;/li&gt;
&lt;li&gt;Front matter data in layouts&lt;/li&gt;
&lt;li&gt;Configuration API global data&lt;/li&gt;
&lt;li&gt;Global data files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The two ways that work best for applying a headless CMS are &lt;strong&gt;Global Data&lt;/strong&gt; files and &lt;strong&gt;Configuration API global data&lt;/strong&gt;. In this article, I&#39;m going to use the first one.&lt;/p&gt;
&lt;p&gt;As you can imagine, this means some code is necessary to execute the API call. Let&#39;s create a folder called &lt;code&gt;utils&lt;/code&gt;. Inside it, create a &lt;code&gt;storyblok.js&lt;/code&gt; file with the following code:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetchAPI&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;query&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; variables&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; preview &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; res &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;https://gapi.storyblok.com/v1/api&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token literal-property property&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;POST&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token literal-property property&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token string-property property&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;application/json&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token literal-property property&quot;&gt;Token&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;xxxxxxxxxxxxxxxxxxxxxxxx&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token literal-property property&quot;&gt;Version&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; preview &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;draft&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;published&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token literal-property property&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;        query&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;        variables&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; json &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;errors&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;errors&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Failed to fetch API&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hardcoding your API token into your code is not a good practice. So you can store it as an &lt;code&gt;.env&lt;/code&gt; variable.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# .env file&lt;/span&gt;&lt;br&gt;STORYBLOK_TOKEN: xxxxxxxxxxxxxxxxxxxxxxxx&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;However, you will need to install the &lt;code&gt;dotenv&lt;/code&gt; package to access it.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; dotenv --save-dev&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You will see this step will generate some more files and folders. Don&#39;t worry, we&#39;ll manage this later. Now you can modify your &lt;code&gt;storyblok.js&lt;/code&gt; file to use the &lt;code&gt;.env&lt;/code&gt; variable:&lt;/p&gt;
&lt;pre class=&quot;language-diff-js&quot;&gt;&lt;code class=&quot;language-diff-js&quot;&gt;&lt;span class=&quot;token inserted-sign inserted language-js&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;dotenv&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;/span&gt;module.exports = async function fetchAPI(query, { variables, preview } = {}) {&lt;br&gt;&lt;span class=&quot;token unchanged language-js&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; res &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;https://gapi.storyblok.com/v1/api&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     &lt;span class=&quot;token literal-property property&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;POST&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     &lt;span class=&quot;token literal-property property&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;       &lt;span class=&quot;token string-property property&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;application/json&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span class=&quot;token deleted-sign deleted language-js&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;        &lt;span class=&quot;token literal-property property&quot;&gt;Token&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;xxxxxxxxxxxxxxxxxxxxxxxx&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted language-js&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;        &lt;span class=&quot;token literal-property property&quot;&gt;Token&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;STORYBLOK_TOKEN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span class=&quot;token unchanged language-js&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;       &lt;span class=&quot;token literal-property property&quot;&gt;Version&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; preview &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;draft&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;published&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     &lt;span class=&quot;token literal-property property&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;       query&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;       variables&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; json &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;errors&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;errors&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     &lt;span class=&quot;token keyword&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Failed to fetch API&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At this point, let&#39;s create a &lt;code&gt;_data&lt;/code&gt; folder, and a &lt;code&gt;homepage.js&lt;/code&gt; file in it with the following code:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fetchAPI &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;../utils/storyblok&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getHomepage&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fetchAPI&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&lt;br&gt;  {&lt;br&gt;    PageItem(id: &quot;insert-your-home-id&quot;) {&lt;br&gt;      name&lt;br&gt;      content {&lt;br&gt;        body&lt;br&gt;      }&lt;br&gt;    }&lt;br&gt;  }&lt;br&gt;  &lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; data&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;PageItem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The previous code will generate the &lt;code&gt;homepage&lt;/code&gt; data from Storyblok&#39;s API, and it will be accessible from other pages and layouts.&lt;/p&gt;
&lt;p&gt;So let&#39;s modify our &lt;code&gt;index.md&lt;/code&gt; file to use it!&lt;/p&gt;
&lt;pre class=&quot;language-diff&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token coord&quot;&gt;---&lt;/span&gt;&lt;br&gt;layout: layouts/base.njk&lt;br&gt;title: This is my homepage&lt;br&gt;&lt;span class=&quot;token coord&quot;&gt;---&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt; # Page header&lt;br&gt;&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt; # {{ homepage.content.body[0].headline }}&lt;br&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt; {{ homepage.content.body[1].columns[0].name }}&lt;br&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt; {{ homepage.content.body[1].columns[1].name }}&lt;br&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt; {{ homepage.content.body[1].columns[2].name }}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After following all these steps, you should see something similar to this on your local server:&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-hello-world.webp&quot;&gt;
&lt;h2 id=&quot;using-the-visual-editor-from-storyblok&quot; tabindex=&quot;-1&quot;&gt;Using the Visual Editor from Storyblok &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-2/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As seen earlier, the Visual Editor uses a &amp;quot;Welcome to the Visual Editor&amp;quot; by default page. To see the page we&#39;ve created using Storyblok&#39;s data we must set up the preview URL. Eleventy runs locally on &lt;code&gt;http://localhost:8080&lt;/code&gt;. However, Storyblok requires an https connection to use the visual editor. There are several frameworks offering straightforward methods to use SSL in local development. Unfortunately, it&#39;s not that easy on Eleventy.&lt;/p&gt;
&lt;p&gt;However, we can fis this issue with &lt;code&gt;mkcert&lt;/code&gt; and &lt;code&gt;local-ssl-proxy&lt;/code&gt;. Before following this process, ensure your local server is stopped. If it&#39;s still running, you can stop it by clicking &lt;code&gt;Control + C&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install mkcert (globally)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt; mkcert&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Add mkcert to your local root CAs&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;mkcert &lt;span class=&quot;token parameter variable&quot;&gt;-install&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Generate a certificate for your localhost on your project, signed by mkcert. This will generate two &lt;code&gt;.pem&lt;/code&gt; files.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;mkcert localhost&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Install local-ssl-proxy (globally)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt; local-ssl-proxy&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Run Eleventy locally (and keep this terminal running it!). By default, it will run over the port 8080:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;npx @11ty/eleventy &lt;span class=&quot;token parameter variable&quot;&gt;--serve&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Open a new terminal and run the proxy SSL server through the port 3000 (and keep it running in this new terminal):&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;local-ssl-proxy &lt;span class=&quot;token parameter variable&quot;&gt;--source&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3000&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--target&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8080&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--cert&lt;/span&gt; localhost.pem &lt;span class=&quot;token parameter variable&quot;&gt;--key&lt;/span&gt; localhost-key.pem  &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After these steps, open &lt;code&gt;https://localhost:3000&lt;/code&gt; on your browser and you should be able to see the same content as on &lt;code&gt;http://localhost:8080&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;With these two local servers running, you can go to Storyblok and change the preview URL. You can set it up directly from the default &amp;quot;Welcome to the Visual Editor&amp;quot; page, in the &lt;strong&gt;&amp;quot;Set up preview URL&amp;quot;&lt;/strong&gt; field. Or you can change the preview URL from &lt;code&gt;Settings &amp;gt; Configuration &amp;gt; Visual Editor&lt;/code&gt;:&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/change-url-visual-editor-storyblok.jpg&quot;&gt;
&lt;p&gt;But you will probably be a bit disappointed after doing this because you&#39;ll get a 404 error after saving it. That&#39;s because Storyblok adds the content page path to the URL. So, by default, the visual editor will try to load &lt;code&gt;https://localhost:3000/home&lt;/code&gt;. To change this, go to the page configuration and set &lt;code&gt;/&lt;/code&gt; as the Real path:&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/set-real-path-storyblok.jpg&quot;&gt;
&lt;p&gt;And now you have it! You can see the content using the Visual Editor.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/11ty-storyblok-visual-editor.webp&quot;&gt;
&lt;h2 id=&quot;next-steps&quot; tabindex=&quot;-1&quot;&gt;Next steps &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok-2/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After following all these steps, you now know how to create content on Storyblok and consume it from Eleventy using the GraphQL API. However, you will notice that content management is not dynamic. If you change something in Storyblok, it will not be updated on the local server or in the visual editor.&lt;/p&gt;
&lt;p&gt;That&#39;s the expected behavior because Eleventy executes the GraphQL query at build time. If we serve the page locally, this means that the query won&#39;t be updated unless we change a file in our project. Therefore, any changes we make won&#39;t be visible on Storyblok until we rebuild the project on our local server.&lt;/p&gt;
&lt;p&gt;That&#39;s a bit annoying, isn&#39;t it? But don&#39;t worry. I will show you how to overcome all these inconveniences in an upcoming article of this series of &lt;strong&gt;Eleventy and Storyblok&lt;/strong&gt; articles.&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Eleventy and Storyblok - My perfect combination</title>
		<link href="https://estelafranco.com/blog/eleventy-storyblok/"/>
		<updated>2023-10-09T00:00:00Z</updated>
		<id>https://estelafranco.com/blog/eleventy-storyblok/</id>
		<content type="html">&lt;p&gt;&lt;span style=&quot;color:var(--lightgray)&quot;&gt;&lt;em&gt;This is the first post in a series of articles called &amp;quot;Eleventy and Storyblok&amp;quot; to learn how to use this combination to create a web project.&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you know me, you already know that I&#39;m a big &lt;a href=&quot;https://www.11ty.dev&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Eleventy&lt;/a&gt; fan. So far, it&#39;s my favorite choice for creating a static project. But you can do &lt;a href=&quot;https://www.11ty.dev/docs/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;so much more&lt;/a&gt; with it. You can even &lt;a href=&quot;https://www.11ty.dev/docs/single-page-applications/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;build an SPA with 11ty&lt;/a&gt;! The only downside to the escalation of my personal projects is the lack of a CMS to generate new content.&lt;/p&gt;
&lt;p&gt;Don&#39;t get me wrong. I feel super comfortable writing in Markdown, but sometimes I miss the power of a CMS to easily check grammar mistakes or even preview the content instead of running my project on localhost.&lt;/p&gt;
&lt;p&gt;That&#39;s why I started researching how to integrate a headless CMS into an Eleventy project. After investigating a few options, I fell in love with Storyblok.&lt;/p&gt;
&lt;p&gt;In this article, I&#39;ll explain why I chose these options in the hope that you&#39;ll fall in love with them, too.&lt;/p&gt;
&lt;h2 id=&quot;eleventy-a-simpler-static-site-generator&quot; tabindex=&quot;-1&quot;&gt;Eleventy, a simpler static site generator &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;11ty in a nutshell: Fast builds and even faster websites. That&#39;s what I&#39;m looking for when starting a new project, so Eleventy seems to be made for my needs! But let the data speak for itself.&lt;/p&gt;
&lt;p&gt;Eleventy ran a benchmark of x4000 Markdown files (you have all the information in this &lt;a href=&quot;https://github.com/zachleat/bench-framework-markdown&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;open source repository&lt;/a&gt; and the results in this &lt;a href=&quot;https://www.zachleat.com/web/build-benchmark/#benchmark-results&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;article&lt;/a&gt;) and Eleventy performance is impressive:&lt;/p&gt;
&lt;div class=&quot;table-wrapper&quot;&gt;
&lt;table style=&quot;width:min(500px,95%)&quot;&gt;
	&lt;thead&gt;
		&lt;tr&gt;
			&lt;th&gt;Name&lt;/th&gt;
			&lt;th colspan=&quot;2&quot;&gt;Building ×4000 MD Files&lt;/th&gt;
		&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;td&gt;Eleventy&lt;/td&gt;
			&lt;td class=&quot;numeric&quot;&gt;1.93&lt;abbr title=&quot;seconds&quot;&gt;s&lt;/abbr&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Astro&lt;/td&gt;
			&lt;td class=&quot;numeric&quot;&gt;22.90&lt;abbr title=&quot;seconds&quot;&gt;s&lt;/abbr&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Gatsby&lt;/td&gt;
			&lt;td class=&quot;numeric&quot;&gt;29.05&lt;abbr title=&quot;seconds&quot;&gt;s&lt;/abbr&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Next.js&lt;/td&gt;
			&lt;td class=&quot;numeric&quot;&gt;70.65&lt;abbr title=&quot;seconds&quot;&gt;s&lt;/abbr&gt;&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;Performance is important, but so is the developer experience. And I love the versatility of 11ty: you can create a project and choose between many template languages like HTML, Markdown, Nunjucks, Liquid, WebC, and others. You can even override the template language if you need to!&lt;/p&gt;
&lt;p&gt;In addition, there are many official plugins that you can integrate into your project to take it to the next level easily. Or you can integrate plugins contributed by the community!&lt;/p&gt;
&lt;p&gt;And that&#39;s important to me: Eleventy has an active community that helps make this SSG a great option.&lt;/p&gt;
&lt;p&gt;For example, you can easily configure your templates using data keys like permalinks, layouts, pagination, tags, etc. And integrate plugins like Image (to resize and generate images), RSS, i18n (for internationalization), Navigation (also for breadcrumbs!), Shopify (import your Shopify products, pages and collections into Eleventy as global data), and more.&lt;/p&gt;
&lt;p&gt;But don&#39;t take my word for it and see who trusts Eleventy to build their projects:&lt;/p&gt;
&lt;ul id=&quot;logos&quot; class=&quot;logos-list&quot;&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fwww.nasa.gov%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://www.nasa.gov/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;&lt;abbr title=&quot;National Aeronautics and Space Administration&quot;&gt;NASA&lt;/abbr&gt;&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fhome.web.cern.ch%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://home.web.cern.ch/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Cern&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Ftc39.es%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://tc39.es/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;TC39&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fwww.w3.org%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://www.w3.org/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;W3C&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fabout.google%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://about.google/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Google&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fwww.netlify.com%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://www.netlify.com/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Netlify&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fweb.dev%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://web.dev/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;web.dev&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fweb.mit.edu%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://web.mit.edu/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;&lt;abbr title=&quot;Massachusetts Institute of Technology&quot;&gt;MIT&lt;/abbr&gt;&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fwww.stanford.edu%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://www.stanford.edu/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;&lt;abbr title=&quot;Stanford&quot;&gt;Stanford&lt;/abbr&gt;&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fv8.dev%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://v8.dev/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;V8&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fdeveloper.chrome.com%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://developer.chrome.com/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Chrome Developers&lt;/li&gt;
	&lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Ffoursquare.com%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://foursquare.com/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Foursquare&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fcss-tricks.com%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://css-tricks.com/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;CSS Tricks&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fwww.webpagetest.org%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://www.webpagetest.org/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;WebPageTest&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fwww.a11yproject.com%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://www.a11yproject.com/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;A11Y Project&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fwww.noaa.gov%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://www.noaa.gov/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;&lt;abbr title=&quot;National Oceanic and Atmospheric Administration&quot;&gt;NOAA&lt;/abbr&gt;&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fwww.gov.uk%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://www.gov.uk/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;United Kingdom (gov)&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fwww.numerique.gouv.fr%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://www.numerique.gouv.fr/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;France (gov)&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fstackoverflow.com%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://stackoverflow.com/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Stack Overflow&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Flit.dev%2F/&quot; width=&quot;120&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://lit.dev/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Lit&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fglitch.com%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://glitch.com/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Glitch&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fstackblitz.com%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://stackblitz.com/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Stackblitz&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fopenwebdocs.org%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://openwebdocs.org/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Open Web Docs&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fjamstack.org%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://jamstack.org/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;jamstack.org&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fwww.greenpeace.org%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://www.greenpeace.org/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Greenpeace&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fwww.csis.org%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://www.csis.org/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;&lt;abbr title=&quot;Center for Strategic &amp;amp; International Studies&quot;&gt;CSIS&lt;/abbr&gt;&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Feslint.org%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://eslint.org/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;ESLint&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fmochajs.org%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://mochajs.org/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Mocha&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Frevealjs.com%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://revealjs.com/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;reveal.js&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fpanic.com%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://panic.com/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Panic&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fwww.filamentgroup.com%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://www.filamentgroup.com/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Filament Group&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fset.studio%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://set.studio/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Set Studio&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fwww.ookla.com%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://www.ookla.com/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Ookla&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fwww.khanacademy.org%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://www.khanacademy.org/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Khan Academy&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fbasecamp.com%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://basecamp.com/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Basecamp&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fwww.snowpack.dev%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://www.snowpack.dev/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Snowpack&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fffconf.org%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://ffconf.org/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;ffconf&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2F2022.uxlondon.com%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://2022.uxlondon.com/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;UX London&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fnordhealth.com%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://nordhealth.com/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Nordhealth&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fwww.orange.com%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://www.orange.com/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Orange&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fwww.wisc.edu%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://www.wisc.edu/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Univ. of Wisconsin-Madison&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fwww.ca.gov%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://www.ca.gov/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;California (gov)&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fux.redhat.com/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://ux.redhat.com&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Red Hat&lt;/li&gt;
  &lt;li&gt;&lt;img src=&quot;https://v1.indieweb-avatar.11ty.dev/https%3A%2F%2Fwww.pie.design%2F/&quot; width=&quot;150&quot; height=&quot;150&quot; alt=&quot;IndieWeb Avatar for https://www.pie.design/&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;avatar avatar-indieweb&quot;&gt;Just Eat Takeaway&lt;/li&gt;
  &lt;li class=&quot;logos-list-more&quot;&gt;…and more&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;storyblok-the-way-to-modern-content&quot; tabindex=&quot;-1&quot;&gt;Storyblok, the way to modern content &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As you can see, Eleventy is a super powerful SSG that provides a great DX. However, if your project has content editors creating articles and pages, they won&#39;t be as excited as developers. Creating content directly on an SSG project can be difficult until they know how to write using Markdown or other project options.&lt;/p&gt;
&lt;p&gt;So implementing a headless CMS is a great solution to solve this problem. As I told you before, after investigating several options, I fell in love with &lt;a href=&quot;https://get.storyblok.com/estela-franco-cuenca&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Storyblok&lt;/a&gt;, and you will agree with me after reading this article.&lt;/p&gt;
&lt;p&gt;But let&#39;s take a step back.&lt;/p&gt;
&lt;h3 id=&quot;what&#39;s-a-headless-cms&quot; tabindex=&quot;-1&quot;&gt;What&#39;s a headless CMS? &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A headless CMS is a pure backend web content management system that acts as a content repository. The content is then exposed through an API for display on any device, without a built-in front-end. This separates your data (body) from its presentation (head).&lt;/p&gt;
&lt;p&gt;Separating the two gives you remarkable freedom and allows you to integrate Storyblok into any project such as websites, ecommerces, or apps. Moreover, developers can use whatever technology they want without worrying about how it affects the front end, and content editors can reuse their content on any number of devices of any type because it&#39;s not tied to a specific channel.&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/headless-cms.webp&quot; loading=&quot;lazy&quot;&gt;
&lt;h3 id=&quot;why-storyblok&quot; tabindex=&quot;-1&quot;&gt;Why Storyblok? &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://get.storyblok.com/estela-franco-cuenca&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Storyblok&lt;/a&gt; is a headless CMS designed to empower all content stakeholders while providing a cloud-native, headless architecture that allows developers to effortlessly work with and adapt to any technology.&lt;/p&gt;
&lt;p&gt;Here are some of its most notable features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Headless: You can integrate Storyblok into any front-end project because it&#39;s a headless solution. Moreover, you can change your front-end and easily migrate your content from one technology to another.&lt;/li&gt;
&lt;li&gt;Cloud-native: You don&#39;t have to host it. Storyblok does that for you.&lt;/li&gt;
&lt;li&gt;Internationalization: Excellent multilingual management. You can manage your translations at three different levels: field level, folder level, or space level. This allows you to choose the approach that best suits your project.&lt;/li&gt;
&lt;li&gt;Visual Editor: You don&#39;t need to know Markdown or any other markup languages to create and manage your content. Storyblok has a visual editor where you can visually manage, organize and preview your content.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And trust me, the Visual Editor looks amazing and your content editors will love it.&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/visual-editor.webp&quot; loading=&quot;lazy&quot;&gt;
&lt;p&gt;Yes, Storyblok has a preview feature where you can see how the content will fit on the page on the fly!&lt;/p&gt;
&lt;p&gt;If you want to learn more about Storyblok&#39;s features, check out this video (highly recommended!):&lt;/p&gt;
&lt;p&gt;https://www.youtube.com/watch?v=902M1Pt6yW8&lt;/p&gt;
&lt;h2 id=&quot;how-to-integrate-storyblok-into-eleventy&quot; tabindex=&quot;-1&quot;&gt;How to integrate Storyblok into Eleventy &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/eleventy-storyblok/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As a headless CMS, you can integrate Storyblok into any front-end project. However, it is easier depending on the technology you use.&lt;/p&gt;
&lt;p&gt;Storyblok works with many modern frameworks and maintains SDKs to install in Vue, Nuxt, React, Next, Astro, SvelteKit, Remix or Gatsby projects. However, there is no official Eleventy SDK (yet).&lt;/p&gt;
&lt;p&gt;But there are other ways to integrate Storyblok into an Eleventy project. In a future article, I&#39;ll explain step-by-step how to integrate Storyblok into an Eleventy project using the GraphQL API. Want to see it in action? Stay tuned!&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Building Lightning-Fast Websites with Astro and Storyblok</title>
		<link href="https://estelafranco.com/blog/storyblok-astro/"/>
		<updated>2023-07-10T00:00:00Z</updated>
		<id>https://estelafranco.com/blog/storyblok-astro/</id>
		<content type="html">&lt;p&gt;In today&#39;s digital landscape, web performance has become a critical factor in delivering great user experiences. Slow-loading sites can frustrate visitors and lead to higher bounce rates and lower conversions. However, achieving blazing-fast performance without compromising functionality can be a challenging task.&lt;/p&gt;
&lt;p&gt;Astro and Storyblok is a power couple that empowers developers to build lightning-fast websites with a limited amount of JavaScript. By combining Astro&#39;s static site generation capabilities with Storyblok&#39;s headless CMS, developers can leverage the power of pre-rendered content and reduce client-side JavaScript execution, resulting in optimal site speed. This article delves into the seamless integration of Astro and Storyblok, highlighting the performance benefits and efficiency this approach delivers for modern web development.&lt;/p&gt;
&lt;h2 id=&quot;astro&quot; tabindex=&quot;-1&quot;&gt;Astro &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/storyblok-astro/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Astro is an open-source framework for building fast, content-focused websites with a modern developer experience.&lt;/p&gt;
&lt;p&gt;Astro is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Content-focused: this framework was designed for content-rich websites.&lt;/li&gt;
&lt;li&gt;Server-first: rendering the HTML in the server results in faster websites.&lt;/li&gt;
&lt;li&gt;Fast by default: in theory, building slow websites in Astro should be impossible.&lt;/li&gt;
&lt;li&gt;Easy to use: Astro is for everybody. You don&#39;t need to be an expert to build something with Astro.&lt;/li&gt;
&lt;li&gt;Fully-Featured: you can choose from over +100 Astro integrations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Moreover, these are some of Astro&#39;s key features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bring Your Own Framework: You can use your favorite framework to build your project (React, Svelte, Vue...), or you can use just plain HTML and JavaScript.&lt;/li&gt;
&lt;li&gt;100% static HTML: Astro renders your page to static HTML, removing all JavaScript from your final build by default.&lt;/li&gt;
&lt;li&gt;On-Demand Components: If you need some JavaScript, Astro can automatically hydrate interactive components when they become visible on the page.&lt;/li&gt;
&lt;li&gt;Fully-Featured: Astro supports TypeScript, Scoped CSS, CSS Modules, Sass, Tailwind, Markdown, MDX, and any of your favorite npm packages.&lt;/li&gt;
&lt;li&gt;SEO features: Automatic sitemaps, RSS feeds, paginations, and collections.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As you can see, Astro is an excellent option for building lightning-fast websites. However, creating and managing the content directly from Astro may not be the best experience for content editors.&lt;/p&gt;
&lt;h2 id=&quot;storyblok&quot; tabindex=&quot;-1&quot;&gt;Storyblok &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/storyblok-astro/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To overcome this limitation, you can use a headless CMS so your editors will have a visual tool to create and manage your website&#39;s content. And Storyblok is a great option to do that.&lt;/p&gt;
&lt;p&gt;I&#39;m planning to write a full article about Storyblok because it&#39;s worth going deeper into it and discovering all the capabilities and features you can leverage for your project.&lt;/p&gt;
&lt;p&gt;But, for now, here you have some of Storyblok&#39;s key features and why I choose it as my favorite headless CMS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Headless: you can integrate Storyblok in any front-end project because it&#39;s a headless solution. Moreover, you can change your front-end and easily migrate your content from one technology to another.&lt;/li&gt;
&lt;li&gt;Cloud-native: you don&#39;t need to host it. Storyblok does that for you.&lt;/li&gt;
&lt;li&gt;Visual editor: you don&#39;t need to know markdown or any other markup languages to create and manage your content. Storyblok has a visual editor where you can visually manage and preview your content.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;show-don&#39;t-tell&quot; tabindex=&quot;-1&quot;&gt;Show, don&#39;t tell &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/storyblok-astro/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The theory sounds great, but let&#39;s see a step-by-step practical example of creating a basic project using Astro and Storyblok.&lt;/p&gt;
&lt;h3 id=&quot;1.-create-a-storyblok-project&quot; tabindex=&quot;-1&quot;&gt;1. Create a Storyblok project &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/storyblok-astro/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Log in to Storyblok and create a new space by clicking &lt;strong&gt;Add Space&lt;/strong&gt;:&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/create-new-space-storyblok.jpg&quot;&gt;
&lt;p&gt;Choose the &lt;strong&gt;New Space&lt;/strong&gt; option, define a name for the space and choose the server location (by default, EU):&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/new-space-storyblok.jpg&quot;&gt;
&lt;p&gt;Storyblok will create a space with sample content for you.&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/sample-content-storyblok.jpg&quot;&gt;
&lt;h3 id=&quot;2.-create-an-astro-project&quot; tabindex=&quot;-1&quot;&gt;2. Create an Astro project &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/storyblok-astro/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;From your Storyblok space, go to Get Started and copy the npx command:&lt;/p&gt;
&lt;img class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/get-local-copy-storyblok.jpg&quot;&gt;
&lt;p&gt;Now you can locally execute the copied command, and Storyblok&#39;s wizard will guide you through the process. To properly follow this tutorial, I need you to choose the following options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Select framework: Astro&lt;/li&gt;
&lt;li&gt;Select package manager: npm&lt;/li&gt;
&lt;li&gt;Space region: EU&lt;/li&gt;
&lt;li&gt;Local folder name for the project: up to you!&lt;/li&gt;
&lt;li&gt;Serve Storyblok locally: No&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This will create the local Astro project. Now, access and install all the dependencies by running the following command:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; ./your-project-folder &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once everything is installed, you will have your Astro + Storyblok project locally. But let&#39;s modify a couple of things.&lt;/p&gt;
&lt;p&gt;Open your &lt;code&gt;astro.config.mjs&lt;/code&gt; file. You will see your Access token is hardcoded there.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;defineConfig&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token literal-property property&quot;&gt;integrations&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token function&quot;&gt;storyblok&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token comment&quot;&gt;// accessToken: env.STORYBLOK_TOKEN,&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token literal-property property&quot;&gt;accessToken&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;xxxxxxxxxxxxxxxxxxxxxxxx&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token literal-property property&quot;&gt;apiOptions&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token literal-property property&quot;&gt;region&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But you can create a &lt;code&gt;.env&lt;/code&gt; file in your root and set there your access token:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# .env file&lt;/span&gt;&lt;br&gt;STORYBLOK_TOKEN: xxxxxxxxxxxxxxxxxxxxxxxx&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And modify your &lt;code&gt;astro.config.mjs&lt;/code&gt; file accordingly:&lt;/p&gt;
&lt;pre class=&quot;language-diff-js&quot;&gt;&lt;code class=&quot;language-diff-js&quot;&gt;...&lt;br&gt;export default defineConfig({&lt;br&gt;&lt;span class=&quot;token unchanged language-js&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;integrations&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &lt;span class=&quot;token function&quot;&gt;storyblok&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span class=&quot;token deleted-sign deleted language-js&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;     &lt;span class=&quot;token comment&quot;&gt;// accessToken: env.STORYBLOK_TOKEN,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;     &lt;span class=&quot;token literal-property property&quot;&gt;accessToken&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;xxxxxxxxxxxxxxxxxxxxxxxx&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted language-js&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;     &lt;span class=&quot;token literal-property property&quot;&gt;accessToken&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;STORYBLOK_TOKEN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span class=&quot;token unchanged language-js&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     &lt;span class=&quot;token literal-property property&quot;&gt;apiOptions&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;       &lt;span class=&quot;token literal-property property&quot;&gt;region&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/span&gt;...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If your region is in the US instead of EU, you will need to update that field in the same file:&lt;/p&gt;
&lt;pre class=&quot;language-diff-js&quot;&gt;&lt;code class=&quot;language-diff-js&quot;&gt;...&lt;br&gt;export default defineConfig({&lt;br&gt;&lt;span class=&quot;token unchanged language-js&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;integrations&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &lt;span class=&quot;token function&quot;&gt;storyblok&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     &lt;span class=&quot;token literal-property property&quot;&gt;accessToken&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;STORYBLOK_TOKEN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     &lt;span class=&quot;token literal-property property&quot;&gt;apiOptions&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span class=&quot;token deleted-sign deleted language-js&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;        &lt;span class=&quot;token literal-property property&quot;&gt;region&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted language-js&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;        &lt;span class=&quot;token literal-property property&quot;&gt;region&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;US&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span class=&quot;token unchanged language-js&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/span&gt;...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Optional step:&lt;/strong&gt; Storyblok requires HTTPS to access the visual editor. By default, the Astro project comes with Vite&#39;s &lt;code&gt;basicSsl&lt;/code&gt; plugin. However, I prefer to use &lt;code&gt;mkcert&lt;/code&gt;. To install it, run the following command:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# install mkcert with npm&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; vite-plugin-mkcert &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And update your &lt;code&gt;astro.config.mjs&lt;/code&gt; file accordingly:&lt;/p&gt;
&lt;pre class=&quot;language-diff-js&quot;&gt;&lt;code class=&quot;language-diff-js&quot;&gt;// astro.config.mjs file &lt;br&gt;&lt;span class=&quot;token unchanged language-js&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; defineConfig &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;astro/config&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; storyblok &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;@storyblok/astro&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; loadEnv &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;vite&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span class=&quot;token deleted-sign deleted language-js&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; basicSsl &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;@vitejs/plugin-basic-ssl&#39;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted language-js&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; mkcert &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;vite-plugin-mkcert&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token unchanged language-js&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; env &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;loadEnv&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cwd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;STORYBLOK&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;defineConfig&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;integrations&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &lt;span class=&quot;token function&quot;&gt;storyblok&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     &lt;span class=&quot;token literal-property property&quot;&gt;accessToken&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;STORYBLOK_TOKEN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;vite&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span class=&quot;token deleted-sign deleted language-js&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt;   &lt;span class=&quot;token literal-property property&quot;&gt;plugins&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;basicSsl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span class=&quot;token inserted-sign inserted language-js&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt;   &lt;span class=&quot;token literal-property property&quot;&gt;plugins&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;mkcert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;span class=&quot;token unchanged language-js&quot;&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &lt;span class=&quot;token literal-property property&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;     &lt;span class=&quot;token literal-property property&quot;&gt;https&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token prefix unchanged&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3.-enable-the-visual-editor&quot; tabindex=&quot;-1&quot;&gt;3. Enable the Visual Editor &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/storyblok-astro/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You&#39;re almost done! Now, you can return to Storyblok&#39;s visual editor and change the preview URL. Go to &lt;code&gt;Settings &amp;gt; Configuration &amp;gt; Visual Editor&lt;/code&gt; and set your localhost URL using HTTPS:&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/change-url-visual-editor-storyblok.jpg&quot;&gt;
&lt;p&gt;Next step! Storyblok adds the path of the content page to the URL. So, by default, the visual editor will try to load &lt;code&gt;https://localhost:3000/home&lt;/code&gt;. To change it, you need to go to the page configuration and set &lt;code&gt;/&lt;/code&gt; as the &lt;code&gt;Real path&lt;/code&gt;:&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/set-real-path-storyblok.jpg&quot;&gt;
&lt;p&gt;And now, if you refresh the visual editor, you will see your local version of your by-default Astro project&#39;s Home directly on Storyblok 🥳&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/visual-editor-storyblok.jpg&quot;&gt;
&lt;h3 id=&quot;4.-deploy-the-project-on-netlify&quot; tabindex=&quot;-1&quot;&gt;4. Deploy the project on Netlify &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/storyblok-astro/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Having a visual editor is a great tool, especially for content editors. And this is something that other headless CMSs don&#39;t offer. However, using localhost as the preview URL doesn&#39;t sound like something that content editors will be happy to hear.&lt;/p&gt;
&lt;p&gt;The good news is Storyblok allows you to configure multiple Preview URLs. Therefore, you can keep your localhost Preview URL for local development, and add other development/deployment environments as an option for the Preview source.&lt;/p&gt;
&lt;p&gt;To simplify, let&#39;s deploy our Astro project on Netlify and configure it as a new Preview URL.&lt;/p&gt;
&lt;p&gt;I assume you&#39;re familiar with GitHub and Netlify. If not, check &lt;a href=&quot;https://docs.github.com/en/get-started&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;this&lt;/a&gt; and &lt;a href=&quot;https://docs.netlify.com/get-started/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;this&lt;/a&gt; before continuing.&lt;/p&gt;
&lt;p&gt;Once you&#39;ve created a new site on Netlify, connected it to your Astro project on GitHub, and deployed it, you can add your new Netlify URL as a Preview URL. Go to &lt;code&gt;Settings &amp;gt; Configuration &amp;gt; Visual Editor&lt;/code&gt; on your Storyblok space and set your Netlify URL. You can decide if you want it as your default environment or if you want it as an option:&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/netlify-preview-url-storyblok.jpg&quot;&gt;
&lt;p&gt;And now, you finally have your visual editor enabled and available for both your developers and content editors... but with some limitations.&lt;/p&gt;
&lt;p&gt;Astro is (by default) an SSG (static site generator) and generates all pages at build time. Hence, editing content in Storyblok won&#39;t give your content editors the instant update in Netlify they might expect.&lt;/p&gt;
&lt;p&gt;To overcome this, you can use Astro in SSR mode in a specific environment for your content editors. You have more info about how to do this &lt;a href=&quot;https://dev.to/jgierer12/astro-storyblok-ssr-preview-for-instant-visual-editing-3g9m&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Last but not least, once you publish any content/change in Storyblok, you will need to deploy the project to update your pages. Doing this manually is very annoying, but you can configure a webhook to manage it.&lt;/p&gt;
&lt;p&gt;In Netlify, go to &lt;code&gt;Deploys &amp;gt; Deploy settings &amp;gt; Build hooks &amp;gt; Add new hook&lt;/code&gt;. Define a name (for example, &lt;code&gt;storyblok_publish&lt;/code&gt;), and save it. Copy the URL that this process generates.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/netlify-webhook-1.jpg&quot;&gt;
&lt;img loading=&quot;lazy&quot; class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/netlify-webhook-2.jpg&quot;&gt;
&lt;p&gt;Now, go to your Storyblok space and create a new webhook in &lt;code&gt;Settings &amp;gt; Webhooks &amp;gt; New Webhook&lt;/code&gt;. Paste the copied URL from Netlify in the &lt;code&gt;Endpoint URL&lt;/code&gt; field and check the following triggers: &lt;code&gt;Story &amp;gt; Story published&lt;/code&gt; and &lt;code&gt;Story &amp;gt; Story unpublished&lt;/code&gt;.&lt;/p&gt;
&lt;img loading=&quot;lazy&quot; class=&quot;tmpl-img&quot; src=&quot;https://estelafranco.com/img/webhooks-storyblok.jpg&quot;&gt;
&lt;p&gt;Every time you publish or unpublish any story, a new deployment will be triggered in Netlify——hence, your website will be updated.&lt;/p&gt;
&lt;h2 id=&quot;is-astro-+-storyblok-really-fast&quot; tabindex=&quot;-1&quot;&gt;Is Astro + Storyblok really fast? &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/storyblok-astro/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I&#39;ve explained a ton of things to create an Astro + Storyblok project because this combo is a great option to generate lightning-fast websites. And now that we have a boilerplate project, we can compare it to other options, right?&lt;/p&gt;
&lt;p&gt;To properly evaluate the web performance results of this project, I also created a Nuxt.js and a Next.js project with the same boilerplate content — and I deployed all the projects on Netlify. So, I have 3 publicly accessible URLs that can be measured in the lab using PageSpeed Insights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Astro: &lt;a href=&quot;https://astro-storyblok.netlify.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://astro-storyblok.netlify.app/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Nuxt: &lt;a href=&quot;https://nuxt-3-storyblok.netlify.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://nuxt-3-storyblok.netlify.app/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Next: &lt;a href=&quot;https://next-storyblok.netlify.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://next-storyblok.netlify.app/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After running 5 separate tests for each project, this is the average data:&lt;/p&gt;
&lt;div class=&quot;table-wrapper&quot;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;DESKTOP&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Astro&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Next&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Nuxt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FCP (s)&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0.413&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0.438&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1.071&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LCP (s)&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0.499&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0.535&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1.071&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SI (s)&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0.629&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0.696&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1.328&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TBT (ms)&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1.2&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLS&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0.001&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;table-wrapper&quot;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;MOBILE&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Astro&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Next&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Nuxt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FCP (s)&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0.991&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0.945&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;2.539&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LCP (s)&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0.991&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1.197&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;2.539&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SI (s)&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1.243&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1.377&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;2.972&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TBT(ms)&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;92.4&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLS&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0.001&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;As you can see, Astro has better results when compared to Nuxt or Next. And yes, I&#39;m only testing a very basic template. However, it shows the baseline differences——and demonstrates Astro + Storyblok is a winning combo.&lt;/p&gt;
&lt;p&gt;Moreover, Astro is lighter and loads less JS resources:&lt;/p&gt;
&lt;div class=&quot;table-wrapper&quot;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;DESKTOP&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Astro&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Next&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Nuxt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total resources&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size (Bytes)&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;10977&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;91912&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;81407&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Scripts&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size (Bytes)&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;7915&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;88276&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;62955&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;table-wrapper&quot;&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;MOBILE&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Astro&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Next&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;Nuxt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total resources&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size (Bytes)&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;10981&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;92003&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;81415&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Scripts&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size (Bytes)&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;7915&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;88332&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;62935&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;So, have you tried it yet? :)&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>How to measure CWVs on SPAs</title>
		<link href="https://estelafranco.com/blog/spa-cwv/"/>
		<updated>2023-03-08T00:00:00Z</updated>
		<id>https://estelafranco.com/blog/spa-cwv/</id>
		<content type="html">&lt;p&gt;One of the most challenging questions to answer when talking about Core Web Vitals is how to measure them in a Single-Page Application (SPA). In this article, I&#39;ll clarify the bottlenecks and the current state of this topic.&lt;/p&gt;
&lt;p&gt;But before going into specifics, let’s talk about soft navigations. A soft navigation refers to the seamless transition between web pages, where a new page is not entirely loaded but changed by JavaScript. While this technique has recently become quite popular through several frameworks, there are limitations to how it affects the Core Web Vitals.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://web.dev/vitals/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Core Web Vitals&lt;/a&gt; are a set of metrics that Google uses to measure website performance, including load speed, interactivity, and visual stability. These metrics are vital because they impact the website&#39;s user experience and, potentially, search engine results. Google introduced Core Web Vitals in May 2020, and since then, it has become a significant factor in website development.&lt;/p&gt;
&lt;h2 id=&quot;challenges&quot; tabindex=&quot;-1&quot;&gt;Challenges &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/spa-cwv/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As I mentioned before, while SPAs can offer a more seamless experience, they create challenges when measuring Core Web Vitals. For instance, a typical SPA page may have several navigation options, which the user can click to access different parts of the application. With soft navigations, these options are not considered unique pages, and each click merely loads new content onto the current page. The URL can be modified through JavaScript, emulating the multi-page applications&#39; (MPAs) navigation, but to the browser they are seen as updates to the current page, rather than new pages.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://developer.chrome.com/docs/crux/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Chrome User Experience Report (CrUX)&lt;/a&gt; is based on “hard” page navigations. This means metrics such as FCP, LCP, or FID will only be reported for the first viewed page. Other metrics such as CLS or INP are measured for the entire lifecycle of a page. Hence, new CLS and INP values may be collected, but assigned to the first viewed page - even if they occur after one or some soft navigations. Additionally you only get one overall value for CLS and INP, rather than one value per each application page.&lt;/p&gt;
&lt;p&gt;To overcome these limitations, developers can adopt several strategies to ensure more useful Core Web Vitals measurements. One approach is to create custom performance metrics that accurately measure user experience in SPAs.&lt;/p&gt;
&lt;p&gt;Developers can also consider using other rendering options, such as server-side rendering (SSR) or static site generators (SSG) to overcome some of the limitations of SPAs. Under these architectures, developers can ensure users have hard page navigations and avoid all the SPA inconveniences when measuring CWV.&lt;/p&gt;
&lt;p&gt;However, these options are not always possible.&lt;/p&gt;
&lt;h2 id=&quot;enabling-soft-navigations-in-chrome-(experimental)&quot; tabindex=&quot;-1&quot;&gt;Enabling soft navigations in Chrome (experimental) &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/spa-cwv/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Since Chrome 110, you can enable soft navigations and have the opportunity to start measuring Core Web Vitals. According to &lt;a href=&quot;https://developer.chrome.com/blog/soft-navigations-experiment/#how-do-i-enable-soft-navigations-in-chrome&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Chrome’s documentation&lt;/a&gt;, you can enable it in two different ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;By turning on the Experimental Web Platform features flag at &lt;code&gt;chrome://flags/#enable-experimental-web-platform-features&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Or using the &lt;code&gt;--enable-experimental-web-platform-features&lt;/code&gt; command line argument when launching Chrome.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Note: For websites that wish to enable this for all their visitors to see the impact, there is an &lt;a href=&quot;https://developer.chrome.com/docs/web-platform/origin-trials/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;origin trial running from Chrome 110 to Chrome 112&lt;/a&gt; which can be enabled by signing up for the trial and including a meta element with the origin trial token in the HTML or HTTP header.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;measuring-core-web-vitals-per-soft-navigation&quot; tabindex=&quot;-1&quot;&gt;Measuring Core Web Vitals per soft navigation &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/spa-cwv/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After enabling the Experimental Web Platform features flag, you will see the following information in the Console after each soft navigation.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;  A soft navigation has been detected: https://example.com/page&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And now you’re almost ready to start measuring CWVs for each soft navigation.&lt;/p&gt;
&lt;h3 id=&quot;using-a-performanceobserver&quot; tabindex=&quot;-1&quot;&gt;Using a PerformanceObserver &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/spa-cwv/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you’re using a &lt;code&gt;PerformanceObserver&lt;/code&gt;, you need to include &lt;code&gt;includeSoftNavigationObservations: true&lt;/code&gt; in your &lt;code&gt;observe&lt;/code&gt; call. For instance, a basic example to display the LCP in the console:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PerformanceObserver&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;entryList&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; entry &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; entryList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getEntries&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;LCP candidate:&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; entry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startTime&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; entry&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;observe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;largest-contentful-paint&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;buffered&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;includeSoftNavigationObservations&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once you implement this, you will be able to see the different LCP candidates for each soft navigation in the console. Something like this:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;  A soft navigation has been detected: https://www.example.com/page2&lt;br&gt;  LCP candidate: 6054.2999&lt;br&gt;  ▶ LargestContentfulPaint {renderTime: 6054.299, loadTime: 0, size: 3591, id: &#39;&#39;, url: &#39;&#39;, ...}&lt;br&gt;  LCP candidate: 6177.7999&lt;br&gt;  ▶ LargestContentfulPaint {renderTime: 6177.799, loadTime: 6155, size: 166500, id: &#39;&#39;, url: &#39;https://www.example.com/image.jpg&#39;, ...}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For every LCP candidate, you&#39;ll get an object with all the related details such as the HTML element, URL (if the LCP candidate is an external file), loadTime, and size, among others.&lt;/p&gt;
&lt;p&gt;As well as LCP, you can use a &lt;code&gt;PerformanceObserver&lt;/code&gt; to display the details for the other web vitals as desired. For example, the following code will display the details for CLS:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; clsValue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; clsEntries &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; sessionValue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; sessionEntries &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PerformanceObserver&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;entryList&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; entry &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; entryList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getEntries&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token comment&quot;&gt;// Only count layout shifts without recent user input.&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;entry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hadRecentInput&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; firstSessionEntry &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sessionEntries&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; lastSessionEntry &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sessionEntries&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;sessionEntries&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;        &lt;span class=&quot;token comment&quot;&gt;// If the entry occurred less than 1 second after the previous entry and&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token comment&quot;&gt;// less than 5 seconds after the first entry in the session, include the&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token comment&quot;&gt;// entry in the current session. Otherwise, start a new session.&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sessionValue &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;br&gt;            entry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startTime &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; lastSessionEntry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startTime &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;br&gt;            entry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startTime &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; firstSessionEntry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startTime &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;          sessionValue &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; entry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;          sessionEntries&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;entry&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;          sessionValue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; entry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;          sessionEntries &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;entry&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;        &lt;span class=&quot;token comment&quot;&gt;// If the current session value is larger than the current CLS value,&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token comment&quot;&gt;// update CLS and the entries contributing to it.&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sessionValue &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; clsValue&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;          clsValue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sessionValue&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;          clsEntries &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sessionEntries&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;          &lt;span class=&quot;token comment&quot;&gt;// Log the updated value (and its entries) to the console.&lt;/span&gt;&lt;br&gt;          console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;CLS:&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; clsValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; clsEntries&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;observe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;layout-shift&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;buffered&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;includeSoftNavigationObservations&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;using-web-vitals.js&quot; tabindex=&quot;-1&quot;&gt;Using web-vitals.js &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/spa-cwv/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;An easier way is to use the &lt;a href=&quot;https://github.com/GoogleChrome/web-vitals&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;web-vitals.js&lt;/a&gt; library to measure them, which takes care of many of the calculations you may need to do from the Performance Observer entries, as shown in the above CLS example. To do this use the &lt;a href=&quot;https://www.npmjs.com/package/web-vitals/v/soft-navs&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;soft-navs branch&lt;/a&gt; and include &lt;code&gt;{reportSoftNavs: true}&lt;/code&gt; in the functions&#39; calls. For example, using this basic code to display FCP, LCP and CLS:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;    onFCP&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    onLCP&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    onCLS&lt;br&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;web-vitals&#39;&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class=&quot;token function&quot;&gt;onFCP&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;FCP: &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;reportSoftNavs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token function&quot;&gt;onLCP&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;LCP: &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;reportSoftNavs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token function&quot;&gt;onCLS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;CLS: &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;reportSoftNavs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And then you will get this kind of information in the console:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;  A soft navigation has been detected: https://www.example.com/page2&lt;br&gt;  CLS: 0.00192837465&lt;br&gt;  FCP: 32.6739203094&lt;br&gt;  LCP: 803.83929999&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The web-vitals library currently reports the following metrics for soft navigations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TTFB&lt;/strong&gt;: Reported as 0. In the future, Google may support more precise ways of knowing which request is the soft navigation’s “navigation request” and will be able to have more precise TTFB measurements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FCP&lt;/strong&gt;: The time of the next contentful paint, relative to the soft navigation start time. Existing paints present from the previous navigation are not considered - only new contentful paints. Therefore, the FCP will be &amp;gt;= 0.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LCP&lt;/strong&gt;: The time of the next largest contentful paint, relative to the soft navigation start time. Like FCP, existing paints present from the previous navigation are not considered. Therefore, the LCP will be &amp;gt;= 0. As usual, this will be reported upon an interaction (for example by clicking on the page), or when the page is backgrounded or navigated away from, as only then can the LCP be finalized.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLS&lt;/strong&gt;: The largest window of shifts between the navigation times. Similar to LCP, this is only finalized when the page is backgrounded or navigated away from. A 0 value is reported if there were no shifts on that page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FID&lt;/strong&gt;: Currently only the first FID for the page is reported by Chrome, so this is not yet reported for soft navigations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;INP&lt;/strong&gt;: The INP between the navigation times. As usual this will be reported upon an interaction, or when the page is backgrounded as only then can the INP be finalized. A 0 value is not reported if there are no interactions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;conclusions&quot; tabindex=&quot;-1&quot;&gt;Conclusions &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/spa-cwv/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is an exciting experiment to start measuring a common architecture on the modern web that is currently missing from CrUX. Still, it is a first step, and again, it is an experiment. However, Google is really looking forward to gathering feedback from it. So, if you&#39;re testing this approach, feel free to share your feedback with them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open an issue on &lt;a href=&quot;https://github.com/WICG/soft-navigations/issues&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Report an issue on &lt;a href=&quot;https://bugs.chromium.org/p/chromium/issues/list&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Chrome&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Drop a message at web-vitals-feedback@googlegrouops.com.&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>Hello, World!</title>
		<link href="https://estelafranco.com/blog/hello-world/"/>
		<updated>2022-07-18T00:00:00Z</updated>
		<id>https://estelafranco.com/blog/hello-world/</id>
		<content type="html">&lt;p&gt;Hi there! This is my first post on my brand new blog.&lt;/p&gt;
&lt;p&gt;As a Jamstack fangirl, I built it with Eleventy and deployed it with Netlify. Don&#39;t you know what I&#39;m talking about? Don&#39;t worry. I&#39;ll write about this Jamstack stuff in future articles on my blog.&lt;/p&gt;
&lt;h2 id=&quot;who-am-i&quot; tabindex=&quot;-1&quot;&gt;Who am I? &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/hello-world/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;My name is Estela Franco. I&#39;m a web performance and technical SEO lover from sunny Barcelona (Spain). If you&#39;re interested, you can find a little bit more information about me in the &lt;a href=&quot;https://estelafranco.com/about/&quot;&gt;About me section&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-will-you-find-here&quot; tabindex=&quot;-1&quot;&gt;What will you find here? &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/hello-world/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As I mentioned, here you will find articles about Jamstack. But that&#39;s not the only (or even the most important) topic. Currently, I&#39;m focused on web performance and technical SEO. So, expect content covering these areas, among other content related to web development or Google technologies.&lt;/p&gt;
&lt;h2 id=&quot;what&#39;s-next-stay-tuned!&quot; tabindex=&quot;-1&quot;&gt;What&#39;s next? Stay tuned! &lt;a class=&quot;direct-link&quot; href=&quot;https://estelafranco.com/blog/hello-world/&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is only a &amp;quot;Hello, World!&amp;quot; article before shipping my new website to production. So, it&#39;s short and concise.&lt;/p&gt;
&lt;p&gt;I haven&#39;t planned a specific periodicity to write stuff here, but if you need more content before my next article, you can also &lt;a href=&quot;https://twitter.com/guaca&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;follow me on Twitter&lt;/a&gt; or &lt;a href=&quot;https://toot.cafe/@guaca&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Mastodon&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Last but not least, I also know I still need to keep working on CSS to improve the overall look &amp;amp; feel. Will do! But you know, done is better than perfect.&lt;/p&gt;
&lt;p&gt;See you soon!&lt;/p&gt;
</content>
	</entry>
</feed>
