<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en" xml:base="https://sproutwareconsulting.com/">
  <title>My Web Development Blog</title>
  <subtitle>Tell the word what you are writing about in your blog. It will show up on feed readers.</subtitle>
  <link href="https://sproutwareconsulting.com/feed.xml" rel="self" />
  <link href="https://sproutwareconsulting.com/" />
  <updated>2025-03-31T19:12:41Z</updated>
  <id>https://sproutwareconsulting.com/</id>
  <author>
    <name>Adam Weitzman</name>
  </author>
	<entry>
      <title>Eleventy Excellent 4.0</title>
      <link href="https://sproutwareconsulting.com/blog/eleventy-excellent-40/" />
      <updated>2025-01-11T00:00:00Z</updated>
      <id>https://sproutwareconsulting.com/blog/eleventy-excellent-40/</id>
      <content type="html">
				&lt;p&gt;A new version is here! This includes a bunch of breaking changes.&lt;br&gt;Again I am changing the body font for this update, this time it’s &lt;a href=&quot;https://www.brailleinstitute.org/freefont/&quot; rel=&quot;noopener&quot;&gt;Atkinson Hyperlegible&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;new-image-handling&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/eleventy-excellent-40/#new-image-handling&quot; class=&quot;heading-anchor&quot;&gt;New Image handling&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I have been clinging to my image shortcode for too long. With the &lt;a href=&quot;https://github.com/11ty/eleventy-img/releases/tag/v6.0.0&quot; rel=&quot;noopener&quot;&gt;latest major version of Eleventy Image&lt;/a&gt; I decided it’s finally time to also include the transform method, because it is awesome.&lt;/p&gt;&lt;p&gt;That alone would not be a breaking change, but I decided to change the existing Nunjucks image shortcode a bit. If you use the shortcode beyond the container class, you must adjust your code to these changes:&lt;/p&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; src&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  alt &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;
  caption &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;
  loading &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;lazy&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  containerClass&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  imageClass&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  widths &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 number&quot;&gt;650&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;960&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1400&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;
  sizes &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;auto&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  formats &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 string&quot;&gt;&#39;avif&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;webp&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;jpeg&#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 operator&quot;&gt;=&amp;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;/code&gt;&lt;/pre&gt;&lt;ul class=&quot;list&quot;&gt;&lt;li&gt;&lt;strong&gt;Breaking:&lt;/strong&gt; &lt;code&gt;widths&lt;/code&gt; is now passed in &lt;em&gt;before&lt;/em&gt; &lt;code&gt;sizes&lt;/code&gt; (because I change this value much more often).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Breaking:&lt;/strong&gt; &lt;code&gt;imageClass&lt;/code&gt; is a new paramteter dedicated to the &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; element, while &lt;code&gt;containerClass&lt;/code&gt; is for the container (&lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt;), as before.&lt;/li&gt;&lt;li&gt;also new: for all images you can start the path relative to the input folder (drop &lt;code&gt;./src&lt;/code&gt; in the path, though it is compatible with &lt;code&gt;./src&lt;/code&gt; being present)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Using the transform comes with the great advantage, that you can now use co-located images with the HTML and Markdown sytnax. 🎉&lt;/p&gt;&lt;p&gt;For a detailed overview of the new image possibilities &lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-an-image/&quot;&gt;see the dedicated blog post&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;cascade-layers&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/eleventy-excellent-40/#cascade-layers&quot; class=&quot;heading-anchor&quot;&gt;Cascade layers&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://mayank.co/blog/css-reset-layer/&quot; rel=&quot;noopener&quot;&gt;Inspired by Mayank’s post&lt;/a&gt;, I’ve transitioned to using &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Styling_basics/Cascade_layers&quot; rel=&quot;noopener&quot;&gt;cascade layers&lt;/a&gt;, instead of using the &lt;code&gt;:where()&lt;/code&gt; pseudo-class to create low-specificity selectors for resets and compositions.&lt;/p&gt;&lt;ul class=&quot;list&quot;&gt;&lt;li&gt;The global CSS bundle is now organized with cascade layers.&lt;/li&gt;&lt;li&gt;The local CSS bundle, used for per-page or component-specific styles, does not utilize cascade layers. As a result, all CSS blocks included have a higher specificity than global styles, regardless of the selector specificity in the global CSS bundle.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Breaking:&lt;/strong&gt; The “inline” bundle is now called “local”, as this made more sense: all bundles are inlined.&lt;/p&gt;&lt;h2 id=&quot;new-color-system&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/eleventy-excellent-40/#new-color-system&quot; class=&quot;heading-anchor&quot;&gt;New color system&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Run &lt;code&gt;npm run colors&lt;/code&gt; after defining your base color values in &lt;code&gt;src/_data/designTokens/colorsBase.json&lt;/code&gt;. This will generate or update the &lt;code&gt;colors.json&lt;/code&gt; file in the same directory.&lt;/p&gt;&lt;ul class=&quot;list&quot;&gt;&lt;li&gt;Colors under &lt;code&gt;shades_neutral&lt;/code&gt; or &lt;code&gt;shades_vibrant&lt;/code&gt; are converted into scalable palettes. This is not very elaborate, use a value more or less in the middle of the scale. Happy to receive suggestions for improvements.&lt;/li&gt;&lt;li&gt;Colors listed under &lt;code&gt;standalone&lt;/code&gt; and &lt;code&gt;light_dark&lt;/code&gt; are left as they are, &lt;code&gt;light_dark&lt;/code&gt; items output a second “subdued” version optimized for dark themes.&lt;/li&gt;&lt;/ul&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// this creates a palette with shades of green, 100 to 900&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;shades_vibrant&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;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;green&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#008000&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;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;src/assets/css/global/base/variables.css&lt;/code&gt; changed a lot, as I now use new color names. I also dropped the &lt;code&gt;@supports&lt;/code&gt; blocks for &lt;code&gt;color-mix()&lt;/code&gt; and the relative color syntax – not because they aren’t great, but I just perceived the whole file as too complex. Now JavaScript does the step of creating subdued colors for the dark theme.&lt;/p&gt;&lt;p&gt;I also considered using the new &lt;code&gt;light-dark()&lt;/code&gt; CSS function instead of the repetitive code for &lt;code&gt;prefers-color-scheme&lt;/code&gt; and &lt;code&gt;data-theme=“dark”&lt;/code&gt;, but the browser support is still too low.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Breaking:&lt;/strong&gt;: &lt;code&gt;src/assets/css/global/base/variables.css&lt;/code&gt; changed. You must adapt your colors in &lt;code&gt;src/_data/designTokens/colorsBase.json&lt;/code&gt; if you want to use the &lt;code&gt;npm run colors&lt;/code&gt; script.&lt;/p&gt;&lt;p&gt;You can also just completely skip that and define your colors directly in &lt;code&gt;colors.json&lt;/code&gt; (I recommend deleting the &lt;code&gt;colors&lt;/code&gt; command in &lt;code&gt;package.json&lt;/code&gt; in this case, so you don’t unitentionally overwrite your work).&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://sproutwareconsulting.com/get-started/#design-tokens&quot;&gt;More about colors here&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;new-button-styles&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/eleventy-excellent-40/#new-button-styles&quot; class=&quot;heading-anchor&quot;&gt;New button styles&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Inspired by &lt;a href=&quot;https://piccalil.li/blog/how-i-build-a-button-component/&quot; rel=&quot;noopener&quot;&gt;Andy’s article&lt;/a&gt;, the button styles changed. As the article explains that very well, I won’t say much more about it.&lt;/p&gt;&lt;h2 id=&quot;other-new-features-and-changes&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/eleventy-excellent-40/#other-new-features-and-changes&quot; class=&quot;heading-anchor&quot;&gt;Other new features and changes&lt;/a&gt;&lt;/h2&gt;&lt;ul class=&quot;list&quot;&gt;&lt;li&gt;&lt;code&gt;border-radius&lt;/code&gt; became a design token used by the Tailwind config, to be set in &lt;code&gt;src/_data/designTokens/borderRadius.json&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;new &lt;code&gt;3XS&lt;/code&gt; spacing value in &lt;code&gt;src/_data/designTokens/spacing.json&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;new &lt;code&gt;grid&lt;/code&gt; composition layout &lt;code&gt;data-layout=&#39;thirds&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;new OG images template. As it uses &lt;code&gt;meta.siteName&lt;/code&gt; next to the 11ty Logo, you might have to adjust the template for that &lt;code&gt;src/common/og-images.njk&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Let me know if you have any questions or issues with the update.&lt;br&gt;I am happy to help you out. Maybe you’ll want to wait a bit, as I will add some more fixes, no doubt.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Post with an image</title>
      <link href="https://sproutwareconsulting.com/blog/post-with-an-image/" />
      <updated>2025-01-09T00:00:00Z</updated>
      <id>https://sproutwareconsulting.com/blog/post-with-an-image/</id>
      <content type="html">
				&lt;p&gt;Using the powerful Eleventy Image plugin, we have three ways to optimize images: HTML Transform, Markdown syntax, and a Nunjucks shortcode.&lt;/p&gt;&lt;h2 id=&quot;html-transform&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-an-image/#html-transform&quot; class=&quot;heading-anchor&quot;&gt;HTML Transform&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Transforms any &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; tags in HTML files as a post-processing step. Find the default settings directly in &lt;code&gt;eleventy.config.js&lt;/code&gt;.&lt;/p&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;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&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;./co-located-image.jpg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&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;alt text&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;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;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&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;/assets/images/absolute-path-image.jpg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&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;alt text&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We can pass in overrides for every instance and use attributes. By default all images are set to be lazy loaded, but we can override this by directly setting &lt;code&gt;loading=&quot;eager&quot;&lt;/code&gt; and &lt;code&gt;decoding=&quot;sync&quot;&lt;/code&gt;on the &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; element.&lt;/p&gt;&lt;p&gt;Another thing to note is the &lt;code&gt;widths: [&#39;auto&#39;]&lt;/code&gt; setting, which by default only includes the original size image. You can set the dedicated &lt;code&gt;widths&lt;/code&gt; to be used by adding &lt;code&gt;eleventy:widths=&quot;800,1200&quot;&lt;/code&gt; on the element. For images with &lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-an-image/#markdown-syntax&quot;&gt;Markdown syntax&lt;/a&gt;, I set fixed &lt;code&gt;widths&lt;/code&gt; so we don’t need to set a value on every instance.&lt;/p&gt;&lt;p&gt;&lt;code&gt;sizes&lt;/code&gt; defaults to &lt;code&gt;auto&lt;/code&gt;, which is applied to all lazy loading images. For eager-loading images, the value is equivalent to &lt;code&gt;100vw&lt;/code&gt; See: &lt;a href=&quot;https://github.com/whatwg/html/pull/8008&quot; rel=&quot;noopener&quot;&gt;https://github.com/whatwg/html/pull/8008&lt;/a&gt;. We can &lt;em&gt;still&lt;/em&gt; overwrite this, by setting the &lt;code&gt;sizes&lt;/code&gt; attribute directly on the &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; element, with something specific like &lt;code&gt;sizes=&quot;(max-width: 615px) 50vw, 100vw&quot;&lt;/code&gt;.&lt;/p&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;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&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;./co-located-image.jpg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&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;alt text&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;&lt;span class=&quot;token namespace&quot;&gt;eleventy:&lt;/span&gt;widths&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;200,600&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;loading&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;eager&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;decoding&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;sync&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/blog/post-with-an-image/F54o5PK949-200.webp 200w, https://sproutwareconsulting.com/blog/post-with-an-image/F54o5PK949-600.webp 600w&quot; sizes=&quot;(max-width: 615px) 50vw, 100vw&quot;&gt;&lt;img loading=&quot;eager&quot; decoding=&quot;sync&quot; src=&quot;https://sproutwareconsulting.com/blog/post-with-an-image/F54o5PK949-200.jpeg&quot; alt=&quot;A picturesque valley showcasing majestic mountains and lush forests, creating a serene and captivating landscape&quot; width=&quot;600&quot; height=&quot;450&quot; srcset=&quot;https://sproutwareconsulting.com/blog/post-with-an-image/F54o5PK949-200.jpeg 200w, https://sproutwareconsulting.com/blog/post-with-an-image/F54o5PK949-600.jpeg 600w&quot; sizes=&quot;(max-width: 615px) 50vw, 100vw&quot;&gt;&lt;/picture&gt;&lt;p&gt;This makes this syntax equally powerfull as the &lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-an-image/#nunjucks-shortcode&quot;&gt;shortcode&lt;/a&gt;, and easier to read - with the extra benefit that we can use both relative and absolute image sources.&lt;br&gt;Only “downside” ist, that it comes with a higher build cost due to the post-processing step.&lt;/p&gt;&lt;p&gt;More info: &lt;a href=&quot;https://www.11ty.dev/docs/plugins/image/#html-transform&quot; rel=&quot;noopener&quot;&gt;https://www.11ty.dev/docs/plugins/image/#html-transform&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;markdown-syntax&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-an-image/#markdown-syntax&quot; class=&quot;heading-anchor&quot;&gt;Markdown syntax&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This also uses &lt;a href=&quot;https://www.11ty.dev/docs/plugins/image/#html-transform&quot; rel=&quot;noopener&quot;&gt;Image HTML Transform &lt;/a&gt;.&lt;br&gt;The markdown sytnax for images creates the &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; element the plugin is looking for, and then transforms it to the &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; element (if more than one format is set).&lt;/p&gt;&lt;p&gt;In &lt;code&gt;src/_config/plugins/markdown.js&lt;/code&gt; I customized the Markdown rendering for images slightly. What normally would become a &lt;code&gt;title&lt;/code&gt; attribute is used to create a caption. Note that I set a fixed &lt;code&gt;widths&lt;/code&gt; value instead of &lt;code&gt;auto&lt;/code&gt; as the default.&lt;/p&gt;&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;![alt text](/path/to/image &#39;caption text&#39;)
&lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;[&lt;span class=&quot;token content&quot;&gt;Close-up with unfocused background of a vibrant large blue butterfly gracefully perched on a delicate flower amidst lush green gras&lt;/span&gt;](&lt;span class=&quot;token url&quot;&gt;/assets/images/gallery/asturias-4.jpg&lt;/span&gt;)&lt;/span&gt; &#39;I used a portrait lens for this one&#39;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/img/EHwkdjzoWm-650.webp 650w, https://sproutwareconsulting.com/img/EHwkdjzoWm-960.webp 960w, https://sproutwareconsulting.com/img/EHwkdjzoWm-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://sproutwareconsulting.com/img/EHwkdjzoWm-650.jpeg&quot; alt=&quot;Close-up with unfocused background of a vibrant large blue butterfly gracefully perched on a delicate flower amidst lush green gras&quot; title=&quot;I used a portrait lens for this one&quot; width=&quot;1400&quot; height=&quot;930&quot; srcset=&quot;https://sproutwareconsulting.com/img/EHwkdjzoWm-650.jpeg 650w, https://sproutwareconsulting.com/img/EHwkdjzoWm-960.jpeg 960w, https://sproutwareconsulting.com/img/EHwkdjzoWm-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;I used a portrait lens for this one&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;You can also add custom attributes here (&lt;a href=&quot;https://www.aleksandrhovhannisyan.com/blog/eleventy-image-transform/&quot; rel=&quot;noopener&quot;&gt;Kudos to Aleksandr&lt;/a&gt;), to overwrite the default &lt;code&gt;widths&lt;/code&gt;, have the image eagerly loaded, or add a class etc.&lt;/p&gt;&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;[&lt;span class=&quot;token content&quot;&gt;alt text&lt;/span&gt;](&lt;span class=&quot;token url&quot;&gt;/path/to/image&lt;/span&gt;)&lt;/span&gt;{attrs}
&lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;[&lt;span class=&quot;token content&quot;&gt;Close-up of a delicate white flower with a yellow center, surrounded by green leaves&lt;/span&gt;](&lt;span class=&quot;token url&quot;&gt;/assets/images/gallery/asturias-2.jpg&lt;/span&gt;)&lt;/span&gt;{loading=&quot;eager&quot; decoding=&quot;sync&quot; eleventy:widths=&quot;400&quot; class=&quot;grayscale&quot;}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/img/uGGG43jjos-400.webp 400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;eager&quot; decoding=&quot;sync&quot; src=&quot;https://sproutwareconsulting.com/img/uGGG43jjos-400.jpeg&quot; alt=&quot;Close-up of a delicate white flower with a yellow center, surrounded by green leaves&quot; width=&quot;400&quot; height=&quot;265&quot; class=&quot;grayscale&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h2 id=&quot;nunjucks-shortcode&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-an-image/#nunjucks-shortcode&quot; class=&quot;heading-anchor&quot;&gt;Nunjucks shortcode&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The most basic version contains the path to the image (absolute) and alt text (can be an empty string if the image is decorative).&lt;/p&gt;&lt;pre class=&quot;language-jinja2&quot;&gt;&lt;code class=&quot;language-jinja2&quot;&gt;&lt;span class=&quot;token jinja2 language-jinja2&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token tag keyword&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;path to image&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;alt text&quot;&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It defaults to &lt;code&gt;loading = &#39;lazy&#39;&lt;/code&gt;, the picture element gets its set of images from &lt;code&gt;widths=[650,960,1400]&lt;/code&gt; and compares to a condition of &lt;code&gt;sizes=&quot;auto&quot;&lt;/code&gt;.&lt;br&gt;You can pass in manually all the conditions, add &lt;code&gt;null&lt;/code&gt; to skip. The arguments include classes for the outer container ( &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt; element), and for the &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; element.&lt;/p&gt;&lt;p&gt;The shortcode is stored in &lt;code&gt;src/_config/shortcodes/image.js&lt;/code&gt;.&lt;/p&gt;&lt;pre class=&quot;language-jinja2&quot;&gt;&lt;code class=&quot;language-jinja2&quot;&gt;&lt;span class=&quot;token jinja2 language-jinja2&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token tag keyword&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;path to image&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;alt text&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;caption text&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;eager&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;container class names&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;img class names&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;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;400&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;&quot;(min-width:30em) 50vw, 100vw&quot;&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token jinja2 language-jinja2&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token tag keyword&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;path to image&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;alt text&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;eager&quot;&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;figure slot=&quot;image&quot; class=&quot;text-center&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-3-200w.avif 200w, https://sproutwareconsulting.com/assets/images/asturias-3-400w.avif 400w&quot; sizes=&quot;(min-width:30em) 50vw, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-3-200w.webp 200w, https://sproutwareconsulting.com/assets/images/asturias-3-400w.webp 400w&quot; sizes=&quot;(min-width:30em) 50vw, 100vw&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-3-200w.jpeg 200w, https://sproutwareconsulting.com/assets/images/asturias-3-400w.jpeg 400w&quot; sizes=&quot;(min-width:30em) 50vw, 100vw&quot;&gt;&lt;img src=&quot;https://sproutwareconsulting.com/assets/images/asturias-3-400w.jpeg&quot; width=&quot;400&quot; height=&quot;265&quot; alt=&quot;A traditional Asturian village with it&#39;s raised granaries, surrounded by lush green hills and mountains&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; eleventy:ignore class=&quot;grayscale&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;What a nice old house in black and white&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Example: predefine &lt;code&gt;widths&lt;/code&gt; and &lt;code&gt;sizes&lt;/code&gt; using Nunjuck’s &lt;code&gt;set&lt;/code&gt; tag or front matter fields, and dynamically get the image path, like I do in the built-with template.&lt;/p&gt;&lt;pre class=&quot;language-jinja2&quot;&gt;&lt;code class=&quot;language-jinja2&quot;&gt;&lt;span class=&quot;token jinja2 language-jinja2&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token tag keyword&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/assets/images/screenshots/&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;site&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;filename&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.jpg&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;site&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 variable&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;lazy&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;widths&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;sizes&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;comparing-shortcode-and-html-transform&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-an-image/#comparing-shortcode-and-html-transform&quot; class=&quot;heading-anchor&quot;&gt;Comparing Shortcode and HTML Transform&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The shortcode can be much terser than the HTML syntax. It also includes the &lt;code&gt;slot=&quot;image&quot;&lt;/code&gt; attribute for seamless WebC component integration. However, it’s less readable, and you must carefully order all arguments. On the other hand, the HTML syntax is much more readable and easier to maintain.&lt;/p&gt;&lt;p&gt;As for the higher build cost of post-processing, the shortcode images are being skipped using the &lt;code&gt;eleventy:ignore&lt;/code&gt; attribute, but still seem to be processed somehow. I have yet to figure out if this is avoidable. If you set the &lt;code&gt;eleventy:ignore&lt;/code&gt; on an HTML image though, it &lt;em&gt;is&lt;/em&gt; completely skipped and excluded from the processed images.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;These two approaches produce (almost) the same output:&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;language-jinja2&quot;&gt;&lt;code class=&quot;language-jinja2&quot;&gt;&lt;span class=&quot;token jinja2 language-jinja2&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token tag keyword&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;alt&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&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 variable&quot;&gt;credit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;eager&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;feature&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;grayscale&quot;&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&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;figure&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;feature&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;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;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&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 jinja2 language-jinja2&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&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 jinja2 language-jinja2&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;alt&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&gt;}}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;loading&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;eager&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;decoding&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;sync&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&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;grayscale&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token jinja2 language-jinja2&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token tag keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;credit&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&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;figcaption&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token jinja2 language-jinja2&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;credit&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&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;figcaption&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token jinja2 language-jinja2&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token tag keyword&quot;&gt;endif&lt;/span&gt; &lt;span class=&quot;token delimiter punctuation&quot;&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;figure&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;figure slot=&quot;image&quot; class=&quot;feature&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-1-650w.avif 650w, https://sproutwareconsulting.com/assets/images/asturias-1-960w.avif 960w, https://sproutwareconsulting.com/assets/images/asturias-1-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-1-650w.webp 650w, https://sproutwareconsulting.com/assets/images/asturias-1-960w.webp 960w, https://sproutwareconsulting.com/assets/images/asturias-1-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-1-650w.jpeg 650w, https://sproutwareconsulting.com/assets/images/asturias-1-960w.jpeg 960w, https://sproutwareconsulting.com/assets/images/asturias-1-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://sproutwareconsulting.com/assets/images/asturias-1-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;1050&quot; alt=&quot;A picturesque valley showcasing majestic mountains and lush forests, creating a serene and captivating landscape&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; eleventy:ignore class=&quot;grayscale&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;A photo I took.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure class=&quot;feature&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/img/F54o5PK949-2000.webp 2000w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;eager&quot; decoding=&quot;sync&quot; src=&quot;https://sproutwareconsulting.com/img/F54o5PK949-2000.jpeg&quot; alt=&quot;A picturesque valley showcasing majestic mountains and lush forests, creating a serene and captivating landscape&quot; width=&quot;2000&quot; height=&quot;1500&quot; class=&quot;grayscale&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;A photo I took.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;More:&lt;/p&gt;&lt;ul class=&quot;list&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.11ty.dev/docs/plugins/image/&quot; rel=&quot;noopener&quot;&gt;https://www.11ty.dev/docs/plugins/image/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=e0OHgC677ec&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=e0OHgC677ec&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.aleksandrhovhannisyan.com/blog/eleventy-image-transform/&quot; rel=&quot;noopener&quot;&gt;https://www.aleksandrhovhannisyan.com/blog/eleventy-image-transform/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://coryd.dev/posts/2024/setting-up-image-transforms-in-eleventy&quot; rel=&quot;noopener&quot;&gt;https://coryd.dev/posts/2024/setting-up-image-transforms-in-eleventy&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Eleventy Excellent 3.0</title>
      <link href="https://sproutwareconsulting.com/blog/eleventy-excellent-30/" />
      <updated>2024-06-03T00:00:00Z</updated>
      <id>https://sproutwareconsulting.com/blog/eleventy-excellent-30/</id>
      <content type="html">
				&lt;p&gt;It’s been a few months, and I have decided to change things again, which probably makes the starter even more opinionated 🤷. For those who prefer the previous version, Version 2 will remain accessible in its own branch.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Core changes:&lt;/strong&gt;&lt;/p&gt;&lt;ul class=&quot;list&quot;&gt;&lt;li&gt;ESM! I originally wanted to wait for the beta version of Eleventy 3.0, but the alpha version works absolutely fine, so I decided to go for it.&lt;/li&gt;&lt;li&gt;a new font for the body (base) text: Inclusive Sans. Only has Regular 400 and Regular 400 italic for now, so bold uses the display font.&lt;/li&gt;&lt;li&gt;A new config structure (turns out I am the &lt;a href=&quot;https://front-end.social/@lene/112530901535448479&quot; rel=&quot;noopener&quot;&gt;Eleventy config person!&lt;/a&gt;). I also decided to have everything inside the &lt;code&gt;src&lt;/code&gt; folder. &lt;a href=&quot;https://sproutwareconsulting.com/get-started/#config&quot;&gt;More about that in the docs&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;some new filters, for having markdown format in the frontmatter, and for sorting.&lt;/li&gt;&lt;li&gt;there is now a “setup” directory inside of the &lt;code&gt;_config&lt;/code&gt; folder, for automatic favicon creation and to add the screenshots to the “built with” section. They are triggered by new scripts in &lt;code&gt;package.json&lt;/code&gt;. See also &lt;a href=&quot;https://sproutwareconsulting.com/get-started/#favicons&quot;&gt;“Favicons” in the docs&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;SVGs are now in &lt;code&gt;src/assets/svg&lt;/code&gt;, and there is a new SVG shortcode to include them. I also explain this &lt;a href=&quot;https://sproutwareconsulting.com/get-started/#svg&quot;&gt;in the SVG section&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;I now actively use Eleventy’s plugins &lt;a href=&quot;https://www.11ty.dev/docs/languages/webc/&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;WebC&lt;/code&gt;&lt;/a&gt; (for components), the &lt;a href=&quot;https://github.com/11ty/eleventy-plugin-bundle&quot; rel=&quot;noopener&quot;&gt;bundle plugin&lt;/a&gt; and&lt;a href=&quot;https://github.com/11ty/is-land&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;&amp;lt;is-land&amp;gt;&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;I made small CSS changes everywhere - and introduce a new structure, &lt;a href=&quot;https://sproutwareconsulting.com/get-started/#css&quot;&gt;also explained in the docs&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;JavaScript handling &lt;a href=&quot;https://sproutwareconsulting.com/get-started/#javascript&quot;&gt;changed a lot, too&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Also: improvements in terms of organization and naming.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I don’t consider myself a JavaScript person, and I still struggle to fully grasp WebC. So, if you have any suggestions or improvements, in particular to the WebC and web components code, please don’t hesitate to reach out or send a PR.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Plans for the future:&lt;/strong&gt;&lt;br&gt;This starter was meant to be hosted on Netlify, and I’d like to change that so that it works with any host without much extra effort.&lt;/p&gt;&lt;p&gt;I hope you enjoy the new version! 🌟&lt;br&gt;And, should you decide to upgrade – sorry for not making this easier for you. I hope that you don’t face too many difficulties!&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Eleventy Excellent 2.0</title>
      <link href="https://sproutwareconsulting.com/blog/eleventy-excellent-20/" />
      <updated>2024-02-01T00:00:00Z</updated>
      <id>https://sproutwareconsulting.com/blog/eleventy-excellent-20/</id>
      <content type="html">
				&lt;p&gt;I changed so much, that documenting everything will be hard. I will try and name the most important changes in the next few weeks.&lt;/p&gt;&lt;h2 id=&quot;maybe-a-quick-why-first&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/eleventy-excellent-20/#maybe-a-quick-why-first&quot; class=&quot;heading-anchor&quot;&gt;Maybe a quick “why” first&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I created this starter after I saw &lt;a href=&quot;https://eleventy-excellent.netlify.app/about/#watch-the-talk&quot; rel=&quot;noopener&quot;&gt;Andy’s talk&lt;/a&gt; and studied the source code for &lt;a href=&quot;http://buildexcellentwebsit.es&quot; rel=&quot;noopener&quot;&gt;buildexcellentwebsit.es&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I quickly came to the conclusion that this is the way I want to build all my websites from now on! It’s so great. I know many of you feel the same way.&lt;/p&gt;&lt;p&gt;I had already accumulated a lot of opinions, files and basic settings from my previous Eleventy projects, and to make it easier for me to start a new project in the future, I combined everything in this starter. The name is a tribute to its origin:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“Go Forth And Build &lt;strong&gt;Excellent&lt;/strong&gt; Websites”!&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;When that was finished, I thought it was only fair to make it easily accessible to others, and at the end of 2022 I registered the starter with the &lt;a href=&quot;https://www.11ty.dev/docs/starter/&quot; rel=&quot;noopener&quot;&gt;official stater projects&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;What I didn’t count on, was &lt;em&gt;how many&lt;/em&gt; people would actually go and use the starter.&lt;/p&gt;&lt;p&gt;So many of you have also contacted me or contributed something.&lt;/p&gt;&lt;h2 id=&quot;i-wanted-to-make-the-starter-better&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/eleventy-excellent-20/#i-wanted-to-make-the-starter-better&quot; class=&quot;heading-anchor&quot;&gt;I wanted to make the starter better&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I have since made sure that everything stays fairly updated, fixed a few bugs and added a few features – but I haven’t quite dared to change the base too much, now that so many others were involved.&lt;/p&gt;&lt;p&gt;The thing is, I have learned &lt;strong&gt;lots of new things&lt;/strong&gt; and changed my mind about other stuff like naming or organization in the last year and a half. Whenever I begin a project now, I still turn to this starter – but I modify &lt;em&gt;a lot&lt;/em&gt; before I get started. This goes above all for the organization and naming of files and folders, modern CSS, and better accessibility.&lt;/p&gt;&lt;p&gt;You will see that many things are new and different, but better! And that the basic character is still the same.&lt;/p&gt;&lt;p&gt;I will try and take some time to document important changes so you can upgrade more easily.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/madrilene/eleventy-excellent/tree/v1&quot; rel=&quot;noopener&quot;&gt;I have kept v1 in a separate branch.&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;plans-for-the-future&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/eleventy-excellent-20/#plans-for-the-future&quot; class=&quot;heading-anchor&quot;&gt;Plans for the future&lt;/a&gt;&lt;/h2&gt;&lt;ul class=&quot;list&quot;&gt;&lt;li&gt;I will change everything to ES modules as soon as Eleventy v3 with ESM support is stable.&lt;/li&gt;&lt;li&gt;I might bring back the drawer menu as something to opt in (&lt;strong&gt;Update:&lt;/strong&gt; I did this already, see “&lt;a href=&quot;https://sproutwareconsulting.com/get-started/#navigation&quot;&gt;Get started&lt;/a&gt;”).&lt;/li&gt;&lt;li&gt;Lots of small fixes, no doubt.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Thank you and let’s build more excellent websites!&lt;/strong&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Post with a gallery</title>
      <link href="https://sproutwareconsulting.com/blog/post-with-a-gallery/" />
      <updated>2024-01-30T00:00:00Z</updated>
      <id>https://sproutwareconsulting.com/blog/post-with-a-gallery/</id>
      <content type="html">
				&lt;p&gt;This post has a gallery set in its front matter as a list of objects, each with an &lt;code&gt;image&lt;/code&gt;, &lt;code&gt;alt&lt;/code&gt;, and &lt;code&gt;caption&lt;/code&gt; property.&lt;/p&gt;&lt;p&gt;When you import the gallery component, the images are listed in a grid as buttons, each linked to the respective image in a &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; HTML element. A close button within each dialog allows the image to be hidden again. Includes &lt;code&gt;gallery.css&lt;/code&gt; for styling the modal dialogs and backdrop, &lt;code&gt;gallery.js&lt;/code&gt; manages modal dialog interactions.&lt;/p&gt;&lt;is-land on:idle&gt;&lt;div role=&quot;list&quot; class=&quot;gallery | grid mt-l-xl&quot;&gt;&lt;dialog class=&quot;flow modal1&quot;&gt;&lt;button autofocus class=&quot;button&quot;&gt;Close&lt;/button&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-1-650w.avif 650w, https://sproutwareconsulting.com/assets/images/asturias-1-960w.avif 960w, https://sproutwareconsulting.com/assets/images/asturias-1-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-1-650w.webp 650w, https://sproutwareconsulting.com/assets/images/asturias-1-960w.webp 960w, https://sproutwareconsulting.com/assets/images/asturias-1-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-1-650w.jpeg 650w, https://sproutwareconsulting.com/assets/images/asturias-1-960w.jpeg 960w, https://sproutwareconsulting.com/assets/images/asturias-1-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://sproutwareconsulting.com/assets/images/asturias-1-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;1050&quot; alt=&quot;A picturesque valley showcasing majestic mountains and lush forests, creating a serene and captivating landscape&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; eleventy:ignore&gt;&lt;/picture&gt;&lt;figcaption&gt;Inside the Somiedo Natural Park, Asturias&lt;/figcaption&gt;&lt;/figure&gt;&lt;/dialog&gt;&lt;button data-index=&quot;1&quot;&gt;&lt;picture slot=&quot;image&quot;&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-1-650w.avif 650w, https://sproutwareconsulting.com/assets/images/asturias-1-960w.avif 960w, https://sproutwareconsulting.com/assets/images/asturias-1-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-1-650w.webp 650w, https://sproutwareconsulting.com/assets/images/asturias-1-960w.webp 960w, https://sproutwareconsulting.com/assets/images/asturias-1-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-1-650w.jpeg 650w, https://sproutwareconsulting.com/assets/images/asturias-1-960w.jpeg 960w, https://sproutwareconsulting.com/assets/images/asturias-1-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://sproutwareconsulting.com/assets/images/asturias-1-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;1050&quot; alt=&quot;A picturesque valley showcasing majestic mountains and lush forests, creating a serene and captivating landscape&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; eleventy:ignore&gt;&lt;/picture&gt;&lt;/button&gt;&lt;dialog class=&quot;flow modal2&quot;&gt;&lt;button autofocus class=&quot;button&quot;&gt;Close&lt;/button&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-2-650w.avif 650w, https://sproutwareconsulting.com/assets/images/asturias-2-960w.avif 960w, https://sproutwareconsulting.com/assets/images/asturias-2-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-2-650w.webp 650w, https://sproutwareconsulting.com/assets/images/asturias-2-960w.webp 960w, https://sproutwareconsulting.com/assets/images/asturias-2-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-2-650w.jpeg 650w, https://sproutwareconsulting.com/assets/images/asturias-2-960w.jpeg 960w, https://sproutwareconsulting.com/assets/images/asturias-2-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://sproutwareconsulting.com/assets/images/asturias-2-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;930&quot; alt=&quot;Close-up of a delicate white flower with a yellow center, surrounded by green leaves&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; eleventy:ignore&gt;&lt;/picture&gt;&lt;figcaption&gt;Jasmine nightshades blooming in July&lt;/figcaption&gt;&lt;/figure&gt;&lt;/dialog&gt;&lt;button data-index=&quot;2&quot;&gt;&lt;picture slot=&quot;image&quot;&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-2-650w.avif 650w, https://sproutwareconsulting.com/assets/images/asturias-2-960w.avif 960w, https://sproutwareconsulting.com/assets/images/asturias-2-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-2-650w.webp 650w, https://sproutwareconsulting.com/assets/images/asturias-2-960w.webp 960w, https://sproutwareconsulting.com/assets/images/asturias-2-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-2-650w.jpeg 650w, https://sproutwareconsulting.com/assets/images/asturias-2-960w.jpeg 960w, https://sproutwareconsulting.com/assets/images/asturias-2-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://sproutwareconsulting.com/assets/images/asturias-2-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;930&quot; alt=&quot;Close-up of a delicate white flower with a yellow center, surrounded by green leaves&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; eleventy:ignore&gt;&lt;/picture&gt;&lt;/button&gt;&lt;dialog class=&quot;flow modal3&quot;&gt;&lt;button autofocus class=&quot;button&quot;&gt;Close&lt;/button&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-3-650w.avif 650w, https://sproutwareconsulting.com/assets/images/asturias-3-960w.avif 960w, https://sproutwareconsulting.com/assets/images/asturias-3-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-3-650w.webp 650w, https://sproutwareconsulting.com/assets/images/asturias-3-960w.webp 960w, https://sproutwareconsulting.com/assets/images/asturias-3-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-3-650w.jpeg 650w, https://sproutwareconsulting.com/assets/images/asturias-3-960w.jpeg 960w, https://sproutwareconsulting.com/assets/images/asturias-3-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://sproutwareconsulting.com/assets/images/asturias-3-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;930&quot; alt=&quot;A traditional Asturian village with it&#39;s raised granaries, surrounded by lush green hills and mountains&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; eleventy:ignore&gt;&lt;/picture&gt;&lt;figcaption&gt;Traditional houses in Santullano, Somiedo Natural Park, Asturias&lt;/figcaption&gt;&lt;/figure&gt;&lt;/dialog&gt;&lt;button data-index=&quot;3&quot;&gt;&lt;picture slot=&quot;image&quot;&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-3-650w.avif 650w, https://sproutwareconsulting.com/assets/images/asturias-3-960w.avif 960w, https://sproutwareconsulting.com/assets/images/asturias-3-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-3-650w.webp 650w, https://sproutwareconsulting.com/assets/images/asturias-3-960w.webp 960w, https://sproutwareconsulting.com/assets/images/asturias-3-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-3-650w.jpeg 650w, https://sproutwareconsulting.com/assets/images/asturias-3-960w.jpeg 960w, https://sproutwareconsulting.com/assets/images/asturias-3-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://sproutwareconsulting.com/assets/images/asturias-3-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;930&quot; alt=&quot;A traditional Asturian village with it&#39;s raised granaries, surrounded by lush green hills and mountains&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; eleventy:ignore&gt;&lt;/picture&gt;&lt;/button&gt;&lt;dialog class=&quot;flow modal4&quot;&gt;&lt;button autofocus class=&quot;button&quot;&gt;Close&lt;/button&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-4-650w.avif 650w, https://sproutwareconsulting.com/assets/images/asturias-4-960w.avif 960w, https://sproutwareconsulting.com/assets/images/asturias-4-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-4-650w.webp 650w, https://sproutwareconsulting.com/assets/images/asturias-4-960w.webp 960w, https://sproutwareconsulting.com/assets/images/asturias-4-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-4-650w.jpeg 650w, https://sproutwareconsulting.com/assets/images/asturias-4-960w.jpeg 960w, https://sproutwareconsulting.com/assets/images/asturias-4-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://sproutwareconsulting.com/assets/images/asturias-4-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;930&quot; alt=&quot;Close-up with unfocused background of a vibrant large blue butterfly gracefully perched on a delicate flower amidst lush green grass&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; eleventy:ignore&gt;&lt;/picture&gt;&lt;figcaption&gt;A large blue (Phengaris arion)&lt;/figcaption&gt;&lt;/figure&gt;&lt;/dialog&gt;&lt;button data-index=&quot;4&quot;&gt;&lt;picture slot=&quot;image&quot;&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-4-650w.avif 650w, https://sproutwareconsulting.com/assets/images/asturias-4-960w.avif 960w, https://sproutwareconsulting.com/assets/images/asturias-4-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-4-650w.webp 650w, https://sproutwareconsulting.com/assets/images/asturias-4-960w.webp 960w, https://sproutwareconsulting.com/assets/images/asturias-4-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-4-650w.jpeg 650w, https://sproutwareconsulting.com/assets/images/asturias-4-960w.jpeg 960w, https://sproutwareconsulting.com/assets/images/asturias-4-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://sproutwareconsulting.com/assets/images/asturias-4-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;930&quot; alt=&quot;Close-up with unfocused background of a vibrant large blue butterfly gracefully perched on a delicate flower amidst lush green grass&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; eleventy:ignore&gt;&lt;/picture&gt;&lt;/button&gt;&lt;/div&gt;&lt;/is-land&gt;&lt;h2 id=&quot;loop-through-images-without-additional-interactivity&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-a-gallery/#loop-through-images-without-additional-interactivity&quot; class=&quot;heading-anchor&quot;&gt;Loop through images without additional interactivity:&lt;/a&gt;&lt;/h2&gt;&lt;ul role=&quot;list&quot; style=&quot;padding: 0&quot; class=&quot;gallery&quot;&gt;&lt;li&gt;&lt;picture slot=&quot;image&quot;&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-1-650w.avif 650w, https://sproutwareconsulting.com/assets/images/asturias-1-960w.avif 960w, https://sproutwareconsulting.com/assets/images/asturias-1-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-1-650w.webp 650w, https://sproutwareconsulting.com/assets/images/asturias-1-960w.webp 960w, https://sproutwareconsulting.com/assets/images/asturias-1-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-1-650w.jpeg 650w, https://sproutwareconsulting.com/assets/images/asturias-1-960w.jpeg 960w, https://sproutwareconsulting.com/assets/images/asturias-1-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://sproutwareconsulting.com/assets/images/asturias-1-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;1050&quot; alt=&quot;A picturesque valley showcasing majestic mountains and lush forests, creating a serene and captivating landscape&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; eleventy:ignore&gt;&lt;/picture&gt;&lt;/li&gt;&lt;li&gt;&lt;picture slot=&quot;image&quot;&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-2-650w.avif 650w, https://sproutwareconsulting.com/assets/images/asturias-2-960w.avif 960w, https://sproutwareconsulting.com/assets/images/asturias-2-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-2-650w.webp 650w, https://sproutwareconsulting.com/assets/images/asturias-2-960w.webp 960w, https://sproutwareconsulting.com/assets/images/asturias-2-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-2-650w.jpeg 650w, https://sproutwareconsulting.com/assets/images/asturias-2-960w.jpeg 960w, https://sproutwareconsulting.com/assets/images/asturias-2-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://sproutwareconsulting.com/assets/images/asturias-2-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;930&quot; alt=&quot;Close-up of a delicate white flower with a yellow center, surrounded by green leaves&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; eleventy:ignore&gt;&lt;/picture&gt;&lt;/li&gt;&lt;li&gt;&lt;picture slot=&quot;image&quot;&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-3-650w.avif 650w, https://sproutwareconsulting.com/assets/images/asturias-3-960w.avif 960w, https://sproutwareconsulting.com/assets/images/asturias-3-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-3-650w.webp 650w, https://sproutwareconsulting.com/assets/images/asturias-3-960w.webp 960w, https://sproutwareconsulting.com/assets/images/asturias-3-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-3-650w.jpeg 650w, https://sproutwareconsulting.com/assets/images/asturias-3-960w.jpeg 960w, https://sproutwareconsulting.com/assets/images/asturias-3-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://sproutwareconsulting.com/assets/images/asturias-3-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;930&quot; alt=&quot;A traditional Asturian village with it&#39;s raised granaries, surrounded by lush green hills and mountains&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; eleventy:ignore&gt;&lt;/picture&gt;&lt;/li&gt;&lt;li&gt;&lt;picture slot=&quot;image&quot;&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-4-650w.avif 650w, https://sproutwareconsulting.com/assets/images/asturias-4-960w.avif 960w, https://sproutwareconsulting.com/assets/images/asturias-4-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-4-650w.webp 650w, https://sproutwareconsulting.com/assets/images/asturias-4-960w.webp 960w, https://sproutwareconsulting.com/assets/images/asturias-4-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/asturias-4-650w.jpeg 650w, https://sproutwareconsulting.com/assets/images/asturias-4-960w.jpeg 960w, https://sproutwareconsulting.com/assets/images/asturias-4-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://sproutwareconsulting.com/assets/images/asturias-4-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;930&quot; alt=&quot;Close-up with unfocused background of a vibrant large blue butterfly gracefully perched on a delicate flower amidst lush green grass&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; eleventy:ignore&gt;&lt;/picture&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>What is Tailwind CSS doing here?</title>
      <link href="https://sproutwareconsulting.com/blog/what-is-tailwind-css-doing-here/" />
      <updated>2023-11-30T00:00:00Z</updated>
      <id>https://sproutwareconsulting.com/blog/what-is-tailwind-css-doing-here/</id>
      <content type="html">
				&lt;p&gt;&lt;strong&gt;Update February 2024:&lt;/strong&gt;&lt;br&gt;The CSS system of this starter was invented by Andy Bell.&lt;br&gt;I wrote the following explanation quite quickly after hearing several times that people are confused about normal Tailwind CSS classes not working. In the meantime, Andy has published a &lt;a href=&quot;https://piccalil.li/blog/a-css-project-boilerplate/&quot; rel=&quot;noopener&quot;&gt;better and more detailed explanation&lt;/a&gt;.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;We are using Tailwinds “engine” to generate utility classes on demand, based on our design tokens.&lt;/p&gt;&lt;p&gt;If you have a look at the &lt;a href=&quot;https://github.com/madrilene/eleventy-excellent/blob/main/tailwind.config.js&quot; rel=&quot;noopener&quot;&gt;tailwind.config.js&lt;/a&gt;, you can see how that is done. For example, we are &lt;a href=&quot;https://github.com/madrilene/eleventy-excellent/blob/main/tailwind.config.js#L72C1-L72C22&quot; rel=&quot;noopener&quot;&gt;deactivating Tailwinds default reset&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;We are hooking into the components layer, to make Tailwind output classes based on our tokens, instead of their default design system.&lt;/p&gt;&lt;p&gt;That is, you are able to use &lt;code&gt;mt-xs-s&lt;/code&gt; instead of a class like &lt;code&gt;mt-20&lt;/code&gt; for example. Same goes for colors, depending on the namesin your &lt;code&gt;colors.json&lt;/code&gt;, you get custom classes like &lt;code&gt;text-pink&lt;/code&gt;. These use the usual Tailwind prefixes (&lt;a href=&quot;https://sproutwareconsulting.com/get-started/#design-tokens&quot;&gt;see docs to learn how to generate colors&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;You get a custom property mapped to the color name &lt;code&gt;--color-my-custom-color-name&lt;/code&gt; &lt;em&gt;and&lt;/em&gt; the classes &lt;code&gt;bg-my-custom-color-name&lt;/code&gt; as well as &lt;code&gt;text-my-custom-color-name&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Consider that we limit those utilities in the theme section:&lt;/p&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function-variable function&quot;&gt;backgroundColor&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 parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;theme&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;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;theme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;colors&#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-variable function&quot;&gt;textColor&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 parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;theme&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;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;theme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;colors&#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-variable function&quot;&gt;margin&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 parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;theme&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;=&amp;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;auto&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;auto&#39;&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 function&quot;&gt;theme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;spacing&#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 punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token function-variable function&quot;&gt;padding&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 parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;theme&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;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;theme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;spacing&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If you want to add the generation for &lt;code&gt;border-color&lt;/code&gt; classes for example, you’d have to add that right there:&lt;/p&gt;&lt;p&gt;&lt;code&gt;borderColor: ({theme}) =&amp;gt; theme(&#39;colors&#39;)&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Also. you &lt;em&gt;do&lt;/em&gt; have something like &lt;code&gt;md:text-right&lt;/code&gt; available because we define the screens (&lt;code&gt;src/_data/designTokens/viewports.json&lt;/code&gt;):&lt;/p&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;screens&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 literal-property property&quot;&gt;ltsm&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 literal-property property&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token operator&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 interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;viewportTokens&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sm&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;px&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;span class=&quot;token literal-property property&quot;&gt;sm&lt;/span&gt;&lt;span class=&quot;token operator&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 interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;viewportTokens&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sm&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;px&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 literal-property property&quot;&gt;md&lt;/span&gt;&lt;span class=&quot;token operator&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 interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;viewportTokens&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;md&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;px&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 literal-property property&quot;&gt;navigation&lt;/span&gt;&lt;span class=&quot;token operator&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 interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;viewportTokens&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;navigation&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;px&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;/code&gt;&lt;/pre&gt;&lt;p&gt;Additionally, you get custom properties based on the naming of your design token files:&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; groups &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 literal-property property&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;colors&#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;prefix&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;color&#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 punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;borderRadius&#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;prefix&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;border-radius&#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 punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;spacing&#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;prefix&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;space&#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 punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;fontSize&#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;prefix&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;size&#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 punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;lineHeight&#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;prefix&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;leading&#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 punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;fontFamily&#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;prefix&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;font&#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 punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;fontWeight&#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;prefix&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;font&#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 punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In your dev tools you can see all the generated custom properties + your custom ones from &lt;code&gt;css/global/variables.css&lt;/code&gt;.&lt;br&gt;They are generated by default.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/img/j0b5TISrO_-650.webp 650w, https://sproutwareconsulting.com/img/j0b5TISrO_-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://sproutwareconsulting.com/img/j0b5TISrO_-650.jpeg&quot; alt=&quot;Screenshot of the Firefox dev tools, CSS tab, showing the generated custom properties&quot; width=&quot;960&quot; height=&quot;609&quot; srcset=&quot;https://sproutwareconsulting.com/img/j0b5TISrO_-650.jpeg 650w, https://sproutwareconsulting.com/img/j0b5TISrO_-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;You can also create custom utility classes:&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; customUtilities &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 literal-property property&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;spacing&#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;prefix&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;flow-space&#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;property&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;--flow-space&#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 punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;spacing&#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;prefix&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;region-space&#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;property&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;--region-space&#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 punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;spacing&#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;prefix&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;gutter&#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;property&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;--gutter&#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 punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If you install the Tailwind CSS IntelliSense addon, you can actually see the classes available to you, including the color preview.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/img/Y0wxWpOPdp-650.webp 650w, https://sproutwareconsulting.com/img/Y0wxWpOPdp-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://sproutwareconsulting.com/img/Y0wxWpOPdp-650.jpeg&quot; alt=&quot;Screenshot in VS Code showing the available flow-space-classes we created, using the Tailwind CSS IntelliSense addon&quot; width=&quot;960&quot; height=&quot;540&quot; srcset=&quot;https://sproutwareconsulting.com/img/Y0wxWpOPdp-650.jpeg 650w, https://sproutwareconsulting.com/img/Y0wxWpOPdp-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;Read some thoughts that lead Andy Bell to come up with that approach: &lt;a href=&quot;https://andy-bell.co.uk/i-used-tailwind-for-the-u-in-cube-css-and-i-liked-it/&quot; rel=&quot;noopener&quot;&gt;https://andy-bell.co.uk/i-used-tailwind-for-the-u-in-cube-css-and-i-liked-it/&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Demo pages</title>
      <link href="https://sproutwareconsulting.com/blog/demo-pages/" />
      <updated>2023-10-30T00:00:00Z</updated>
      <id>https://sproutwareconsulting.com/blog/demo-pages/</id>
      <content type="html">
				&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: As of version 2.0, the demos featured here are all directly built in the starter.&lt;/p&gt;&lt;p&gt;I did not want to clutter the starter with too many features, that you might not need, but I find myself using them frequently for my own projects, so now they are “baked in”.&lt;br&gt;I will keep the old demo repos for the moment, but they are not maintained and are deprecated.&lt;/p&gt;&lt;p&gt;If you never saw version 1, nevermind.&lt;/p&gt;&lt;h2 id=&quot;demos&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/demo-pages/#demos&quot; class=&quot;heading-anchor&quot;&gt;Demos&lt;/a&gt;&lt;/h2&gt;&lt;article class=&quot;flow my-m-l&quot;&gt;&lt;h3&gt;Gallery&lt;/h3&gt;&lt;p&gt;A gallery with good old &quot;popup&quot; functionality inside a dialog element and a regular loop over images.&lt;/p&gt;&lt;div class=&quot;cluster&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-a-gallery/&quot; class=&quot;button no-indicator&quot;&gt;Demo&lt;/a&gt;&lt;/div&gt;&lt;/article&gt;&lt;article class=&quot;flow my-m-l&quot;&gt;&lt;h3&gt;Pagination&lt;/h3&gt;&lt;p&gt;The blog collection with a pagination. To work with visual current page indication, :has() pseudo-class support is required.&lt;/p&gt;&lt;div class=&quot;cluster&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/&quot; class=&quot;button no-indicator&quot;&gt;Demo&lt;/a&gt;&lt;/div&gt;&lt;/article&gt;&lt;article class=&quot;flow my-m-l&quot;&gt;&lt;h3&gt;Tags&lt;/h3&gt;&lt;p&gt;The blog has a basic tag system. Tags can be stored in front matter, as a YAML list or as an array.&lt;/p&gt;&lt;div class=&quot;cluster&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/tags/&quot; class=&quot;button no-indicator&quot;&gt;Demo&lt;/a&gt;&lt;/div&gt;&lt;/article&gt;
 			</content>
    </entry><entry>
      <title>Open Graph images</title>
      <link href="https://sproutwareconsulting.com/blog/open-graph-images/" />
      <updated>2023-01-25T00:00:00Z</updated>
      <id>https://sproutwareconsulting.com/blog/open-graph-images/</id>
      <content type="html">
				&lt;p&gt;When you share your blog posts, a thumbnail image may appear - the image we define in our meta data as an Open Graph Image (&lt;code&gt;og:image&lt;/code&gt;).&lt;/p&gt;&lt;p&gt;This starter generates these images for your blog posts automatically. They take in the title and date of the post.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/img/4_n2vOJEeM-650.webp 650w, https://sproutwareconsulting.com/img/4_n2vOJEeM-960.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://sproutwareconsulting.com/img/4_n2vOJEeM-650.jpeg&quot; alt=&quot;Open Graph image preview of a blog Post. &#39;Eleventy Excellent 2.0&#39; is written as a large title in the center, the date is shown above and the name and URL of the website is seen on the bottom. The background consists of layered pink color areas resembling a city skyline&quot; title=&quot;This is what an OG image for a blog posts looks like&quot; width=&quot;960&quot; height=&quot;504&quot; srcset=&quot;https://sproutwareconsulting.com/img/4_n2vOJEeM-650.jpeg 650w, https://sproutwareconsulting.com/img/4_n2vOJEeM-960.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;This is what an OG image for a blog posts looks like&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;The fallback and default image for all other pages is the image set as &lt;code&gt;opengraph_default&lt;/code&gt; in the &lt;code&gt;meta.js&lt;/code&gt; global data file.&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/opengraph-default-650w.avif 650w, https://sproutwareconsulting.com/assets/images/opengraph-default-960w.avif 960w, https://sproutwareconsulting.com/assets/images/opengraph-default-1260w.avif 1260w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/opengraph-default-650w.webp 650w, https://sproutwareconsulting.com/assets/images/opengraph-default-960w.webp 960w, https://sproutwareconsulting.com/assets/images/opengraph-default-1260w.webp 1260w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://sproutwareconsulting.com/assets/images/opengraph-default-650w.jpeg 650w, https://sproutwareconsulting.com/assets/images/opengraph-default-960w.jpeg 960w, https://sproutwareconsulting.com/assets/images/opengraph-default-1260w.jpeg 1260w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://sproutwareconsulting.com/assets/images/opengraph-default-1260w.jpeg&quot; width=&quot;1260&quot; height=&quot;668&quot; alt=&quot;Visible content: An Eleventy starter with CUBE CSS, Cube CSS, Every Layout, Design Tokens and Tailwind for uitility classes. A workflow for building modern and resilient websites, introduced by Andy Bell&#39;s project buildexcellentwebsit.es&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; eleventy:ignore&gt;&lt;/picture&gt;&lt;figcaption&gt;This is what the general OG image for non-blog posts looks like&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;A more detailed explanation can be found in the &lt;a href=&quot;https://sproutwareconsulting.com/get-started/#open-graph-images&quot;&gt;docs&lt;/a&gt;.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Post with all the markdown</title>
      <link href="https://sproutwareconsulting.com/blog/post-with-all-the-markdown/" />
      <updated>2022-11-02T00:00:00Z</updated>
      <id>https://sproutwareconsulting.com/blog/post-with-all-the-markdown/</id>
      <content type="html">
				&lt;p&gt;A lot of markdown packages are installed to help you write your posts.&lt;br&gt;You can configure them in &lt;code&gt;config/plugins/markdown.js&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;As of my personal preference, there are some presets. For example the conversion of web pages to links (&lt;a href=&quot;http://www.lenesaile.com&quot; rel=&quot;noopener&quot;&gt;www.lenesaile.com&lt;/a&gt;) and the addition of &lt;code&gt;rel=&quot;noopener&quot;&lt;/code&gt; for external links (all links with the pattern &lt;code&gt;/^https?:/&lt;/code&gt;).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;This is a tiny pitfall!&lt;/strong&gt;&lt;br&gt;Take care to not prefix your internal links with your domain, or else they will be treated as external. To link internally, use this pattern:&lt;/p&gt;&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;An internal link to the &lt;span class=&quot;token url&quot;&gt;[&lt;span class=&quot;token content&quot;&gt;about page&lt;/span&gt;](&lt;span class=&quot;token url&quot;&gt;/about/&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;h2-heading&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#h2-heading&quot; class=&quot;heading-anchor&quot;&gt;h2 Heading&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;h3-heading&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#h3-heading&quot; class=&quot;heading-anchor&quot;&gt;h3 Heading&lt;/a&gt;&lt;/h3&gt;&lt;h4 id=&quot;h4-heading&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#h4-heading&quot; class=&quot;heading-anchor&quot;&gt;h4 Heading&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Muffin bonbon jujubes cheesecake chupa chups shortbread ice cream cotton candy cake. Jelly-o biscuit dessert danish dessert pastry tootsie roll lemon drops gingerbread. Cheesecake donut marzipan sweet roll icing muffin halvah. Dragée donut cake biscuit pie carrot cake sesame snaps jelly-o gummi bears.&lt;/p&gt;&lt;p&gt;Soufflé topping shortbread lemon.&lt;/p&gt;&lt;h2 id=&quot;hr&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#hr&quot; class=&quot;heading-anchor&quot;&gt;hr&lt;/a&gt;&lt;/h2&gt;&lt;hr&gt;&lt;h2 id=&quot;typographic-replacements&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#typographic-replacements&quot; class=&quot;heading-anchor&quot;&gt;Typographic replacements&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;The replacement converts this input:&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;(c) (C) (r) (R) (tm) (TM) +-
and so on.. and so on... and so on..... AND SO ON???????.....
WTF!!!!!! How many exclamation marks are you going to use????????????
,, -- ---
&quot;double quotes&quot; and &#39;single quotes&#39;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;To this:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;© © ® ® ™ ™ ±&lt;br&gt;and so on… and so on… and so on… AND SO ON???..&lt;br&gt;WTF!!! How many exclamation marks are you going to use???&lt;br&gt;, – —&lt;br&gt;“double quotes” and ‘single quotes’&lt;/p&gt;&lt;h2 id=&quot;emphasis&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#emphasis&quot; class=&quot;heading-anchor&quot;&gt;Emphasis&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;This is bold text&lt;/strong&gt;&lt;br&gt;&lt;em&gt;This is italic text&lt;/em&gt;&lt;br&gt;&lt;s&gt;Strikethrough&lt;/s&gt;&lt;/p&gt;&lt;h2 id=&quot;blockquote&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#blockquote&quot; class=&quot;heading-anchor&quot;&gt;Blockquote&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;Cheesecake donut marzipan sweet roll icing muffin halvah. Dragée donut cake biscuit pie carrot cake sesame snaps jelly-o gummi bears. Cotton candy cookie croissant fruitcake.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;lists&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#lists&quot; class=&quot;heading-anchor&quot;&gt;Lists&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;unordered-lists&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#unordered-lists&quot; class=&quot;heading-anchor&quot;&gt;Unordered lists&lt;/a&gt;&lt;/h3&gt;&lt;ul class=&quot;list&quot;&gt;&lt;li&gt;Create a list by starting a line with &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt;, or &lt;code&gt;*&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Another item&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;ordered-lists&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#ordered-lists&quot; class=&quot;heading-anchor&quot;&gt;Ordered lists&lt;/a&gt;&lt;/h3&gt;&lt;ol class=&quot;list&quot;&gt;&lt;li&gt;Lorem ipsum dolor sit amet&lt;/li&gt;&lt;li&gt;Consectetur adipiscing elit&lt;/li&gt;&lt;li&gt;Integer molestie lorem at massa&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;code&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#code&quot; class=&quot;heading-anchor&quot;&gt;Code&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Syntax highlighting&lt;/p&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.back-top-top&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background&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 property&quot;&gt;margin-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 110vh&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; sticky&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;bottom&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;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* by David Darnes */&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;tables&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#tables&quot; class=&quot;heading-anchor&quot;&gt;Tables&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Technology&lt;/th&gt;&lt;th&gt;Fun fact&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;HTML&lt;/td&gt;&lt;td&gt;HTML (Hypertext Markup Language) was created by Sir Tim Berners-Lee in 1991 as a way to structure and link documents on the World Wide Web.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CSS&lt;/td&gt;&lt;td&gt;It’s called “cascading” because styles can cascade down from parent elements to their children, allowing for inheritance and overriding.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;JavaScript&lt;/td&gt;&lt;td&gt;TypeError: null is not an object&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;links&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#links&quot; class=&quot;heading-anchor&quot;&gt;Links&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://moderncss.dev/&quot; rel=&quot;noopener&quot;&gt;Read all those articles&lt;/a&gt;&lt;br&gt;Autoconverted link &lt;a href=&quot;https://every-layout.dev/&quot; rel=&quot;noopener&quot;&gt;https://every-layout.dev/&lt;/a&gt; (enabled via linkify)&lt;/p&gt;&lt;h2 id=&quot;emojis&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#emojis&quot; class=&quot;heading-anchor&quot;&gt;Emojis&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Literal:&lt;/strong&gt;&lt;br&gt;🤩 💯 💚 👻 👾&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Classic markup:&lt;/strong&gt;&lt;br&gt;😢 💩 🔥 😆 🎄&lt;br&gt;(&lt;a href=&quot;https://gist.github.com/rxaviers/7360908&quot; rel=&quot;noopener&quot;&gt;A reference for emoji markup&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Shortcuts (emoticons)&lt;/strong&gt;:&lt;br&gt;😃 😦 😎 😉 😛&lt;/p&gt;&lt;h2 id=&quot;mark&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#mark&quot; class=&quot;heading-anchor&quot;&gt;mark&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;mark&gt;Marked text&lt;/mark&gt;&lt;/p&gt;&lt;h2 id=&quot;footnotes&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#footnotes&quot; class=&quot;heading-anchor&quot;&gt;Footnotes&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Footnote 1 link&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;.&lt;br&gt;Footnote 2 link&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#fn2&quot; id=&quot;fnref2&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&lt;p&gt;*[HTML]: Hyper Text Markup Language&lt;/p&gt;&lt;h2 id=&quot;images&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#images&quot; class=&quot;heading-anchor&quot;&gt;Images&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Consider that &lt;code&gt;src&lt;/code&gt; is already prepended in the settings.&lt;/p&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://sproutwareconsulting.com/img/EHwkdjzoWm-650.webp 650w, https://sproutwareconsulting.com/img/EHwkdjzoWm-960.webp 960w, https://sproutwareconsulting.com/img/EHwkdjzoWm-1400.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://sproutwareconsulting.com/img/EHwkdjzoWm-650.jpeg&quot; alt=&quot;Close-up with unfocused background of a vibrant large blue butterfly gracefully perched on a delicate flower amidst lush green grass&quot; width=&quot;1400&quot; height=&quot;930&quot; srcset=&quot;https://sproutwareconsulting.com/img/EHwkdjzoWm-650.jpeg 650w, https://sproutwareconsulting.com/img/EHwkdjzoWm-960.jpeg 960w, https://sproutwareconsulting.com/img/EHwkdjzoWm-1400.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Footnote &lt;strong&gt;can have markup&lt;/strong&gt;&lt;br&gt;and multiple paragraphs. &lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li id=&quot;fn2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Footnote text. &lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-all-the-markdown/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>Post with a video</title>
      <link href="https://sproutwareconsulting.com/blog/post-with-a-video/" />
      <updated>2022-10-31T00:00:00Z</updated>
      <id>https://sproutwareconsulting.com/blog/post-with-a-video/</id>
      <content type="html">
				&lt;p&gt;This starter uses a &lt;a href=&quot;https://github.com/zachleat/zachleat.com/blob/main/_components/youtube-lite-player.webc&quot; rel=&quot;noopener&quot;&gt;webC version&lt;/a&gt; of Paul Irish’s &lt;a href=&quot;https://github.com/paulirish/lite-youtube-embed&quot; rel=&quot;noopener&quot;&gt;lite-youtube-embed&lt;/a&gt;.&lt;/p&gt;&lt;div&gt;&lt;custom-youtube class=&quot;flow&quot;&gt;&lt;!-- component composition by: https://github.com/zachleat/zachleat.com --&gt;
&lt;style&gt;
  /* Hide without JS */
  is-land:not(:defined).video-wrapper {
    display: none;
  }
&lt;/style&gt;

  &lt;is-land on:visible class=&quot;video-wrapper&quot;&gt;
    &lt;lite-youtube videoid=&quot;Ah6je_bBSH8&quot; js-api playlabel=&quot;Play: Alberto Ballesteros - Artista Sin Obra&quot; style=&quot;background-image: var(--yt-poster-img-url); --yt-poster-img-url-lazy: url(&#39;https://v1.opengraph.11ty.dev/https%3A%2F%2Fyoutube.com%2Fwatch%3Fv%3DAh6je_bBSH8/auto/jpeg/&#39;)&quot;&gt;&lt;/lite-youtube&gt;

    &lt;template data-island=&quot;once&quot;&gt;
      &lt;style&gt;
        lite-youtube {
          max-inline-size: 100% !important;
          background-size: cover;
        }

        is-land lite-youtube {
          background-color: #eee;
          border-radius: 0.2em;
          background-size: cover;
        }
        is-land[ready] lite-youtube {
          /* gotta set in `style` to override the 480w image from lite-youtube */
          --yt-poster-img-url: var(--yt-poster-img-url-lazy);
        }

        .video-wrapper {
          aspect-ratio: 16 / 9;
          width: 100%;
        }

        is-land.video-wrapper {
          display: block;
        }
      &lt;/style&gt;
      &lt;link rel=&quot;stylesheet&quot; href=&quot;/assets/components/lite-yt-embed.css&quot; /&gt;
      &lt;script type=&quot;module&quot; src=&quot;/assets/components/lite-yt-embed.js&quot;&gt;&lt;/script&gt;
    &lt;/template&gt;
  &lt;/is-land&gt;

&lt;custom-youtube-link label=&quot;Alberto Ballesteros - Artista Sin Obra&quot; href=&quot;https://youtube.com/watch?v=Ah6je_bBSH8&quot;&gt;&lt;style&gt;
  custom-youtube-link {
    display: flex;
    align-items: flex-start;
    gap: var(--space-xs);
    font-size: var(--size-step-min-1);
  }
  custom-youtube-link svg {
    font-size: var(--size-step-0);
  }
&lt;/style&gt;

&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; ariahidden=&quot;true&quot;&gt;&lt;path d=&quot;M2.5 17a24.12 24.12 0 0 1 0-10 2 2 0 0 1 1.4-1.4 49.56 49.56 0 0 1 16.2 0A2 2 0 0 1 21.5 7a24.12 24.12 0 0 1 0 10 2 2 0 0 1-1.4 1.4 49.55 49.55 0 0 1-16.2 0A2 2 0 0 1 2.5 17&quot;&gt;&lt;/path&gt;&lt;path d=&quot;m10 15 5-3-5-3z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;

&lt;a href=&quot;https://youtube.com/watch?v=Ah6je_bBSH8&quot;&gt;Alberto Ballesteros - Artista Sin Obra&lt;/a&gt;

&lt;!-- Inspired by https://github.com/zachleat/zachleat.com  --&gt;
&lt;/custom-youtube-link&gt;
&lt;/custom-youtube&gt;&lt;/div&gt;&lt;p&gt;A modified version to display &lt;a href=&quot;https://joinpeertube.org/&quot; rel=&quot;noopener&quot;&gt;PeerTube&lt;/a&gt; videos is also included (Thank you &lt;a href=&quot;https://github.com/camperotactico&quot; rel=&quot;noopener&quot;&gt;camperotactico&lt;/a&gt;). It works similarly, but takes two extra arguments:&lt;/p&gt;&lt;ul class=&quot;list&quot;&gt;&lt;li&gt;&lt;code&gt;@instance&lt;/code&gt;: The instance hosting the video.&lt;/li&gt;&lt;li&gt;&lt;code&gt;@embed-slug&lt;/code&gt; The slug used for video embedding.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;custom-peertube class=&quot;flow&quot;&gt;

&lt;style&gt;
  /* Hide without JS */
  is-land:not(:defined).video-wrapper {
    display: none;
  }

  is-land.video-wrapper {
    display: block;
  }

  custom-peertube iframe {
    position: absolute;
    inset: 0px;
    width: 100%;
    height: 100%;
  }

  custom-peertube .video-wrapper {
    overflow: hidden;
    position: relative;
    aspect-ratio: 16 / 9;
    width: 100%;
    border-radius: 0.2em;
  }
&lt;/style&gt;


  &lt;is-land on:visible class=&quot;video-wrapper relative&quot;&gt;
    &lt;iframe title=&quot;Back at the Herperduin 💦 - 28/09/2024&quot; src=&quot;https://fair.tube/videos/embed/3bd0b70e-7890-4216-a123-2052363645ff?title=0&amp;amp;warningTitle=0&quot; frameborder=&quot;0&quot; allowfullscreen sandbox=&quot;allow-same-origin allow-scripts allow-popups allow-forms&quot;&gt;
    &lt;/iframe&gt;
  &lt;/is-land&gt;


&lt;custom-peertube-link label=&quot;Back at the Herperduin 💦 - 28/09/2024&quot; href=&quot;https://fair.tube/w/8opkviMc2iDUYMwJzG1FQ4&quot;&gt;&lt;style&gt;
  custom-peertube-link {
    display: flex;
    align-items: flex-start;
    gap: var(--space-xs);
    font-size: var(--size-step-min-1);
  }
  custom-peertube-link svg {
    font-size: var(--size-step-0);
  }
&lt;/style&gt;

&lt;svg role=&quot;img&quot; viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; fill=&quot;currentColor&quot; width=&quot;1em&quot; height=&quot;1em&quot; ariahidden=&quot;true&quot;&gt;&lt;title&gt;PeerTube&lt;/title&gt;&lt;path d=&quot;M12 6.545v10.91L20.727 12M3.273 12v12L12 17.455M3.273 0v12L12 6.545&quot;&gt;&lt;/path&gt;&lt;/svg&gt;

&lt;a href=&quot;https://fair.tube/w/8opkviMc2iDUYMwJzG1FQ4&quot;&gt;Back at the Herperduin 💦 - 28/09/2024&lt;/a&gt;

&lt;!-- Inspired by https://github.com/zachleat/zachleat.com  --&gt;
&lt;/custom-peertube-link&gt;
&lt;/custom-peertube&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;http://localhost:8082/get-started/#video&quot; rel=&quot;noopener&quot;&gt;Learn more in the video docs.&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Post with some code</title>
      <link href="https://sproutwareconsulting.com/blog/post-with-some-code/" />
      <updated>2022-09-01T00:00:00Z</updated>
      <id>https://sproutwareconsulting.com/blog/post-with-some-code/</id>
      <content type="html">
				&lt;p&gt;This theme uses 11ty’s &lt;a href=&quot;https://www.11ty.dev/docs/plugins/syntaxhighlight/&quot; rel=&quot;noopener&quot;&gt;Syntax Highlighting Plugin&lt;/a&gt;, a pack of Eleventy plugins for PrismJS syntax highlighting. No browser/client JavaScript, highlight transformations are all done at build-time.&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; cards &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 operator&quot;&gt;...&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.card&#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 punctuation&quot;&gt;;&lt;/span&gt;
cards&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;card&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  card&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cursor &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;pointer&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; down&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    up&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    link &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; card&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;a&#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;
  card&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onmousedown&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 operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;down &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 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 punctuation&quot;&gt;;&lt;/span&gt;
  card&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onmouseup&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 operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    up &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 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 keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;up &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; down &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&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;
      link&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;click&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;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;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// © Heydon Pickering&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.smol-container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&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;100% - 3rem&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;--container-max&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 60ch&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 property&quot;&gt;margin-inline&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&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 comment&quot;&gt;/* © Stephanie Eckles, https://smolcss.dev/ */&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Edit styles in &lt;code&gt;css/blocks/code.css&lt;/code&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Post with 301 redirects</title>
      <link href="https://sproutwareconsulting.com/blog/post-with-301-redirects/" />
      <updated>2022-08-28T00:00:00Z</updated>
      <id>https://sproutwareconsulting.com/blog/post-with-301-redirects/</id>
      <content type="html">
				&lt;p&gt;URLs usually change over time, as you use another CMS or optimize your file structure.&lt;/p&gt;&lt;p&gt;A 301 is used when a page has permanently changed location.&lt;br&gt;Informing about this change is indispensable if you want to keep your incoming links working, be it from organic Google search or other pages that have linked to your content.&lt;/p&gt;&lt;p&gt;Aleksandr Hovhannisyan came up with an &lt;a href=&quot;https://www.aleksandrhovhannisyan.com/blog/eleventy-netlify-redirects/&quot; rel=&quot;noopener&quot;&gt;elegant solution for Eleventy and Netlify&lt;/a&gt;. To directly cover several possible previous routes it is created as an array. You can find the loop in &lt;code&gt;_redirects.njk&lt;/code&gt;.&lt;/p&gt;&lt;h2 id=&quot;usage&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-301-redirects/#usage&quot; class=&quot;heading-anchor&quot;&gt;Usage&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;Frontmatter&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 key atrule&quot;&gt;redirectFrom&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;/old-route/&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;/optionally-another-old-route/&#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;/code&gt;&lt;/pre&gt;
 			</content>
    </entry><entry>
      <title>Post with fetched content</title>
      <link href="https://sproutwareconsulting.com/blog/post-with-fetched-content/" />
      <updated>2022-08-28T00:00:00Z</updated>
      <id>https://sproutwareconsulting.com/blog/post-with-fetched-content/</id>
      <content type="html">
				&lt;p&gt;&lt;a href=&quot;https://www.11ty.dev/docs/plugins/fetch/&quot; rel=&quot;noopener&quot;&gt;Eleventy Fetch&lt;/a&gt; fetches and caches resources – at configurable intervals.&lt;/p&gt;&lt;p&gt;This is an example of fetching external data.&lt;br&gt;In this case, my public repositories (with more than zero stargazer) and a cache duration of 1 day.&lt;/p&gt;&lt;p&gt;Endpoint editable in &lt;code&gt;_data/github.js.&lt;/code&gt;&lt;/p&gt;&lt;h2 id=&quot;eleventy-excellent&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-fetched-content/#eleventy-excellent&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/madrilene/eleventy-excellent&quot; rel=&quot;noopener&quot;&gt;eleventy-excellent&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;450 GitHub stars&lt;/strong&gt;&lt;br&gt;Eleventy starter based on the workflow suggested by Andy Bell&#39;s &lt;a href=&quot;http://buildexcellentwebsit.es&quot; rel=&quot;noopener&quot;&gt;buildexcellentwebsit.es&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;eleventy-i18n&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-fetched-content/#eleventy-i18n&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/madrilene/eleventy-i18n&quot; rel=&quot;noopener&quot;&gt;eleventy-i18n&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;30 GitHub stars&lt;/strong&gt;&lt;br&gt;Minimal starter for localized content, using Eleventy&#39;s own Internationalization (I18n) plugin&lt;/p&gt;&lt;h2 id=&quot;lenesailecom&quot;&gt;&lt;a href=&quot;https://sproutwareconsulting.com/blog/post-with-fetched-content/#lenesailecom&quot; class=&quot;heading-anchor&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/madrilene/lenesaile.com&quot; rel=&quot;noopener&quot;&gt;lenesaile.com&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;37 GitHub stars&lt;/strong&gt;&lt;br&gt;My personal website built with Eleventy. It supports three languages.&lt;/p&gt;
 			</content>
    </entry></feed>
