<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Starred Articles</title>
    <description>Starred Articles</description>
    <atom:link href="https://feedbin.com/starred/402e7284ee3f393507cd5cdfbb1638c1.xml" rel="self" type="application/rss+xml"/>
    <link>https://feedbin.com/</link>
    <item>
      <title><![CDATA[Web of State of the Browser Day Out]]></title>
      <description><![CDATA[

<p>A lovely post from Remy about State Of The Browser and Web Day Out.</p>

<p><a href="https://adactio.com/links/22474">adactio.com/links/22474</a></p>

            ]]></description>
      <pubDate>Wed, 18 Mar 2026 16:47:10 +0000</pubDate>
      <link>https://remysharp.com/2026/03/18/web-of-state-of-the-browser-day-out</link>
      <dc:creator>Adactio: Links</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/5159435893</guid>
    </item>
    <item>
      <title><![CDATA[Back from ffconf – And Why We Need Events like This]]></title>
      <description><![CDATA[
        
          
                              <p><a href="https://ffconf.org/history/">ffconf</a> is an event in Brighton founded and organised by <a href="https://remysharp.com/">Remy Sharp</a> and his wife <a href="https://twitter.com/julieanne">Julie Sharp</a>. I know both for a long time and we share a lot of common things when it comes to running events. We run events, because we <strong>love</strong> running those and bringing people together for which we curate a set of speakers for a certain amount of time. In their case for one day at beginning of November. Julie and Remy, as well as I, come out of a very tough time for event organisers that don’t take their budgets out of a companies yearly marketing budget. We rely on people buying tickets and partnerships with companies who like what we do, who see a sense in sponsoring as they might have a benefit and who keep our events alive with their money.</p>
<p>What makes events like ffconf so important for me is not only the personal curation and with this often much more interesting talks, but also the personal connection people have with those events and the kind of people you meet and are able to exchange with. </p>
<p>Last week Friday, at ffconf, I had so many lovely conversations before, during and after the event that are fantastic input, motivation and thoughts that are different to mine and give me other perspectives. For me personally that is so much value and I hope that events like ffconf stay for a long, long time. What you can do to make sure that this is the case? Well, if you attend events like ffconf, <a href="https://patternsday.com/">Patterns Day</a>, or mine, <a href="https://beyondtellerrand.com">beyond tellerrand</a> you can:</p>
<ul>
<li><strong>Get your tickets early</strong> – organisers need to plan and work with the incoming money</li>
<li><strong>Check their sponsorship prospectus</strong> – often times sponsorship starts at a lower cost than you think and even the smallest packages help big times</li>
<li><strong>Tell other people about it</strong> – there is no big marketing budget, so you, spreading the word, means the world</li>
</ul>
<p>Especially the last part is an investment in the future of these events. </p>
<p>Thanks a lot to Julie, Remy and their team for this years joyful event and in my case also to <a href="https://hachyderm.io/@andydavies">Andy Davies</a>, who made it possible that I could be part.</p>          <a href="mailto:hello@marcthiele.com?subject=My reply to: Back from ffconf – And Why We Need Events like This">Reply via Email</a>
        
      ]]></description>
      <pubDate>Mon, 13 Nov 2023 20:54:00 +0000</pubDate>
      <link>https://marcthiele.de/notes/back-from-ffconf-we-need-these-events</link>
      <dc:creator>Marc Thiele&#39;s Journal</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4954798114</guid>
    </item>
    <item>
      <title><![CDATA[Vibe coding and Robocop]]></title>
      <description><![CDATA[

<blockquote>
  <p>The short version of what I want to say is: vibe coding seems to live very squarely in the land of prototypes and toys. Promoting software that’s been built entirely using this method would be akin to sending a hacked weekend prototype to production and expecting it to be stable.</p>
</blockquote>

<p>Remy is taking a very sensible approach here:</p>

<blockquote>
  <p>I’ve used it myself to solve really bespoke problems where the user count is one.</p>
  
  <p>Would I put this out to production: absolutely not.</p>
</blockquote>

<p><a href="https://adactio.com/links/22028">adactio.com/links/22028</a></p>

            ]]></description>
      <pubDate>Sat, 19 Jul 2025 08:58:39 +0000</pubDate>
      <link>https://remysharp.com/2025/07/18/vibe-coding-and-robocop</link>
      <dc:creator>Adactio: Links</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4885676805</guid>
    </item>
    <item>
      <title><![CDATA[White Next Contest – Entries List and Poll]]></title>
      <description><![CDATA[
<h3 class="wp-block-heading has-luminous-vivid-orange-color has-text-color has-link-color has-large-font-size wp-elements-d4689407db040e349c732d7b2ab600e7">UPDATE – 11/05/2025 – Poll will be reset and extended. Someone today attempted to abuse the polling system and entered a lot of votes under a continuous loop. This user has been now banned and the poll will be reset (auto-cleanup of votes happens every day) and extended for 11 days. Next attempt at abuse will ban the favoured program from competition</h3>



<p>Entry: Next Point<br>Developer: Victor Morilla<br>Type: Game / Sports<br>Platform: Spectrum Next</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="640" height="512" src="https://www.specnext.com/wp-content/uploads/2025/05/unnamed.png" alt="" class="wp-image-4629" srcset="https://www.specnext.com/wp-content/uploads/2025/05/unnamed.png 640w, https://www.specnext.com/wp-content/uploads/2025/05/unnamed-300x240.png 300w, https://www.specnext.com/wp-content/uploads/2025/05/unnamed-600x480.png 600w" sizes="(max-width: 640px) 100vw, 640px"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="640" height="512" src="https://www.specnext.com/wp-content/uploads/2025/05/unnamed1.png" alt="" class="wp-image-4630" srcset="https://www.specnext.com/wp-content/uploads/2025/05/unnamed1.png 640w, https://www.specnext.com/wp-content/uploads/2025/05/unnamed1-300x240.png 300w, https://www.specnext.com/wp-content/uploads/2025/05/unnamed1-600x480.png 600w" sizes="(max-width: 640px) 100vw, 640px"></figure>



<p class="has-vivid-red-color has-text-color has-link-color wp-elements-d740189b855dac9a804b415ba726ff60">Download <a href="https://www.specnext.com/wp-content/uploads/2025/05/next-point.zip" data-type="link" data-id="https://www.specnext.com/wp-content/uploads/2025/05/next-point.zip"><strong>here</strong></a></p>



<hr class="wp-block-separator has-alpha-channel-opacity">



<p>Entry: SCN Driver<br>Developer: Simon N Goodwin<br>Type: Device Driver / SuperBASIC extension<br>Platform: QL Next</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="506" height="448" src="https://www.specnext.com/wp-content/uploads/2025/05/ROD256.jpg" alt="" class="wp-image-4633" srcset="https://www.specnext.com/wp-content/uploads/2025/05/ROD256.jpg 506w, https://www.specnext.com/wp-content/uploads/2025/05/ROD256-300x266.jpg 300w" sizes="(max-width: 506px) 100vw, 506px"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="525" height="375" src="https://www.specnext.com/wp-content/uploads/2025/05/MODE256.jpg" alt="" class="wp-image-4634" srcset="https://www.specnext.com/wp-content/uploads/2025/05/MODE256.jpg 525w, https://www.specnext.com/wp-content/uploads/2025/05/MODE256-300x214.jpg 300w" sizes="(max-width: 525px) 100vw, 525px"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="722" height="212" src="https://www.specnext.com/wp-content/uploads/2025/05/Garry.jpg" alt="" class="wp-image-4635" srcset="https://www.specnext.com/wp-content/uploads/2025/05/Garry.jpg 722w, https://www.specnext.com/wp-content/uploads/2025/05/Garry-300x88.jpg 300w, https://www.specnext.com/wp-content/uploads/2025/05/Garry-600x176.jpg 600w" sizes="(max-width: 722px) 100vw, 722px"></figure>



<p class="has-vivid-red-color has-text-color has-link-color wp-elements-55a3188c683b5547fbb3f7bee5b680c6">Read the documentation / details and download <a href="http://simon.mooli.org.uk/QL/SCN" data-type="link" data-id="https://www.specnext.com/wp-content/uploads/2025/05/next-point.zip"><strong>here</strong></a></p>



<hr class="wp-block-separator has-alpha-channel-opacity">



<p>Entry: ZNC Compiler Suite<br>Developer: Chris Taylor<br>Type: Native Programming Language suite (Compiler/Editor/Optimiser/Assembler)<br>Platform:  Spectrum Next</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="347" height="275" src="https://www.specnext.com/wp-content/uploads/2025/05/GgzWW0.png" alt="" class="wp-image-4637" srcset="https://www.specnext.com/wp-content/uploads/2025/05/GgzWW0.png 347w, https://www.specnext.com/wp-content/uploads/2025/05/GgzWW0-300x238.png 300w" sizes="(max-width: 347px) 100vw, 347px"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="794" height="635" src="https://www.specnext.com/wp-content/uploads/2025/05/SZg0sQ.png" alt="" class="wp-image-4638" srcset="https://www.specnext.com/wp-content/uploads/2025/05/SZg0sQ.png 794w, https://www.specnext.com/wp-content/uploads/2025/05/SZg0sQ-300x240.png 300w, https://www.specnext.com/wp-content/uploads/2025/05/SZg0sQ-768x614.png 768w, https://www.specnext.com/wp-content/uploads/2025/05/SZg0sQ-600x480.png 600w" sizes="(max-width: 794px) 100vw, 794px"></figure>



<p class="has-vivid-red-color has-text-color has-link-color wp-elements-05cb5f2dd69e87191c46ae46f8f5b196">Read the documentation / details and <strong><a href="https://taylorza.itch.io/znc-compiler">download here</a></strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity">



<p>Entry: Jetman In Space<br>Developer: Maciej Miklas<br>Type: Arcade Game<br>Platform: Spectrum Next</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://www.specnext.com/wp-content/uploads/2025/05/cover.jpg" alt="" class="wp-image-4640" srcset="https://www.specnext.com/wp-content/uploads/2025/05/cover.jpg 1024w, https://www.specnext.com/wp-content/uploads/2025/05/cover-300x300.jpg 300w, https://www.specnext.com/wp-content/uploads/2025/05/cover-150x150.jpg 150w, https://www.specnext.com/wp-content/uploads/2025/05/cover-768x768.jpg 768w, https://www.specnext.com/wp-content/uploads/2025/05/cover-600x600.jpg 600w, https://www.specnext.com/wp-content/uploads/2025/05/cover-100x100.jpg 100w" sizes="(max-width: 1024px) 100vw, 1024px"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="836" height="668" src="https://www.specnext.com/wp-content/uploads/2025/05/scr2.jpg" alt="" class="wp-image-4680" srcset="https://www.specnext.com/wp-content/uploads/2025/05/scr2.jpg 836w, https://www.specnext.com/wp-content/uploads/2025/05/scr2-300x240.jpg 300w, https://www.specnext.com/wp-content/uploads/2025/05/scr2-768x614.jpg 768w, https://www.specnext.com/wp-content/uploads/2025/05/scr2-600x479.jpg 600w" sizes="(max-width: 836px) 100vw, 836px"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="852" height="690" src="https://www.specnext.com/wp-content/uploads/2025/05/scr3.jpg" alt="" class="wp-image-4681" srcset="https://www.specnext.com/wp-content/uploads/2025/05/scr3.jpg 852w, https://www.specnext.com/wp-content/uploads/2025/05/scr3-300x243.jpg 300w, https://www.specnext.com/wp-content/uploads/2025/05/scr3-768x622.jpg 768w, https://www.specnext.com/wp-content/uploads/2025/05/scr3-600x486.jpg 600w" sizes="(max-width: 852px) 100vw, 852px"></figure>



<p class="has-vivid-red-color has-text-color has-link-color wp-elements-98e9792a4e9e659a3af4f7aa1d47b302">Read the documentation / details and <strong><a href="https://github.com/maciejmiklas/jetman-in-space/releases">download here</a></strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity">



<p>Entry: SSX (Sam Coupe Screen Viewer)<br>Developer: Robert Morrison<br>Type: DOT Command / Utility<br>Platform: Spectrum Next</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="640" height="958" src="https://www.specnext.com/wp-content/uploads/2025/05/68747470733a2f2f726f626572746d6f727269736f6e2e6d652f737065637472756d2f6e6578742f73616d73637265656e2f656e63656c616475732e6a706567.jpg" alt="" class="wp-image-4643" srcset="https://www.specnext.com/wp-content/uploads/2025/05/68747470733a2f2f726f626572746d6f727269736f6e2e6d652f737065637472756d2f6e6578742f73616d73637265656e2f656e63656c616475732e6a706567.jpg 640w, https://www.specnext.com/wp-content/uploads/2025/05/68747470733a2f2f726f626572746d6f727269736f6e2e6d652f737065637472756d2f6e6578742f73616d73637265656e2f656e63656c616475732e6a706567-200x300.jpg 200w, https://www.specnext.com/wp-content/uploads/2025/05/68747470733a2f2f726f626572746d6f727269736f6e2e6d652f737065637472756d2f6e6578742f73616d73637265656e2f656e63656c616475732e6a706567-600x898.jpg 600w" sizes="(max-width: 640px) 100vw, 640px"></figure>



<p class="has-vivid-red-color has-text-color has-link-color wp-elements-c025420f442f16d1ddd56e11c3964579"><a href="https://github.com/flatduckrecords/ssx">Read the documentation</a> / details and <strong><a href="https://www.specnext.com/wp-content/uploads/2025/05/ssx.zip">download here</a></strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity">



<p>Entry: Eternal Battle<br>Developer: SaNchez / Alexandr Udotov<br>Type: Arcade Game<br>Platform: Spectrum Next</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="638" height="513" src="https://www.specnext.com/wp-content/uploads/2025/05/Screenshot-2025-05-03-141326.png" alt="" class="wp-image-4646" srcset="https://www.specnext.com/wp-content/uploads/2025/05/Screenshot-2025-05-03-141326.png 638w, https://www.specnext.com/wp-content/uploads/2025/05/Screenshot-2025-05-03-141326-300x241.png 300w, https://www.specnext.com/wp-content/uploads/2025/05/Screenshot-2025-05-03-141326-600x482.png 600w" sizes="(max-width: 638px) 100vw, 638px"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="642" height="513" src="https://www.specnext.com/wp-content/uploads/2025/05/Screenshot-2025-05-03-141516.png" alt="" class="wp-image-4647" srcset="https://www.specnext.com/wp-content/uploads/2025/05/Screenshot-2025-05-03-141516.png 642w, https://www.specnext.com/wp-content/uploads/2025/05/Screenshot-2025-05-03-141516-300x240.png 300w, https://www.specnext.com/wp-content/uploads/2025/05/Screenshot-2025-05-03-141516-600x479.png 600w" sizes="(max-width: 642px) 100vw, 642px"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="642" height="511" src="https://www.specnext.com/wp-content/uploads/2025/05/Screenshot-2025-05-03-141800.png" alt="" class="wp-image-4648" srcset="https://www.specnext.com/wp-content/uploads/2025/05/Screenshot-2025-05-03-141800.png 642w, https://www.specnext.com/wp-content/uploads/2025/05/Screenshot-2025-05-03-141800-300x239.png 300w, https://www.specnext.com/wp-content/uploads/2025/05/Screenshot-2025-05-03-141800-600x478.png 600w" sizes="(max-width: 642px) 100vw, 642px"></figure>



<p class="has-vivid-red-color has-text-color has-link-color wp-elements-77908746cd0db0fd89c93e4ddca3039a">Read the documentation / details and <strong><a href="https://www.specnext.com/wp-content/uploads/2025/05/only-game.zip">download here</a></strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity">



<p>Entry: Next Fractal Explorer<br>Developer: Matthew Thompson<br>Type: Mandelbrot Set Plotter<br>Platform: Spectrum Next</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1060" height="609" src="https://www.specnext.com/wp-content/uploads/2025/05/Screenshot_20240615_075512.png" alt="" class="wp-image-4652" srcset="https://www.specnext.com/wp-content/uploads/2025/05/Screenshot_20240615_075512.png 1060w, https://www.specnext.com/wp-content/uploads/2025/05/Screenshot_20240615_075512-300x172.png 300w, https://www.specnext.com/wp-content/uploads/2025/05/Screenshot_20240615_075512-1024x588.png 1024w, https://www.specnext.com/wp-content/uploads/2025/05/Screenshot_20240615_075512-768x441.png 768w, https://www.specnext.com/wp-content/uploads/2025/05/Screenshot_20240615_075512-600x345.png 600w" sizes="(max-width: 1060px) 100vw, 1060px"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1920" height="1080" src="https://www.specnext.com/wp-content/uploads/2025/05/plotwithhiddenmenu.png" alt="" class="wp-image-4653" srcset="https://www.specnext.com/wp-content/uploads/2025/05/plotwithhiddenmenu.png 1920w, https://www.specnext.com/wp-content/uploads/2025/05/plotwithhiddenmenu-300x169.png 300w, https://www.specnext.com/wp-content/uploads/2025/05/plotwithhiddenmenu-1024x576.png 1024w, https://www.specnext.com/wp-content/uploads/2025/05/plotwithhiddenmenu-768x432.png 768w, https://www.specnext.com/wp-content/uploads/2025/05/plotwithhiddenmenu-600x338.png 600w, https://www.specnext.com/wp-content/uploads/2025/05/plotwithhiddenmenu-1536x864.png 1536w, https://www.specnext.com/wp-content/uploads/2025/05/plotwithhiddenmenu-394x221.png 394w" sizes="(max-width: 1920px) 100vw, 1920px"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1920" height="1080" src="https://www.specnext.com/wp-content/uploads/2025/05/mainscreen.png" alt="" class="wp-image-4654" srcset="https://www.specnext.com/wp-content/uploads/2025/05/mainscreen.png 1920w, https://www.specnext.com/wp-content/uploads/2025/05/mainscreen-300x169.png 300w, https://www.specnext.com/wp-content/uploads/2025/05/mainscreen-1024x576.png 1024w, https://www.specnext.com/wp-content/uploads/2025/05/mainscreen-768x432.png 768w, https://www.specnext.com/wp-content/uploads/2025/05/mainscreen-600x338.png 600w, https://www.specnext.com/wp-content/uploads/2025/05/mainscreen-1536x864.png 1536w, https://www.specnext.com/wp-content/uploads/2025/05/mainscreen-394x221.png 394w" sizes="(max-width: 1920px) 100vw, 1920px"></figure>



<p class="has-vivid-red-color has-text-color has-link-color wp-elements-ea959297a1f2c96cbe0c805e429dab87">Read the documentation / details and <strong><a href="https://github.com/matt-thompson-uk/Next-Fractal-Explorer">download here</a></strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity">



<p>Entry: Next2Net<br>Developer: Martyn Hill<br>Type: Hardware Interface<br>Platform: QL Next</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="2000" height="1126" src="https://www.specnext.com/wp-content/uploads/2025/05/2e6930de47d37892e3f8c2b2f94663ae.jpeg" alt="" class="wp-image-4656" srcset="https://www.specnext.com/wp-content/uploads/2025/05/2e6930de47d37892e3f8c2b2f94663ae.jpeg 2000w, https://www.specnext.com/wp-content/uploads/2025/05/2e6930de47d37892e3f8c2b2f94663ae-300x169.jpeg 300w, https://www.specnext.com/wp-content/uploads/2025/05/2e6930de47d37892e3f8c2b2f94663ae-1024x577.jpeg 1024w, https://www.specnext.com/wp-content/uploads/2025/05/2e6930de47d37892e3f8c2b2f94663ae-768x432.jpeg 768w, https://www.specnext.com/wp-content/uploads/2025/05/2e6930de47d37892e3f8c2b2f94663ae-600x338.jpeg 600w, https://www.specnext.com/wp-content/uploads/2025/05/2e6930de47d37892e3f8c2b2f94663ae-1536x865.jpeg 1536w, https://www.specnext.com/wp-content/uploads/2025/05/2e6930de47d37892e3f8c2b2f94663ae-394x221.jpeg 394w" sizes="(max-width: 2000px) 100vw, 2000px"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="2000" height="1126" src="https://www.specnext.com/wp-content/uploads/2025/05/5788f05cabc009e35dc8ea8129b8a6f2.jpeg" alt="" class="wp-image-4658" srcset="https://www.specnext.com/wp-content/uploads/2025/05/5788f05cabc009e35dc8ea8129b8a6f2.jpeg 2000w, https://www.specnext.com/wp-content/uploads/2025/05/5788f05cabc009e35dc8ea8129b8a6f2-300x169.jpeg 300w, https://www.specnext.com/wp-content/uploads/2025/05/5788f05cabc009e35dc8ea8129b8a6f2-1024x577.jpeg 1024w, https://www.specnext.com/wp-content/uploads/2025/05/5788f05cabc009e35dc8ea8129b8a6f2-768x432.jpeg 768w, https://www.specnext.com/wp-content/uploads/2025/05/5788f05cabc009e35dc8ea8129b8a6f2-600x338.jpeg 600w, https://www.specnext.com/wp-content/uploads/2025/05/5788f05cabc009e35dc8ea8129b8a6f2-1536x865.jpeg 1536w, https://www.specnext.com/wp-content/uploads/2025/05/5788f05cabc009e35dc8ea8129b8a6f2-394x221.jpeg 394w" sizes="(max-width: 2000px) 100vw, 2000px"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="2000" height="1126" src="https://www.specnext.com/wp-content/uploads/2025/05/9b721feb55f53610f840fedf11e09e0e.jpeg" alt="" class="wp-image-4659" srcset="https://www.specnext.com/wp-content/uploads/2025/05/9b721feb55f53610f840fedf11e09e0e.jpeg 2000w, https://www.specnext.com/wp-content/uploads/2025/05/9b721feb55f53610f840fedf11e09e0e-300x169.jpeg 300w, https://www.specnext.com/wp-content/uploads/2025/05/9b721feb55f53610f840fedf11e09e0e-1024x577.jpeg 1024w, https://www.specnext.com/wp-content/uploads/2025/05/9b721feb55f53610f840fedf11e09e0e-768x432.jpeg 768w, https://www.specnext.com/wp-content/uploads/2025/05/9b721feb55f53610f840fedf11e09e0e-600x338.jpeg 600w, https://www.specnext.com/wp-content/uploads/2025/05/9b721feb55f53610f840fedf11e09e0e-1536x865.jpeg 1536w, https://www.specnext.com/wp-content/uploads/2025/05/9b721feb55f53610f840fedf11e09e0e-394x221.jpeg 394w" sizes="(max-width: 2000px) 100vw, 2000px"></figure>



<p class="has-vivid-red-color has-text-color has-link-color wp-elements-e8ed13a9e0ac11eccd3be0ea3ab2618e">An early version of the Next2Net adapter was shown during Crash Live! 2024. <strong><a href="https://www.specnext.com/wp-content/uploads/2025/05/Networking-the-QL-and-ZX-Spectrum-Part-1-v2.1-Jan-2025.pdf">Documentation and schematics are here</a></strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity">



<p>Entry: PCQLTransfer<br>Developer: Johan Engdahl<br>Type: Network utility<br>Platform: QL Next</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="442" height="313" src="https://www.specnext.com/wp-content/uploads/2025/05/Picture5.png" alt="" class="wp-image-4677" srcset="https://www.specnext.com/wp-content/uploads/2025/05/Picture5.png 442w, https://www.specnext.com/wp-content/uploads/2025/05/Picture5-300x212.png 300w" sizes="(max-width: 442px) 100vw, 442px"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="678" height="227" src="https://www.specnext.com/wp-content/uploads/2025/05/Picture4.png" alt="" class="wp-image-4678" srcset="https://www.specnext.com/wp-content/uploads/2025/05/Picture4.png 678w, https://www.specnext.com/wp-content/uploads/2025/05/Picture4-300x100.png 300w, https://www.specnext.com/wp-content/uploads/2025/05/Picture4-600x201.png 600w" sizes="(max-width: 678px) 100vw, 678px"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="739" height="286" src="https://www.specnext.com/wp-content/uploads/2025/05/Picture2.png" alt="" class="wp-image-4679" srcset="https://www.specnext.com/wp-content/uploads/2025/05/Picture2.png 739w, https://www.specnext.com/wp-content/uploads/2025/05/Picture2-300x116.png 300w, https://www.specnext.com/wp-content/uploads/2025/05/Picture2-600x232.png 600w" sizes="(max-width: 739px) 100vw, 739px"></figure>



<p>When downloading the file below pay attention to unzip the QL portion within a QXL.WIN container as it will lose its headers if you do not</p>



<p class="has-vivid-red-color has-text-color has-link-color wp-elements-66b3e4ed4266e0ab8579dd1af2d386da"><a href="https://www.specnext.com/wp-content/uploads/2025/05/PCQLTrans.zip">Download Here</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity">



<h2 class="wp-block-heading">Selection process</h2>



<p>Public votes will carry a 70% weight of the results while the Next team’s votes will carry a 30% weight.</p>



<p>Voting will close on May 29th at midnight GMT and final results will be announced during the SpecNext and KS3 talk at RetCon 2025 in Barnhill Community Centre and Social Club, Ayles Road, Hayes, UB4 9HG</p>



<p>Link for the above event: <a href="https://retconfestival.co.uk/">https://retconfestival.co.uk/</a></p>



<p>Since we only had ONE entry for hardware, we will give Martyn an honourable mention at this point (but please do vote for him) and redo a hardware-only contest in June 2025!</p>




				<form method="POST" id="ts_poll_form_613139" class="ts_poll_form ts_poll_form_613139" data-tsp-pos="center" v-bind:data-tsp-mode="tspMode">
					<div id="ts_poll_section_613139" class="ts_poll_section_613139 ts_poll_section" data-tsp-box="sh04" style="display:none;">
						

				<span class="ts_poll_cs_613139">
					<span class="ts_poll_cs_text_613139">
						Coming Soon
					</span>
				</span>
				
        <header class="ts_poll_header_613139" data-tsp-pos="center">
            
            <span class="ts_poll_title_613139">
                Select your favourite!
            </span>
			<div class="ts_poll_line_613139"></div>
        </header>
  	<main class="ts_poll_main_613139" data-tsp-color="Background" data-tsp-voted="Nothing" data-tsp-veff="0">
		<div class="ts_poll_answer" v-bind:class="{tsp_sceleton_item: tspSceleton}" v-for="row in tsp_answers" v-bind:data-tsp-id="row.id">
			<input type="radio" class="ts_poll_answer_input" v-bind:id="`ts_poll_answer_input_613139-${row.id}`" name="ts_poll_all613139" v-bind:value="row.id" v-on:change="tspCheck($event.target)">
				<label class="ts_poll_answer_label ts_poll_fa" dir="auto" v-bind:for="`ts_poll_answer_input_613139-${row.id}`">{{ row.Answer_Title }}</label>
			<span class="ts_poll_r_block">
			  <span class="ts_poll_r_inner">
				<span class="ts_poll_r_progress" v-bind:data-tsp-length="row.tsp_result_percent"></span>
				<label class="ts_poll_r_label" dir="auto" v-if=" tsp_type === `percentlab` || tsp_type === `countlab` || tsp_type === `bothlab` ">
					{{  row.Answer_Title }}
					<span v-if=" tsp_type === `percentlab` &amp;&amp; tsp_show === `true` " class="ts_poll_r_info">
						{{row.tsp_result_percent}} %
					</span>
					<span v-else-if=" tsp_type === `countlab` &amp;&amp; tsp_show === `true` " class="ts_poll_r_info">
						{{row.Answer_Votes}}
					</span>
					<span v-else-if=" tsp_type === `bothlab` &amp;&amp; tsp_show === `true` " class="ts_poll_r_info">
					   {{row.Answer_Votes}} ( {{row.tsp_result_percent}} % )
					</span>
					<span v-else="" class="ts_poll_r_info">
						{{ tsp_result_no }}
					</span>
		  		</label>
				<label class="ts_poll_r_label" dir="auto" v-else="">
					<span v-if=" tsp_type === `percent` &amp;&amp; tsp_show === `true` " class="ts_poll_r_info">
						{{row.tsp_result_percent}} %
					</span>
					<span v-else-if=" tsp_type === `count` &amp;&amp; tsp_show === `true` " class="ts_poll_r_info">
						{{row.Answer_Votes}}
					</span>
					<span v-else-if=" tsp_type === `both` &amp;&amp; tsp_show === `true` " class="ts_poll_r_info">
					   {{row.Answer_Votes}} ( {{row.tsp_result_percent}} % )
					</span>
					<span v-else="" class="ts_poll_r_info">
						{{ tsp_result_no }}
					</span>
		  		</label>
			  </span>
			</span>
		</div>
  	  <div class="ts_poll_after_line_613139"></div>
  	</main>
	
	<footer id="ts_poll_footer_613139" class="ts_poll_footer_613139" v-bind:class="{tsp_sceleton_item: tspSceleton}">
		<div class="ts_poll_footer_main">
			
			
		<button class="ts_poll_vote_button" v-on:click="vote_function" id="ts_poll_vote_button" name="ts_poll_vote_button" type="button" data-tsp-text="V o t e" data-tsp-pos="right">
            <i class="ts_poll_vote_icon ts-poll ts-poll-none" data-tsp="before">
				<span data-tsp-text="V o t e"></span>
			</i>
        </button>
			
			<span class="ts_poll_total_v ts-poll ts-poll-star-o" style="" data-tsp-pos="left" data-tsp-text="Total Votes" data-tsp-align="before">
                <span data-tsp-text="Total Votes"> : {{ tspTotal }} </span>
            </span>
			
		</div>
		<div class="ts_poll_footer_res">
			
		</div>
	</footer>
	
					</div>
					<input type="hidden" id="tsp_vote_nonce_field_613139" name="tsp_vote_nonce_field_613139" value="35e66f24b6"><input type="hidden" name="_wp_http_referer" value="/feed/">
				</form>
				
					<style>
						
				  @font-face {
					font-family: "Fira Sans Condensed";
					font-style: normal;
					font-weight: 400;
					src: url("https://fonts.gstatic.com/s/firasanscondensed/v9/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtqQ.eot"); 
					src: url("https://fonts.gstatic.com/s/firasanscondensed/v9/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtqQ.eot") format("embedded-opentype"), 
						 url("https://fonts.gstatic.com/s/firasanscondensed/v9/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtrQ.woff2") format("woff2"), 
						 url("https://fonts.gstatic.com/s/firasanscondensed/v9/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtqw.woff") format("woff"), 
						 url("https://fonts.gstatic.com/s/firasanscondensed/v9/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtqA.ttf") format("truetype"), 
						 url("https://fonts.gstatic.com/l/font?kit=wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtqg&#038;skey=96eb1234fcb38aea&#038;v=v9#FiraSansCondensed") format("svg");
				  }
				
				  @font-face {
					font-family: "Fira Sans Condensed";
					font-style: normal;
					font-weight: 400;
					src: url("https://fonts.gstatic.com/s/firasanscondensed/v9/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtqQ.eot"); 
					src: url("https://fonts.gstatic.com/s/firasanscondensed/v9/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtqQ.eot") format("embedded-opentype"), 
						 url("https://fonts.gstatic.com/s/firasanscondensed/v9/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtrQ.woff2") format("woff2"), 
						 url("https://fonts.gstatic.com/s/firasanscondensed/v9/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtqw.woff") format("woff"), 
						 url("https://fonts.gstatic.com/s/firasanscondensed/v9/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtqA.ttf") format("truetype"), 
						 url("https://fonts.gstatic.com/l/font?kit=wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtqg&#038;skey=96eb1234fcb38aea&#038;v=v9#FiraSansCondensed") format("svg");
				  }
				
				  @font-face {
					font-family: "Fira Sans Condensed";
					font-style: normal;
					font-weight: 400;
					src: url("https://fonts.gstatic.com/s/firasanscondensed/v9/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtqQ.eot"); 
					src: url("https://fonts.gstatic.com/s/firasanscondensed/v9/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtqQ.eot") format("embedded-opentype"), 
						 url("https://fonts.gstatic.com/s/firasanscondensed/v9/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtrQ.woff2") format("woff2"), 
						 url("https://fonts.gstatic.com/s/firasanscondensed/v9/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtqw.woff") format("woff"), 
						 url("https://fonts.gstatic.com/s/firasanscondensed/v9/wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtqA.ttf") format("truetype"), 
						 url("https://fonts.gstatic.com/l/font?kit=wEOhEADFm8hSaQTFG18FErVhsC9x-tarUfbtqg&#038;skey=96eb1234fcb38aea&#038;v=v9#FiraSansCondensed") format("svg");
				  }
				
				  @font-face {
					font-family: "Baumans";
					font-style: normal;
					font-weight: 400;
					src: url("https://fonts.gstatic.com/s/baumans/v15/-W_-XJj9QyTd3Qfpd_04bw.eot"); 
					src: url("https://fonts.gstatic.com/s/baumans/v15/-W_-XJj9QyTd3Qfpd_04bw.eot") format("embedded-opentype"), 
						 url("https://fonts.gstatic.com/s/baumans/v15/-W_-XJj9QyTd3Qfpd_04aw.woff2") format("woff2"), 
						 url("https://fonts.gstatic.com/s/baumans/v15/-W_-XJj9QyTd3Qfpd_04bQ.woff") format("woff"), 
						 url("https://fonts.gstatic.com/s/baumans/v15/-W_-XJj9QyTd3Qfpd_04bg.ttf") format("truetype"), 
						 url("https://fonts.gstatic.com/l/font?kit=-W_-XJj9QyTd3Qfpd_04bA&#038;skey=34ab2ddaf19de28&#038;v=v15#Baumans") format("svg");
				  }
				
				  @font-face {
					font-family: "Cairo";
					font-style: normal;
					font-weight: 400;
					src: url("https://fonts.gstatic.com/s/cairo/v17/SLXVc1nY6HkvangtZmpcWmhzfH5lWWgcRiyW.eot"); 
					src: url("https://fonts.gstatic.com/s/cairo/v17/SLXVc1nY6HkvangtZmpcWmhzfH5lWWgcRiyW.eot") format("embedded-opentype"), 
						 url("https://fonts.gstatic.com/s/cairo/v17/SLXVc1nY6HkvangtZmpcWmhzfH5lWWgcRiyS.woff2") format("woff2"), 
						 url("https://fonts.gstatic.com/s/cairo/v17/SLXVc1nY6HkvangtZmpcWmhzfH5lWWgcRiyU.woff") format("woff"), 
						 url("https://fonts.gstatic.com/s/cairo/v17/SLXVc1nY6HkvangtZmpcWmhzfH5lWWgcRiyX.ttf") format("truetype"), 
						 url("https://fonts.gstatic.com/l/font?kit=SLXVc1nY6HkvangtZmpcWmhzfH5lWWgcRiyV&#038;skey=ee6e3b9105e1a754&#038;v=v17#Cairo") format("svg");
				  }
				
		:root{
			--tsp_section_w_613139:36%;
			--tsp_section_bw_613139:10px;
			--tsp_section_bc_613139:rgb(255, 255, 255);
			--tsp_section_br_613139:9px;
			--tsp_section_box_c_613139:rgb(184, 184, 184);
		}
		form.ts_poll_form_613139[data-tsp-mode="coming"] > div > span.ts_poll_cs_613139{
			display:flex !important;
		}
		form.ts_poll_form_613139[data-tsp-mode="coming"] > div > *:not(span.ts_poll_cs_613139){
			z-index: -1;
			visibility: hidden;
		}
		form.ts_poll_form_613139:not([data-tsp-mode="coming"]) > div > span.ts_poll_cs_613139{
			z-index: -1;
			visibility: hidden;
			display:none !important;
		}
		form.ts_poll_form_613139[data-tsp-mode="end"] > div > footer{
			display:none !important;
		}
		form.ts_poll_form_613139[data-tsp-pos="left"]{
			-webkit-justify-content: flex-start;-ms-flex-pack: start;justify-content: flex-start;
		}
		form.ts_poll_form_613139[data-tsp-pos="right"]{
			-webkit-justify-content: flex-end;-ms-flex-pack: end;justify-content: flex-end;
		}
		form.ts_poll_form_613139[data-tsp-pos="center"]{
			-webkit-justify-content: center;-ms-flex-pack: center;justify-content: center;
		}
		form.ts_poll_form_613139 *{
			-moz-box-sizing: border-box;
			-webkit-box-sizing: border-box;
			box-sizing: border-box;
			font-weight:inherit;
		}
		div#ts_poll_section_613139{
			width: var(--tsp_section_w_613139);
			border-width:  var(--tsp_section_bw_613139);
			border-style:solid;
			border-color: var(--tsp_section_bc_613139);
			border-radius: var(--tsp_section_br_613139);
			display: -ms-flexbox;display: -webkit-flex;display: flex;
			-webkit-flex-direction: column;-ms-flex-direction: column;flex-direction: column;
			-webkit-flex-wrap: nowrap;-ms-flex-wrap: nowrap;flex-wrap: nowrap;
			overflow: hidden;
			position:relative;
		}
		div#ts_poll_section_613139[data-tsp-box="none"]{
			-webkit-box-shadow: none;
			-moz-box-shadow: none;
			box-shadow: none;
		}
		div#ts_poll_section_613139[data-tsp-box="true"]{
			-webkit-box-shadow: 0px 0px 13px var(--tsp_section_box_c_613139);
			-moz-box-shadow: 0px 0px 13px var(--tsp_section_box_c_613139);
			box-shadow: 0px 0px 13px var(--tsp_section_box_c_613139);
		}
		div#ts_poll_section_613139[data-tsp-box="false"]{
			-webkit-box-shadow: 0 25px 13px -18px var(--tsp_section_box_c_613139);
			-moz-box-shadow: 0 25px 13px -18px var(--tsp_section_box_c_613139);
			box-shadow: 0 25px 13px -18px var(--tsp_section_box_c_613139);
		}
		div#ts_poll_section_613139[data-tsp-box="sh03"]{
			box-shadow: 0 10px 6px -6px var(--tsp_section_box_c_613139);
			-webkit-box-shadow: 0 10px 6px -6px var(--tsp_section_box_c_613139);
			-moz-box-shadow: 0 10px 6px -6px var(--tsp_section_box_c_613139);
		}
		div#ts_poll_section_613139[data-tsp-box="sh04"]{
			box-shadow: 0 1px 4px var(--tsp_section_box_c_613139), 0 0 40px var(--tsp_section_box_c_613139) inset;
			-webkit-box-shadow: 0 1px 4px var(--tsp_section_box_c_613139), 0 0 40px var(--tsp_section_box_c_613139) inset;
			-moz-box-shadow: 0 1px 4px var(--tsp_section_box_c_613139), 0 0 40px var(--tsp_section_box_c_613139) inset;
		}
		div#ts_poll_section_613139[data-tsp-box="sh05"]{
			box-shadow: 0 0 10px var(--tsp_section_box_c_613139);
			-webkit-box-shadow: 0 0 10px var(--tsp_section_box_c_613139);
			-moz-box-shadow: 0 0 10px var(--tsp_section_box_c_613139);
		}
		div#ts_poll_section_613139[data-tsp-box="sh06"]{
			box-shadow: 4px -4px var(--tsp_section_box_c_613139);
			-moz-box-shadow: 4px -4px var(--tsp_section_box_c_613139);
			-webkit-box-shadow: 4px -4px var(--tsp_section_box_c_613139);
		}
		div#ts_poll_section_613139[data-tsp-box="sh07"]{
			box-shadow: 5px 5px 3px var(--tsp_section_box_c_613139);
			-moz-box-shadow: 5px 5px 3px var(--tsp_section_box_c_613139);
			-webkit-box-shadow: 5px 5px 3px var(--tsp_section_box_c_613139);
		}
		div#ts_poll_section_613139[data-tsp-box="sh08"]{
			box-shadow: 2px 2px white, 4px 4px var(--tsp_section_box_c_613139);
			-moz-box-shadow: 2px 2px white, 4px 4px var(--tsp_section_box_c_613139);
			-webkit-box-shadow: 2px 2px white, 4px 4px var(--tsp_section_box_c_613139);
		}
		div#ts_poll_section_613139[data-tsp-box="sh09"]{
			box-shadow: 8px 8px 18px var(--tsp_section_box_c_613139);
			-moz-box-shadow: 8px 8px 18px var(--tsp_section_box_c_613139);
			-webkit-box-shadow: 8px 8px 18px var(--tsp_section_box_c_613139);
		}
		div#ts_poll_section_613139[data-tsp-box="sh10"]{
			box-shadow: 0 8px 6px -6px var(--tsp_section_box_c_613139);
			-moz-box-shadow: 0 8px 6px -6px var(--tsp_section_box_c_613139);
			-webkit-box-shadow: 0 8px 6px -6px var(--tsp_section_box_c_613139);
		}
		div#ts_poll_section_613139[data-tsp-box="sh11"]{
			box-shadow: 0 0 18px 7px var(--tsp_section_box_c_613139);
			-moz-box-shadow: 0 0 18px 7px var(--tsp_section_box_c_613139);
			-webkit-box-shadow: 0 0 18px 7px var(--tsp_section_box_c_613139);
		}
		
		:root{
			--tsp_coming_bgc_613139:rgba(209,209,209,0.79);
			--tsp_coming_c_613139:#000000;
			--tsp_coming_fs_613139:32px;
			--tsp_coming_ff_613139:Cairo;
		}
		span.ts_poll_cs_613139 {
			position:absolute;
			left:0;
			right:0;
			top:0;
			bottom:0;
			background-color: var(--tsp_coming_bgc_613139);
			text-align: center;
			width: 100%;
			height: 100%;
			line-height: 1;
			display: -ms-flexbox;display: -webkit-flex;display: flex;
			-webkit-justify-content: center;-ms-flex-pack: center;justify-content: center;
			-webkit-align-content: center;-ms-flex-line-pack: center;align-content: center;
			-webkit-align-items: center;-ms-flex-align: center;align-items: center;
			-webkit-flex-direction: column;-ms-flex-direction: column;flex-direction: column;
		}
		span.ts_poll_cs_text_613139 {
			color: var(--tsp_coming_c_613139);
			font-size: var(--tsp_coming_fs_613139);
			font-family: var(--tsp_coming_ff_613139);
			cursor: default;
		}
		
			:root{
				--tsp_header_bgc_613139:#ffffff;
				--tsp_header_c_613139:rgb(253, 38, 122);
				--tsp_header_fs_613139:25px;
				--tsp_header_ff_613139:Fira Sans Condensed;
				--tsp_header_ta_613139:center;
				--tsp_header_l_w_613139:100%;
				--tsp_header_l_bh_613139:1px;
				--tsp_header_l_bs_613139:solid;
				--tsp_header_l_bc_613139:rgb(115, 115, 115);
			}
			header.ts_poll_header_613139{
				width:100%;
				display: -ms-flexbox;display: -webkit-flex;display: flex;
				-webkit-flex-direction: column;-ms-flex-direction: column;flex-direction: column;
				-webkit-flex-wrap: nowrap;-ms-flex-wrap: nowrap;flex-wrap: nowrap;
				-webkit-justify-content: center;-ms-flex-pack: center;justify-content: center;
				-webkit-align-content: center;-ms-flex-line-pack: center;align-content: center;
				-webkit-align-items: center;-ms-flex-align: center;align-items: center;
				-webkit-justify-content: center;-ms-flex-pack: center;justify-content: center;
				background-color:var(--tsp_header_bgc_613139); 
				color:var(--tsp_header_c_613139); 
				padding: 5px 10px 5px;
			}
			header.ts_poll_header_613139 > span.ts_poll_title_613139{
				margin-bottom: 7px;
				font-family:var(--tsp_header_ff_613139);
				line-height:1.2;
				font-size:var(--tsp_header_fs_613139);
				text-align:var(--tsp_header_ta_613139);
				word-break: break-word;
			}
			header.ts_poll_header_613139[data-tsp-pos="left"] > span.ts_poll_title_613139{
				margin-right: auto;
			}
			header.ts_poll_header_613139[data-tsp-pos="right"] > span.ts_poll_title_613139{
				margin-left: auto;
			}
			header.ts_poll_header_613139 > div.ts_poll_line_613139{
				width:var(--tsp_header_l_w_613139);
				border-top-width:var(--tsp_header_l_bh_613139);
				border-top-style:var(--tsp_header_l_bs_613139);
				border-top-color:var(--tsp_header_l_bc_613139);
			}
		
	:root{
		--tsp_checkbox_size_613139:19px;
		--tsp_answer_bw_613139:8px;
		--tsp_answer_br_613139:6px;
		--tsp_answer_bc_613139:rgb(255, 255, 255);
		--tsp_block_bgc_613139:rgb(244, 244, 244);
		--tsp_progress_bgc_613139:rgb(181, 170, 170);
		--tsp_progress_c_613139:rgb(0, 0, 0);
	}
	div#ts_poll_section_613139 > main.ts_poll_main_613139 {
		position: relative;
		width:100% !important;
		display: -ms-flexbox;display: -webkit-flex;display: flex;
		-webkit-flex-direction: column;-ms-flex-direction: column;flex-direction: column;
		-webkit-flex-wrap: nowrap;-ms-flex-wrap: nowrap;flex-wrap: nowrap;
		-webkit-justify-content: center;-ms-flex-pack: center;justify-content: center;
		-webkit-align-items: center;-ms-flex-align: center;align-items: center;
		background-color: var(--tsp_main_bgc_613139);
		padding: 5px 10px;
	}
	main.ts_poll_main_613139 > .ts_poll_answer:not(:last-child) {
		margin-bottom: 5px;
	}
	main.ts_poll_main_613139:not([data-tsp-color="Background"]) > .ts_poll_answer {
		background-color: var(--tsp_answer_bgc_613139);
	}
	main.ts_poll_main_613139  > .ts_poll_answer {
		position: relative;
		width: 100%;
		border-width: var(--tsp_answer_bw_613139);
		border-style:solid;
		border-color:var(--tsp_answer_bc_613139);
		border-radius: var(--tsp_answer_br_613139);
		line-height: 1.2 !important;
	}
	main.ts_poll_main_613139  > .ts_poll_answer .ts_poll_answer_label{
		width: 100%;
		line-height: 1.5;
		display: -webkit-box;
		display: -moz-box;
		display: -ms-inline-flexbox;
		display: -webkit-inline-flex;
		display: inline-flex;
		-webkit-box-direction: normal;
		-moz-box-direction: normal;
		-webkit-box-orient: horizontal;
		-moz-box-orient: horizontal;
		-webkit-flex-direction: row;
		-ms-flex-direction: row;
		flex-direction: row;
		-webkit-flex-wrap: nowrap;
		-ms-flex-wrap: nowrap;
		flex-wrap: nowrap;
		-webkit-box-pack: start;
		-moz-box-pack: start;
		-webkit-justify-content: flex-start;
		-ms-flex-pack: start;
		justify-content: flex-start;
		-webkit-align-content: center;
		-ms-flex-line-pack: center;
		align-content: center;
		-webkit-box-align: center;
		-moz-box-align: center;
		-webkit-align-items: center;
		-ms-flex-align: center;
		align-items: center;
		word-break: break-word;
	}
	main.ts_poll_main_613139  > .ts_poll_answer:not(.tsp_sceleton_item):hover {
		background-color: var(--tsp_answer_h_bgc_613139) !important;
	}
	main.ts_poll_main_613139  > .ts_poll_answer:not(.tsp_sceleton_item):hover .ts_poll_answer_label {
		color: var(--tsp_answer_h_c_613139) !important;
	}
	main.ts_poll_main_613139 > .ts_poll_answer input {
		display: none !important;
	}
	main.ts_poll_main_613139 > .ts_poll_answer input + label {
		font-size: var(--tsp_answer_fs_613139) !important;
		cursor: pointer;
		margin-bottom: 0px !important;
		font-family: var(--tsp_answer_ff_613139);
	}
	main.ts_poll_main_613139:not([data-tsp-color="Color"]) > .ts_poll_answer input + label {
		color: var(--tsp_answer_c_613139) !important;
	}
	main.ts_poll_main_613139 > .ts_poll_answer input + label:before {
		margin: 0 .25em 0 0 !important;
		padding: 0 !important;
		font-size: var(--tsp_checkbox_size_613139) !important;
		font-family: FontAwesome !important;
	}
	main.ts_poll_main_613139  > .ts_poll_answer input:checked + label:after {
		font-weight: bold;
	}
	main.ts_poll_main_613139  > .ts_poll_answer span.ts_poll_r_block{
		position: absolute;
		display: inline-block;
		overflow: hidden;
		top: 0;
		left: 0;
		width:100%;
		height: 100%;
		background: var(--tsp_block_bgc_613139) !important;
		opacity: 0;
		z-index: -1;
		cursor: default;
	}
	main.ts_poll_main_613139  > .ts_poll_answer span.ts_poll_r_inner {
		position: relative;
		display: inline-block;
		top: 0;
		left: 0;
		width: 100%;
		height: 100%;
	}
	main.ts_poll_main_613139  > .ts_poll_answer span.ts_poll_r_progress {
		position: absolute;
		display: inline-block;
		top: 0;
		left: 0;
		height: 100%;
		min-width: 3px !important;
	}
	main.ts_poll_main_613139:not([data-tsp-voted="Background"]) > .ts_poll_answer span.ts_poll_r_progress{
		background-color: var(--tsp_progress_bgc_613139) !important;
	}
	main.ts_poll_main_613139  > .ts_poll_answer label.ts_poll_r_label{
		position: absolute;
		display: -ms-inline-flexbox;
		display: -webkit-inline-flex;
		display: inline-flex;
		-webkit-flex-direction: row;
		-ms-flex-direction: row;
		flex-direction: row;
		-webkit-flex-wrap: wrap;
		-ms-flex-wrap: wrap;
		flex-wrap: wrap;
		-webkit-justify-content: space-between;
		-ms-flex-pack: justify;
		justify-content: space-between;
		-webkit-align-content: center;
		-ms-flex-line-pack: center;
		align-content: center;
		-webkit-align-items: center;
		-ms-flex-align: center;
		align-items: center;
		top: 0;
		left: 0;
		width: 100%;
		height: 100%;
		padding: 10px;
		font-size:var(--tsp_answer_fs_613139);
		font-family: var(--tsp_answer_ff_613139);
		margin-bottom:0px;
	}
	main.ts_poll_main_613139:not([data-tsp-voted="Color"]) > .ts_poll_answer label.ts_poll_r_label{
		color: var(--tsp_progress_c_613139) !important;
	}
	main.ts_poll_main_613139  > .ts_poll_answer label.ts_poll_r_label span.ts_poll_r_info{
		margin-left: auto;
		line-height: 1 !important;
	}
	
		main.ts_poll_main_613139 > .ts_poll_answer .ts_poll_answer_label{
			padding: 7px 10px;
		}
		main.ts_poll_main_613139 > .ts_poll_answer input:not(:checked) + label:before {
			color: var(--tsp_before_check_c_613139);
			content: var(--tsp_before_check_613139);
		}
		main.ts_poll_main_613139 > .ts_poll_answer input:checked + label:before {
			color: var(--tsp_after_check_c_613139) !important;
			content: var(--tsp_after_check_613139);
		}
		
		:root{
			--tsp_before_check_c_613139:rgb(255, 255, 255);
			--tsp_after_check_c_613139:rgb(0, 0, 0);
			--tsp_before_check_613139:"\f096";
			--tsp_after_check_613139:"\f0c8";
		}
		
	:root{
		--tsp_answer_fs_613139:17px;
		--tsp_main_bgc_613139:#ffffff;
		--tsp_answer_bgc_613139:rgb(253, 38, 122);
		--tsp_answer_h_bgc_613139:rgb(225, 17, 98);
		--tsp_answer_h_c_613139:rgb(255, 255, 255);
		--tsp_answer_c_613139:rgb(255, 255, 255);
		--tsp_answer_ff_613139:Fira Sans Condensed;
		--tsp_main_l_bw_613139:0%;
		--tsp_main_l_bh_613139:0px;
		--tsp_main_l_bc_613139:rgb(0, 0, 0);
		--tsp_main_l_bs_613139:solid;
	}
	.ts_flex_col {
		display: -ms-flexbox;
		display: -webkit-flex;
		display: flex;
		-webkit-flex-direction: column;
		-ms-flex-direction: column;
		flex-direction: column;
		-webkit-flex-wrap: nowrap;
		-ms-flex-wrap: nowrap;
		flex-wrap: nowrap;
		-webkit-justify-content: center;
		-ms-flex-pack: center;
		justify-content: center;
		-webkit-align-content: center;
		-ms-flex-line-pack: center;
		align-content: center;
		-webkit-align-items: center;
		-ms-flex-align: center;
		align-items: center;
	}
	.ts_flex_row {
		display: -ms-flexbox;
		display: -webkit-flex;
		display: flex;
		-webkit-flex-direction: row;
		-ms-flex-direction: row;
		flex-direction: row;
		-webkit-flex-wrap: nowrap;
		-ms-flex-wrap: nowrap;
		flex-wrap: nowrap;
		-webkit-justify-content: center;
		-ms-flex-pack: center;
		justify-content: center;
		-webkit-align-content: center;
		-ms-flex-line-pack: center;
		align-content: center;
		-webkit-align-items: center;
		-ms-flex-align: center;
		align-items: center;
	}
	footer.ts_poll_footer_613139 button{
		font-weight:normal !important;
	}
	footer.ts_poll_footer_613139 button:focus{
		outline: none !important;
	}
	form.ts_poll_form_613139[max-width~="450px"] div.ts_poll_section_613139{
		width: 100% !important;
	}
	div.ts_poll_section_613139[max-width~="250px"] footer.ts_poll_footer_613139 button {
		width: 98% !important;
		margin: 5px 1% !important;
	}
	main.ts_poll_main_613139 >  div.ts_poll_after_line_613139 {
		width: var(--tsp_main_l_bw_613139);
		margin-top: 5px;
		border-top: var(--tsp_main_l_bh_613139) var(--tsp_main_l_bs_613139) var(--tsp_main_l_bc_613139);
	}
	
		main.ts_poll_main_613139  > .ts_poll_answer span.ts_poll_r_progress{ 
			background-repeat:unset !important;
		}
		main.ts_poll_main_613139[data-tsp-veff="2"]  > .ts_poll_answer span.ts_poll_r_progress{ 
			background-size: 30px 30px;
			-moz-background-size: 30px 30px;
			-webkit-background-size: 30px 30px;
			-o-background-size: 30px 30px;
			background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			background-image: -webkit-gradient(linear, left top, right bottom, color-stop(0%, rgba(255, 255, 255, 0.2)), color-stop(25%, rgba(255, 255, 255, 0.2)), color-stop(25%, rgba(255, 255, 255, 0)), color-stop(50%, rgba(255, 255, 255, 0)), color-stop(50%, rgba(255, 255, 255, 0.2)), color-stop(75%, rgba(255, 255, 255, 0.2)), color-stop(75%, rgba(255, 255, 255, 0)), color-stop(100%, rgba(255, 255, 255, 0)));
			background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			box-shadow: 0 5px 5px rgba(255, 255, 255, 0.6) inset, 0 -5px 7px rgba(0, 0, 0, 0.4) inset;
			-moz-box-shadow: 0 5px 5px rgba(255, 255, 255, 0.6) inset, 0 -5px 7px rgba(0, 0, 0, 0.4) inset;
			-webkit-box-shadow: 0 5px 5px rgba(255, 255, 255, 0.6) inset, 0 -5px 7px rgba(0, 0, 0, 0.4) inset;
			filter: progid:-DXImageTransform.Microsoft.gradient(startColorstr="#33ffffff", endColorstr="#33000000", GradientType=0);
			animation: tsp_progress_s 2s linear infinite;
			-moz-animation: tsp_progress_s 2s linear infinite;
			-webkit-animation: tsp_progress_s 2s linear infinite;
		}
		main.ts_poll_main_613139[data-tsp-veff="3"]  > .ts_poll_answer span.ts_poll_r_progress{
			background-size: 30px 30px;
			-moz-background-size: 30px 30px;
			-webkit-background-size: 30px 30px;
			-o-background-size: 30px 30px;
			background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			background-image: -webkit-gradient(linear, left top, right bottom, color-stop(0%, rgba(255, 255, 255, 0.2)), color-stop(25%, rgba(255, 255, 255, 0.2)), color-stop(25%, rgba(255, 255, 255, 0)), color-stop(50%, rgba(255, 255, 255, 0)), color-stop(50%, rgba(255, 255, 255, 0.2)), color-stop(75%, rgba(255, 255, 255, 0.2)), color-stop(75%, rgba(255, 255, 255, 0)), color-stop(100%, rgba(255, 255, 255, 0)));
			background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			filter: progid:-DXImageTransform.Microsoft.gradient(startColorstr="#33ffffff", endColorstr="#33000000", GradientType=0);
			animation: tsp_progress_s 2s linear infinite;
			-moz-animation: tsp_progress_s 2s linear infinite;
			-webkit-animation: tsp_progress_s 2s linear infinite;
		}
		main.ts_poll_main_613139[data-tsp-veff="4"]  > .ts_poll_answer span.ts_poll_r_progress{
			background-size: 30px 30px;
			-moz-background-size: 30px 30px;
			-webkit-background-size: 30px 30px;
			-o-background-size: 30px 30px;
			background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			background-image: -webkit-gradient(linear, right top, left bottom, color-stop(0%, rgba(255, 255, 255, 0.2)), color-stop(25%, rgba(255, 255, 255, 0.2)), color-stop(25%, rgba(255, 255, 255, 0)), color-stop(50%, rgba(255, 255, 255, 0)), color-stop(50%, rgba(255, 255, 255, 0.2)), color-stop(75%, rgba(255, 255, 255, 0.2)), color-stop(75%, rgba(255, 255, 255, 0)), color-stop(100%, rgba(255, 255, 255, 0)));
			background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			background-image: -ms-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			box-shadow: 0 5px 5px rgba(255, 255, 255, 0.6) inset, 0 -5px 7px rgba(0, 0, 0, 0.4) inset;
			-moz-box-shadow: 0 5px 5px rgba(255, 255, 255, 0.6) inset, 0 -5px 7px rgba(0, 0, 0, 0.4) inset;
			-webkit-box-shadow: 0 5px 5px rgba(255, 255, 255, 0.6) inset, 0 -5px 7px rgba(0, 0, 0, 0.4) inset;
			filter: progid:-DXImageTransform.Microsoft.gradient(startColorstr="#33ffffff", endColorstr="#33000000", GradientType=0);
			animation: tsp_progress_a 2s linear infinite;
			-moz-animation: tsp_progress_a 2s linear infinite;
			-webkit-animation: tsp_progress_a 2s linear infinite;
		}
		main.ts_poll_main_613139[data-tsp-veff="5"]  > .ts_poll_answer span.ts_poll_r_progress{
		   background-size: 30px 30px;
		   -moz-background-size: 30px 30px;
		   -webkit-background-size: 30px 30px;
		   -o-background-size: 30px 30px;
		   background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
		   background-image: -webkit-gradient(linear, right top, left bottom, color-stop(0%, rgba(255, 255, 255, 0.2)), color-stop(25%, rgba(255, 255, 255, 0.2)), color-stop(25%, rgba(255, 255, 255, 0)), color-stop(50%, rgba(255, 255, 255, 0)), color-stop(50%, rgba(255, 255, 255, 0.2)), color-stop(75%, rgba(255, 255, 255, 0.2)), color-stop(75%, rgba(255, 255, 255, 0)), color-stop(100%, rgba(255, 255, 255, 0)));
		   background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
		   background-image: -ms-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
		   filter: progid:-DXImageTransform.Microsoft.gradient(startColorstr="#33ffffff", endColorstr="#33000000", GradientType=0);
		   animation: tsp_progress_a 2s linear infinite;
		   -moz-animation: tsp_progress_a 2s linear infinite;
		   -webkit-animation: tsp_progress_a 2s linear infinite;
		}
		main.ts_poll_main_613139[data-tsp-veff="6"]  > .ts_poll_answer span.ts_poll_r_progress{
			background-size: 30px 30px;
			-moz-background-size: 30px 30px;
			-webkit-background-size: 30px 30px;
			-o-background-size: 30px 30px;
			background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			background-image: -webkit-gradient(linear, right top, left bottom, color-stop(0%, rgba(255, 255, 255, 0.2)), color-stop(25%, rgba(255, 255, 255, 0.2)), color-stop(25%, rgba(255, 255, 255, 0)), color-stop(50%, rgba(255, 255, 255, 0)), color-stop(50%, rgba(255, 255, 255, 0.2)), color-stop(75%, rgba(255, 255, 255, 0.2)), color-stop(75%, rgba(255, 255, 255, 0)), color-stop(100%, rgba(255, 255, 255, 0)));
			background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			background-image: -ms-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			box-shadow: 0 5px 5px rgba(255, 255, 255, 0.6) inset, 0 -5px 7px rgba(0, 0, 0, 0.4) inset;
			-moz-box-shadow: 0 5px 5px rgba(255, 255, 255, 0.6) inset, 0 -5px 7px rgba(0, 0, 0, 0.4) inset;
			-webkit-box-shadow: 0 5px 5px rgba(255, 255, 255, 0.6) inset, 0 -5px 7px rgba(0, 0, 0, 0.4) inset;
			filter: progid:-DXImageTransform.Microsoft.gradient(startColorstr="#33ffffff", endColorstr="#33000000", GradientType=0);
			animation: tsp_progress_b 2s linear infinite;
			-moz-animation: tsp_progress_b 2s linear infinite;
			-webkit-animation: tsp_progress_b 2s linear infinite;
		}
		main.ts_poll_main_613139[data-tsp-veff="7"]  > .ts_poll_answer span.ts_poll_r_progress{
			background-size: 30px 30px;
			-moz-background-size: 30px 30px;
			-webkit-background-size: 30px 30px;
			-o-background-size: 30px 30px;
			background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			background-image: -webkit-gradient(linear, right top, left bottom, color-stop(0%, rgba(255, 255, 255, 0.2)), color-stop(25%, rgba(255, 255, 255, 0.2)), color-stop(25%, rgba(255, 255, 255, 0)), color-stop(50%, rgba(255, 255, 255, 0)), color-stop(50%, rgba(255, 255, 255, 0.2)), color-stop(75%, rgba(255, 255, 255, 0.2)), color-stop(75%, rgba(255, 255, 255, 0)), color-stop(100%, rgba(255, 255, 255, 0)));
			background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			background-image: -ms-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			filter: progid:-DXImageTransform.Microsoft.gradient(startColorstr="#33ffffff", endColorstr="#33000000", GradientType=0);
			animation: tsp_progress_b 2s linear infinite;
			-moz-animation: tsp_progress_b 2s linear infinite;
			-webkit-animation: tsp_progress_b 2s linear infinite;
		}
		main.ts_poll_main_613139[data-tsp-veff="8"]  > .ts_poll_answer span.ts_poll_r_progress{
			background-size: 30px 30px;
			-moz-background-size: 30px 30px;
			-webkit-background-size: 30px 30px;
			-o-background-size: 30px 30px;
			background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			background-image: -webkit-gradient(linear, left top, right bottom, color-stop(0%, rgba(255, 255, 255, 0.2)), color-stop(25%, rgba(255, 255, 255, 0.2)), color-stop(25%, rgba(255, 255, 255, 0)), color-stop(50%, rgba(255, 255, 255, 0)), color-stop(50%, rgba(255, 255, 255, 0.2)), color-stop(75%, rgba(255, 255, 255, 0.2)), color-stop(75%, rgba(255, 255, 255, 0)), color-stop(100%, rgba(255, 255, 255, 0)));
			background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			box-shadow: 0 5px 5px rgba(255, 255, 255, 0.6) inset, 0 -5px 7px rgba(0, 0, 0, 0.4) inset;
			-moz-box-shadow: 0 5px 5px rgba(255, 255, 255, 0.6) inset, 0 -5px 7px rgba(0, 0, 0, 0.4) inset;
			-webkit-box-shadow: 0 5px 5px rgba(255, 255, 255, 0.6) inset, 0 -5px 7px rgba(0, 0, 0, 0.4) inset;
			filter: progid:-DXImageTransform.Microsoft.gradient(startColorstr="#33ffffff", endColorstr="#33000000", GradientType=0);
			animation: tsp_progress_c 2s linear infinite;
			-moz-animation: tsp_progress_c 2s linear infinite;
			-webkit-animation: tsp_progress_c 2s linear infinite;
		}
		main.ts_poll_main_613139[data-tsp-veff="9"]  > .ts_poll_answer span.ts_poll_r_progress{
			background-size: 30px 30px;
			-moz-background-size: 30px 30px;
			-webkit-background-size: 30px 30px;
			-o-background-size: 30px 30px;
			background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			background-image: -webkit-gradient(linear, left top, right bottom, color-stop(0%, rgba(255, 255, 255, 0.2)), color-stop(25%, rgba(255, 255, 255, 0.2)), color-stop(25%, rgba(255, 255, 255, 0)), color-stop(50%, rgba(255, 255, 255, 0)), color-stop(50%, rgba(255, 255, 255, 0.2)), color-stop(75%, rgba(255, 255, 255, 0.2)), color-stop(75%, rgba(255, 255, 255, 0)), color-stop(100%, rgba(255, 255, 255, 0)));
			background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.15) 25%, rgba(255, 255, 255, 0) 25%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(255, 255, 255, 0) 75%, rgba(255, 255, 255, 0) 100%);
			filter: progid:-DXImageTransform.Microsoft.gradient(startColorstr="#33ffffff", endColorstr="#33000000", GradientType=0);
			animation: tsp_progress_c 2s linear infinite;
			-moz-animation: tsp_progress_c 2s linear infinite;
			-webkit-animation: tsp_progress_c 2s linear infinite;
		}
		@-webkit-keyframes tsp_progress_s {
			0% {
				background-position: 0 0;
			}
			100% {
				background-position: -60px -60px;
			}
		}      
		@-moz-keyframes tsp_progress_s {
			0% {
				background-position: 0 0;
			}
			100% {
				background-position: -60px -60px;
			}
		}      
		@keyframes tsp_progress_s {
			0% {
				background-position: 0 0;
			}
			100% {
				background-position: -60px -60px;
			}
		}      
		@-webkit-keyframes tsp_progress_a {
			0% {
				background-position: 0 0;
			}
			100% {
				background-position: -60px 60px;
			}
		}      
		@-moz-keyframes tsp_progress_a {
			0% {
				background-position: 0 0;
			}
			100% {
				background-position: -60px 60px;
			}
		}      
		@keyframes tsp_progress_a {
			0% {
				background-position: 0 0;
			}
			100% {
				background-position: -60px 60px;
			}
		}      
		@-webkit-keyframes tsp_progress_b {
			0% {
				background-position: 0 0;
			}
			100% {
				background-position: 60px -60px;
			}
		}      
		@-moz-keyframes tsp_progress_b {
			0% {
				background-position: 0 0;
			}
			100% {
				background-position: 60px -60px;
			}
		}      
		@keyframes tsp_progress_b {
			0% {
				background-position: 0 0;
			}
			100% {
				background-position: 60px -60px;
			}
		}      
		@-webkit-keyframes tsp_progress_c {
			0% {
				background-position: 0 0;
			}
			100% {
				background-position: 60px 60px;
			}
		}      
		@-moz-keyframes tsp_progress_c {
			0% {
				background-position: 0 0;
			}
			100% {
				background-position: 60px 60px;
			}
		}      
		@keyframes tsp_progress_c {
			0% {
				background-position: 0 0;
			}
			100% {
				background-position: 60px 60px;
			}
		}
		:root{
					--tsp_a_c_613139-6 : #23a24d;--tsp_a_c_613139-2 : #81d742;--tsp_a_c_613139-3 : #1e73be;--tsp_a_c_613139-5 : #dd3333;--tsp_a_c_613139-7 : #23a24d;--tsp_a_c_613139-8 : #23a24d;--tsp_a_c_613139-1 : #dd9933;--tsp_a_c_613139-4 : #8224e3;--tsp_a_c_613139-9 : #23a24d;
				}
				
								main.ts_poll_main_613139[data-tsp-color="Background"] > .ts_poll_answer[data-tsp-id="6"]{
									background-color: var(--tsp_a_c_613139-6);
								}
								main.ts_poll_main_613139[data-tsp-color="Color"] > .ts_poll_answer[data-tsp-id="6"]   .ts_poll_answer_label{
									color: var(--tsp_a_c_613139-6);
								}
								main.ts_poll_main_613139[data-tsp-voted="Background"] > .ts_poll_answer[data-tsp-id="6"]  span.ts_poll_r_progress{
									background-color: var(--tsp_a_c_613139-6);
								}
								main.ts_poll_main_613139[data-tsp-voted="Color"] > .ts_poll_answer[data-tsp-id="6"]  label.ts_poll_r_label{
									color: var(--tsp_a_c_613139-6);
								}
								
								main.ts_poll_main_613139[data-tsp-color="Background"] > .ts_poll_answer[data-tsp-id="2"]{
									background-color: var(--tsp_a_c_613139-2);
								}
								main.ts_poll_main_613139[data-tsp-color="Color"] > .ts_poll_answer[data-tsp-id="2"]   .ts_poll_answer_label{
									color: var(--tsp_a_c_613139-2);
								}
								main.ts_poll_main_613139[data-tsp-voted="Background"] > .ts_poll_answer[data-tsp-id="2"]  span.ts_poll_r_progress{
									background-color: var(--tsp_a_c_613139-2);
								}
								main.ts_poll_main_613139[data-tsp-voted="Color"] > .ts_poll_answer[data-tsp-id="2"]  label.ts_poll_r_label{
									color: var(--tsp_a_c_613139-2);
								}
								
								main.ts_poll_main_613139[data-tsp-color="Background"] > .ts_poll_answer[data-tsp-id="3"]{
									background-color: var(--tsp_a_c_613139-3);
								}
								main.ts_poll_main_613139[data-tsp-color="Color"] > .ts_poll_answer[data-tsp-id="3"]   .ts_poll_answer_label{
									color: var(--tsp_a_c_613139-3);
								}
								main.ts_poll_main_613139[data-tsp-voted="Background"] > .ts_poll_answer[data-tsp-id="3"]  span.ts_poll_r_progress{
									background-color: var(--tsp_a_c_613139-3);
								}
								main.ts_poll_main_613139[data-tsp-voted="Color"] > .ts_poll_answer[data-tsp-id="3"]  label.ts_poll_r_label{
									color: var(--tsp_a_c_613139-3);
								}
								
								main.ts_poll_main_613139[data-tsp-color="Background"] > .ts_poll_answer[data-tsp-id="5"]{
									background-color: var(--tsp_a_c_613139-5);
								}
								main.ts_poll_main_613139[data-tsp-color="Color"] > .ts_poll_answer[data-tsp-id="5"]   .ts_poll_answer_label{
									color: var(--tsp_a_c_613139-5);
								}
								main.ts_poll_main_613139[data-tsp-voted="Background"] > .ts_poll_answer[data-tsp-id="5"]  span.ts_poll_r_progress{
									background-color: var(--tsp_a_c_613139-5);
								}
								main.ts_poll_main_613139[data-tsp-voted="Color"] > .ts_poll_answer[data-tsp-id="5"]  label.ts_poll_r_label{
									color: var(--tsp_a_c_613139-5);
								}
								
								main.ts_poll_main_613139[data-tsp-color="Background"] > .ts_poll_answer[data-tsp-id="7"]{
									background-color: var(--tsp_a_c_613139-7);
								}
								main.ts_poll_main_613139[data-tsp-color="Color"] > .ts_poll_answer[data-tsp-id="7"]   .ts_poll_answer_label{
									color: var(--tsp_a_c_613139-7);
								}
								main.ts_poll_main_613139[data-tsp-voted="Background"] > .ts_poll_answer[data-tsp-id="7"]  span.ts_poll_r_progress{
									background-color: var(--tsp_a_c_613139-7);
								}
								main.ts_poll_main_613139[data-tsp-voted="Color"] > .ts_poll_answer[data-tsp-id="7"]  label.ts_poll_r_label{
									color: var(--tsp_a_c_613139-7);
								}
								
								main.ts_poll_main_613139[data-tsp-color="Background"] > .ts_poll_answer[data-tsp-id="8"]{
									background-color: var(--tsp_a_c_613139-8);
								}
								main.ts_poll_main_613139[data-tsp-color="Color"] > .ts_poll_answer[data-tsp-id="8"]   .ts_poll_answer_label{
									color: var(--tsp_a_c_613139-8);
								}
								main.ts_poll_main_613139[data-tsp-voted="Background"] > .ts_poll_answer[data-tsp-id="8"]  span.ts_poll_r_progress{
									background-color: var(--tsp_a_c_613139-8);
								}
								main.ts_poll_main_613139[data-tsp-voted="Color"] > .ts_poll_answer[data-tsp-id="8"]  label.ts_poll_r_label{
									color: var(--tsp_a_c_613139-8);
								}
								
								main.ts_poll_main_613139[data-tsp-color="Background"] > .ts_poll_answer[data-tsp-id="1"]{
									background-color: var(--tsp_a_c_613139-1);
								}
								main.ts_poll_main_613139[data-tsp-color="Color"] > .ts_poll_answer[data-tsp-id="1"]   .ts_poll_answer_label{
									color: var(--tsp_a_c_613139-1);
								}
								main.ts_poll_main_613139[data-tsp-voted="Background"] > .ts_poll_answer[data-tsp-id="1"]  span.ts_poll_r_progress{
									background-color: var(--tsp_a_c_613139-1);
								}
								main.ts_poll_main_613139[data-tsp-voted="Color"] > .ts_poll_answer[data-tsp-id="1"]  label.ts_poll_r_label{
									color: var(--tsp_a_c_613139-1);
								}
								
								main.ts_poll_main_613139[data-tsp-color="Background"] > .ts_poll_answer[data-tsp-id="4"]{
									background-color: var(--tsp_a_c_613139-4);
								}
								main.ts_poll_main_613139[data-tsp-color="Color"] > .ts_poll_answer[data-tsp-id="4"]   .ts_poll_answer_label{
									color: var(--tsp_a_c_613139-4);
								}
								main.ts_poll_main_613139[data-tsp-voted="Background"] > .ts_poll_answer[data-tsp-id="4"]  span.ts_poll_r_progress{
									background-color: var(--tsp_a_c_613139-4);
								}
								main.ts_poll_main_613139[data-tsp-voted="Color"] > .ts_poll_answer[data-tsp-id="4"]  label.ts_poll_r_label{
									color: var(--tsp_a_c_613139-4);
								}
								
								main.ts_poll_main_613139[data-tsp-color="Background"] > .ts_poll_answer[data-tsp-id="9"]{
									background-color: var(--tsp_a_c_613139-9);
								}
								main.ts_poll_main_613139[data-tsp-color="Color"] > .ts_poll_answer[data-tsp-id="9"]   .ts_poll_answer_label{
									color: var(--tsp_a_c_613139-9);
								}
								main.ts_poll_main_613139[data-tsp-voted="Background"] > .ts_poll_answer[data-tsp-id="9"]  span.ts_poll_r_progress{
									background-color: var(--tsp_a_c_613139-9);
								}
								main.ts_poll_main_613139[data-tsp-voted="Color"] > .ts_poll_answer[data-tsp-id="9"]  label.ts_poll_r_label{
									color: var(--tsp_a_c_613139-9);
								}
								
				
	:root{
		--tsp_footer_bgc_613139:#ffffff;
	}
	footer.ts_poll_footer_613139{
		width: 100%;
		position:relative;
		padding: 10px;
		background-color: var(--tsp_footer_bgc_613139);
	}
	footer.ts_poll_footer_613139  button{
		display: -ms-inline-flexbox;
		display: -webkit-inline-flex;
		display: inline-flex;
		-webkit-flex-direction: row;
		-ms-flex-direction: row;
		flex-direction: row;
		-webkit-flex-wrap: wrap;
		-ms-flex-wrap: wrap;
		flex-wrap: wrap;
		-webkit-justify-content: center;
		-ms-flex-pack: center;
		justify-content: center;
		-webkit-align-content: center;
		-ms-flex-line-pack: center;
		align-content: center;
		-webkit-align-items: center;
		-ms-flex-align: center;
		align-items: center;
	}
	footer.ts_poll_footer_613139  button[data-tsp-pos="right"]{
		float:right;
	}
	footer.ts_poll_footer_613139  button[data-tsp-pos="left"]{
		float:left;
	}
	footer.ts_poll_footer_613139  button.ts_poll_back_button[data-tsp-pos="right"]{
		margin-left : auto;
	}
	footer.ts_poll_footer_613139  button.ts_poll_back_button[data-tsp-pos="left"]{
		margin-right : auto;
	}
	footer.ts_poll_footer_613139  button[data-tsp-pos="full"]{
		width: 98% !important;
		margin: 5px 1% !important;
	}
	footer.ts_poll_footer_613139 button > i {
		display: -ms-inline-flexbox;
		display: -webkit-inline-flex;
		display: inline-flex;
		-webkit-flex-direction: row;
		-ms-flex-direction: row;
		flex-direction: row;
		-webkit-flex-wrap: nowrap;
		-ms-flex-wrap: nowrap;
		flex-wrap: nowrap;
		-webkit-justify-content: center;
		-ms-flex-pack: center;
		justify-content: center;
		-webkit-align-content: center;
		-ms-flex-line-pack: center;
		align-content: center;
		-webkit-align-items: center;
		-ms-flex-align: center;
		align-items: center;
	}
	footer.ts_poll_footer_613139 button:not([data-tsp-text=""]) > i[data-tsp="before"]:before {
		margin-right: 10px;
	}
	footer.ts_poll_footer_613139 button:not([data-tsp-text=""]) > i[data-tsp="after"]{
		-webkit-flex-direction: row-reverse;
		-ms-flex-direction: row-reverse;
		flex-direction: row-reverse;
	}
	footer.ts_poll_footer_613139 button:not([data-tsp-text=""]) > i[data-tsp="after"]:before {
		margin-left: 10px;
	}
	footer.ts_poll_footer_613139 > div.ts_poll_footer_main{
		position: relative;
		width:100%;
	}
	footer.ts_poll_footer_613139 > div.ts_poll_footer_main > *:not([data-tsp-pos="full"]){
		margin : 0 5px;
	}
	footer.ts_poll_footer_613139 > div.ts_poll_footer_res{
		position: absolute;
		left:0;
		right:0;
		bottom:0;
		top:0;
		background-color: var(--tsp_r_footer_bgc_613139) !important;
		opacity:0;
		z-index:-1;
		display: -ms-flexbox;
		display: -webkit-flex;
		display: flex;
		-webkit-flex-direction: row;
		-ms-flex-direction: row;
		flex-direction: row;
		-webkit-flex-wrap: nowrap;
		-ms-flex-wrap: nowrap;
		flex-wrap: nowrap;
		-webkit-justify-content: center;
		-ms-flex-pack: center;
		justify-content: center;
		padding:7px;
	}
	footer.ts_poll_footer_613139 .ts_poll_vote_button {
		background: var(--tsp_vote_bgc_613139) !important;
		border: var(--tsp_vote_bw_613139) solid var(--tsp_vote_bc_613139) !important;
		border-radius: var(--tsp_vote_br_613139);
		color: var(--tsp_vote_c_613139) !important;
		padding: 3px 10px;
		text-transform: none;
		line-height: 1;
		cursor: pointer;
	}
	footer.ts_poll_footer_613139 .ts_poll_vote_button span {
		font-size: var(--tsp_vote_fs_613139) !important;
		font-family: var(--tsp_vote_ff_613139) !important;
		color: var(--tsp_vote_c_613139) !important;
	}
	footer.ts_poll_footer_613139 .ts_poll_vote_button span:before {
		content:attr(data-tsp-text);
	}
	footer.ts_poll_footer_613139 .ts_poll_vote_button:hover {
		background: var(--tsp_vote_h_bgc_613139) !important;
		opacity: 1;
	}
	footer.ts_poll_footer_613139  .ts_poll_vote_button:hover > .ts_poll_vote_icon:before,
	footer.ts_poll_footer_613139  .ts_poll_vote_button:hover > .ts_poll_vote_icon > span{
		color: var(--tsp_vote_h_c_613139) !important;
	}
	footer.ts_poll_footer_613139  .ts_poll_vote_button > .ts_poll_vote_icon {
		font-size: var(--tsp_vote_icon_fs_613139);
	}
	footer.ts_poll_footer_613139  .ts_poll_vote_button > .ts_poll_vote_icon:before {
		color: var(--tsp_vote_c_613139); 
		font-family: FontAwesome;
	}
	
			:root{
			--tsp_vote_bw_613139:4px;
			--tsp_vote_br_613139:10px;
			--tsp_vote_bc_613139:rgb(89, 38, 253);
			--tsp_vote_fs_613139:14px;
			--tsp_vote_ff_613139:Fira Sans Condensed;
			--tsp_vote_bgc_613139:rgb(89, 38, 253);
			--tsp_vote_c_613139:rgb(255, 255, 255);
			--tsp_vote_h_bgc_613139:rgb(253, 38, 122);
			--tsp_vote_h_c_613139:rgb(255, 255, 255);
			--tsp_vote_icon_fs_613139:20px;
			}
							
			:root{
				--tsp_total_fs_613139:18px;
				--tsp_total_c_613139:rgb(176, 176, 176);
			}
			footer.ts_poll_footer_613139 .ts_poll_total_v {
				font-size: var(--tsp_total_fs_613139) !important;
				color: var(--tsp_total_c_613139) !important;
				padding: 3px 10px !important;
				text-transform: none !important;
				line-height: 1 !important;
				cursor: default;
				display: -ms-inline-flexbox;
				display: -webkit-inline-flex;
				display: inline-flex;
				-webkit-flex-wrap: wrap;
				-ms-flex-wrap: wrap;
				flex-wrap: wrap;
				-webkit-justify-content: center;
				-ms-flex-pack: center;
				justify-content: center;
				-webkit-align-content: center;
				-ms-flex-line-pack: center;
				align-content: center;
				-webkit-align-items: center;
				-ms-flex-align: center;
				align-items: center;
			}
			footer.ts_poll_footer_613139 .ts_poll_total_v span:before{
				content:attr(data-tsp-text);
			}
			footer.ts_poll_footer_613139 .ts_poll_total_v span{
				margin:0 5px;
			}
			footer.ts_poll_footer_613139  .ts_poll_total_v[data-tsp-pos="right"]{
				float: right;
			}
			footer.ts_poll_footer_613139  .ts_poll_total_v[data-tsp-pos="left"]{
				float: left;
			}
			footer.ts_poll_footer_613139  .ts_poll_total_v[data-tsp-pos="full"]{
				width: 98% !important;
				text-align: center;
			}
			footer.ts_poll_footer_613139  .ts_poll_total_v[data-tsp-pos="center"]{
				width: 98% !important;
				text-align: center;
				margin: 5px 1% !important;
			}
			footer.ts_poll_footer_613139  .ts_poll_total_v:not([data-tsp-text=""])[data-tsp-align="after"] {
				vertical-align: middle;
				-webkit-flex-direction: row-reverse;
				-ms-flex-direction: row-reverse;
				flex-direction: row-reverse;
			}
			footer.ts_poll_footer_613139  .ts_poll_total_v:not([data-tsp-text=""])[data-tsp-align="before"] {
				vertical-align: middle;
				-webkit-flex-direction: row;
				-ms-flex-direction: row;
				flex-direction: row;
			}
			
					</style>
					
	<script type="text/javascript">
		let ts_poll_ajax_613139 = "https://www.specnext.com/wp-admin/admin-ajax.php";
    	let tspInterval_for_613139 = null;
    	let tspIntervalFunction_613139 = function(){
    	    if(typeof Vue === "function" && typeof(document.getElementById("ts_poll_form_613139")) != "undefined" && document.getElementById("ts_poll_form_613139") != null && typeof(tsPollData) != "undefined" && tsPollData != null ) {
    	        let ts_poll_app_613139 = new Vue({
    	            el:"#ts_poll_form_613139",
    	            data:{
    	                tsp_answers:"",
    	                tspTotal:"",
    	                tspSceleton: false,
    	                tspMode : "",
    	                tsp_type : "bothlab",
    	                tsp_show : "true",
    	                tsp_result_no : "Thank You !",		
    	            },
    	            methods:{
						tspGetImageSrc(rowIndex,rowId){
							var tspSelf = this;
							if (typeof(document.getElementById(`tspImg613139-${rowId}`)) != "undefined" && document.getElementById(`tspImg613139-${rowId}`) != null) {
								document.getElementById(`tspImg613139-${rowId}`).setAttribute("src", tspSelf["tsp_answers"][rowIndex]["img_src"])
							}
						},
    	                tsPollRun:function(){
    	                    let tspSelf = this;
							fetch(tsPollData.root_url + "ts-poll/v1/render", {
								method: "POST",
								headers: {
									"Content-Type": "application/json",
									"X-WP-Nonce": tsPollData.nonce
								},
								body: JSON.stringify({ poll_id: 1 })
							}).then(response => {
								if (!response.ok) {
									throw new Error("Error: TS Poll loading failed.");
								}
								return response.json();
							}).then(data => {
								if (data.success) {
									tspSelf.tsp_answers = data.answers;
									tspSelf.tspTotal = data.total_votes;
									setTimeout(() => {
										document.getElementById("ts_poll_section_613139").removeAttribute("style");
										tspSelf.tspMode = data.mode;
									}, 100);
								} else {
									alert("Error: TS Poll loading failed.");
								}
							}).catch(error => console.error("Error: TS Poll loading failed."));
							
    	                },
    	                show_results:function(tspAll = false){
    	                    
			jQuery("footer.ts_poll_footer_613139 div.ts_poll_footer_res").css("z-index", "9999").animate({ "opacity": "1" }, 500);
			jQuery("main.ts_poll_main_613139 > div.ts_poll_answer  span.ts_poll_r_block").css("z-index", "1").animate({ "opacity": "1" }, 500);
			setTimeout(() => {
			  jQuery("main.ts_poll_main_613139 > div.ts_poll_answer  span.ts_poll_r_block span.ts_poll_r_progress").each(function () {
				  jQuery(this).animate({ "width": `${jQuery(this).attr("data-tsp-length")}%` }, 1500);
			  });
			}, 500);
		  
    	                    if(tspAll === true){
    	                        document.getElementById("ts_poll_footer_613139").remove();
    	                        
    	                    }
    	                },
    	                hide_results : function(){
    	                    
			jQuery("main.ts_poll_main_613139 > div.ts_poll_answer  span.ts_poll_r_block span.ts_poll_r_progress").each(function () {
				jQuery(this).animate({ "width": 0 }, 500);
			});
			jQuery("footer.ts_poll_footer_613139 div.ts_poll_footer_res").animate({ "opacity": "0" }, 500);
			jQuery("main.ts_poll_main_613139 > div.ts_poll_answer  span.ts_poll_r_block").animate({ "opacity": "0" }, 500);
			setTimeout(() => {
				jQuery("footer.ts_poll_footer_613139 div.ts_poll_footer_res").css("z-index", "-1");
				jQuery("main.ts_poll_main_613139 > div.ts_poll_answer  span.ts_poll_r_block").css("z-index", "-1");
			}, 500);
			
    	                },
    	                vote_function : function(event){
							let tspSelf = this,
								tsp_checked_array = [];
							setTimeout(() => {
								jQuery(`main.ts_poll_main_613139 input[name="ts_poll_all613139"]`).each(function(){
									if(jQuery(this).is(":checked")){
										tsp_checked_array.push(jQuery(this).val());
									}
								});
								if(tsp_checked_array.length === 0 || event.type != "click"){ return; }
								tspSelf.tspSceleton = true;
								fetch(tsPollData.root_url + "ts-poll/v1/vote", {
									method: "POST",
									headers: {
										"Content-Type": "application/json",
										"X-WP-Nonce": tsPollData.nonce
									},
									body: JSON.stringify({ poll_id: 1, checked_answers : tsp_checked_array.join("|") })
								}).then(response => {
									if (!response.ok) {
										throw new Error("Error: TS Poll vote failed.");
									}
									return response.json();
								}).then(data => {
									if (data.success) {
										tspSelf.tsp_answers = data.answers;
										
			tspSelf.tspSceleton = false;
			jQuery("form.ts_poll_form_613139 footer").remove();
			tspSelf.show_results();
		
									} else {
										console.error("Error: TS Poll vote failed.");
									}
								}).catch(error => console.error("Error: TS Poll vote failed."));
							}, 100);
    	                },
						
		tspCheck : function(changeInput) {},
		
    	                
						
    	            },
    	            created:function(){
    	                 this.tsPollRun();
    	            },
    	            watch: {
    	                tspMode : function(tspNewMode) {
    	                    if (tspNewMode == "end") {
    	                        this.show_results(true);
								
    	                    }else if(tspNewMode == "coming"){
    	                        this.tspSceleton = true;
    	                    }
    	                }
    	            }
    	       	});
    	       clearInterval(tspInterval_for_613139);
    	    }
    	};
		let tspReference_for_613139 = (function tspSameCallFunction_613139() {
    	    tspInterval_for_613139 = setInterval(tspIntervalFunction_613139, 1000);
    		
    		return tspSameCallFunction_613139;
		}());
	</script>
    



<p></p>
]]></description>
      <pubDate>Thu, 01 May 2025 01:04:30 +0000</pubDate>
      <link>https://www.specnext.com/white-next-contest/</link>
      <dc:creator>ZX SPECTRUM NEXT</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4807555689</guid>
    </item>
    <item>
      <title><![CDATA[Reading List 339]]></title>
      <description><![CDATA[<p>This reading list is courtesy of <a href="https://vivaldi.com">Vivaldi browser</a>, who pay me decent money to <a href="https://vivaldi.com/for-a-better-web/">fight for a better web</a> and don’t moan at me for reading all this stuff. We just released <a href="https://vivaldi.com">Vivaldi 7.3</a>, which has Proton VPN integrated into Desktop. So try it, unless you enjoy having a browser that’s like a data-mining tortoise.</p>
<ul>
<li><a href="https://vivaldi.com/blog/8-miriam-suzanne-oddbird-for-a-better-web/">Cascade Layers, Container Queries, Scope and more!</a> – In the 8th episode of the For A Better Web podcast, I chat with Miriam Suzanne, a CSS expert and independent contributor to the CSS Working Group.</li>
<li><a href="https://developer.mozilla.org/en-US/docs/Learn_web_development/Extensions/Forms/Customizable_select">Customizable select elements</a> – MDN docs.</li>
<li><a href="https://www.w3.org/TR/css-forms-1/">CSS Form Control Styling Level 1</a> – this working draft defines various ways of styling form controls and their different parts.</li>
<li><a href="https://developer.chrome.com/blog/carousels-with-css">Carousels with CSS</a> – if you absolutely <em>must</em> use a carousel, do it this way. But remember that the English for “carousel” is “merry-go-fuckyourself” – which is what it says to your users.</li>
<li><a href="https://webkit.org/blog/16547/better-typography-with-text-wrap-pretty/">Better typography with text-wrap pretty</a> – WebKit isn’t the first implementation, but it promises to be the most comprehensive.</li>
<li><a href="https://simonwillison.net/2025/Apr/9/mcp-prompt-injection/">Model Context Protocol has prompt injection security problems</a> by Simon Willison, who is one of the very few people I trust on the subject of AI.</li>
<li><a href="https://ia.net/topics/markdown-and-the-slow-fade-of-the-formatting-fetish">Markdown and the Slow Fade of the Formatting Fetish</a>.</li>
<li><a href="https://webkit.org/blog/16587/item-flow-part-1-a-new-unified-concept-for-layout/">Item Flow, Part 1: A new unified concept for layout</a> – “This article explains what Item Flow is, and its impact on both Flexbox and Grid” by from WebKit team.</li>
<li><a href="https://www.poynter.org/ethics-trust/2025/news-audience-feelings-artificial-intelligence-data/">Audiences are still skeptical about generative AI in the news</a> –  “Nearly half of Americans say they don’t want news from generative artificial intelligence… Twenty percent of people say publishers shouldn’t use AI at all.”</li>
<li><a href="https://www.youtube.com/watch?v=ptXY45HlQ6U">History of the Web: Chris Lilley</a> – Brian Kardell interviews Chris Lilley about his early (pre-W3C) involvement in PNG, CGM, HTML 2; and then some early CSS, SVG and WebFont history.</li>
<li><a href="https://restofworld.org/2025/iphone-apple-sales-china-trump-tariffs/">iPhones were already losing ground in China. Then came Trump’s tariffs</a></li>
<li><a href="https://remysharp.com/2025/04/07/do-politics-belong-at-web-events">Do politics belong at web events?</a> asks Remington Sharp</li>
<li><a href="https://velvetshark.com/ai-company-logos-that-look-like-buttholes">Why do AI company logos look like buttholes?</a> – an in-depth probe into this question</li>
</ul>
]]></description>
      <pubDate>Fri, 11 Apr 2025 12:51:11 +0000</pubDate>
      <link>https://brucelawson.co.uk/2025/reading-list-339/</link>
      <dc:creator>Bruce Lawson&#39;s  personal site</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4786741319</guid>
    </item>
    <item>
      <title><![CDATA[Reading List 338]]></title>
      <description><![CDATA[<p>This reading list is courtesy of <a href="https://vivaldi.com">Vivaldi browser</a>, who pay me decent money to <a href="https://vivaldi.com/for-a-better-web/">fight for a better web</a> and don’t moan at me for reading all this stuff. We just released <a href="https://vivaldi.com">Vivaldi 7.2</a>, which <a href="https://www.theregister.com/2025/03/18/vivaldi_72/">The Register called</a> “noticeably quicker than alternatives including Chrome and Brave”. So try it, unless you enjoy having a browser that’s like a data-mining tortoise.</p>
<ul>
<li><a href="https://open-web-advocacy.org/blog/uk-regulators-final-verdict--apples-browser-engine-ban-harms-competition/">UK Regulator’s Final Verdict: Apple’s Browser Engine Ban Harms Competition</a> – Nearly 4 years after I thought speaking to the CMA about Apple would be a fun lockdown project, a historic decision. We’ve written it up in full, and thanks to all the orgs and individual devs who helped us.</li>
<li><a href="https://www.techrepublic.com/article/news-apple-eu-dma/">EU Cracks Down on Apple for Anti-Competitive Behavior – Here’s What Apple Told Us in Response</a> – TL;DR: “Boo hoo, nasty regulators, poor us, security … sob”</li>
<li><a href="https://remysharp.com/2025/03/08/devs-draw-your-line">Devs: draw your line</a> – Remy Sharp notes “Facebook and TikTok had been given access to read what medication I’m on by the development team responsible for the Pharmacy2U web site.”</li>
<li><a href="https://archive.is/4Vvms">Let’s knock down social media’s walled gardens</a> – Sir Uncle Timbo writes “I envisioned the web as a place for the shared benefit of all — by reclaiming our data we can make that happen”</li>
<li><a href="https://wedistribute.org/2025/03/ghost-activitypub-beta/">Hands on with Ghost’s New ActivityPub Beta</a> The more the merrier in the Social Web!</li>
<li><a href="https://tetralogical.com/blog/2025/03/19/understanding-the-eaa/">Understanding the European Accessibility Act (EAA)</a> by Léonie Watson</li>
<li><a href="https://blogs.windows.com/msedgedev/2025/03/19/minding-the-gaps-a-new-way-to-draw-separators-in-css/">Minding the gaps: A new way to draw separators in CSS</a> – an interesting proposal from the Microsoft CSS folks</li>
<li><a href="https://shkspr.mobi/blog/2025/03/towards-extracting-content-from-an-lcp-protected-epub/">Extracting content from an LCP “protected” ePub</a> – by Terence Eden</li>
<li><a href="https://www.scottohara.me/blog/2025/03/14/popovers.html">Popping preconceived popover ponderings</a> – Scott O’Hara on how the popover attribute is just one ingredient in making accessible popups. It does a lot, but not everything you might need. that’s on purpose.</li>
<li><a href="https://www.girlonthenet.com/osa/">Online Safety Act</a> – In which an ethical erotica producer blocks UK visitors from listening to audio: “As per the Online Safety Act, text is not in scope but audio is. You are legally allowed to read the stories I write here without verifying your age, and I am legally allowed to show them to you … However the UK government has decided that it would be harmful to children if you were also allowed to hear them as audio … Deliberately breaking accessibility features on my website ranks among the most depressing things I have ever done.”</li>
<li><a href="https://open-ui.org/components/future-invokers.explainer/">Invoker Commands Future (Explainer)</a> – outlines potential future enhancements to <a href="https://developer.chrome.com/blog/command-and-commandfor">Invoker Commands</a>.</li>
<li><a href="https://github.com/suitenumerique/docs">Docs: Opensource alternative to Notion or Outline</a> – a collaborative note taking, wiki and documentation platform that scales, “the result of a joint effort led by the French <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f1eb-1f1f7.png" alt="🇫🇷" class="wp-smiley" style="height: 1em; max-height: 1em;"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f956.png" alt="🥖" class="wp-smiley" style="height: 1em; max-height: 1em;"> (DINUM) and German <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f1e9-1f1ea.png" alt="🇩🇪" class="wp-smiley" style="height: 1em; max-height: 1em;"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f968.png" alt="🥨" class="wp-smiley" style="height: 1em; max-height: 1em;"> governments”</li>
<li><a href="https://techcrunch.com/2025/03/13/y-combinator-urges-the-white-house-to-support-europes-digital-markets-act/">Y Combinator urges the White House to support Europe’s Digital Markets Act</a> – “YC argues in the letter that the DMA opens up key avenues to create opportunities for American startups in AI, search, and consumer apps, and prevents Big Tech companies from boxing out smaller ventures.”</li>
<li><a href="https://gizmodo.com/data-broker-brags-about-having-highly-detailed-personal-information-on-nearly-all-internet-users-2000575762">Data Broker Brags About Having Highly Detailed Personal Information on Nearly All Internet Users</a> – “The advertising industry is immensely powerful, and disturbingly opaque.”</li>
<li><a href="https://petition.parliament.uk/petitions/713456">Ban behavioural data extraction for advertising</a> – UK citizens are invited to sign this Parliamentary petition.</li>
<li><a href="https://chriscoyier.net/2025/03/14/google-being-forced-to-sell-chrome-is-not-good-for-the-web/">Google Being Forced To Sell Chrome is Not Good for the Web</a> – “Google does all kinds of shitty stuff. They are surely the worst offenders of user surveillance on the web. Let’s not let them off the hook on that. Let’s see the DOJ get involved in that stuff. But forcing a sale of Chrome is not the way” writes Chris Coyier</li>
<li><a href="https://www.newsguardrealitycheck.com/p/a-well-funded-moscow-based-global ">A well-funded Moscow-based global ‘news’ network has infected Western artificial intelligence tools worldwide with Russian propaganda</a> – “An audit found that the 10 leading generative AI tools advanced Moscow’s disinformation goals by repeating false claims from the pro-Kremlin Pravda network 33 percent of the time”</li>
<li><a href="https://github.com/giacomo-b/rust-stakeholder">Become an irreplaceable 10x developer in 30 seconds flat</a> – “Introducing rust-stakeholder – a CLI tool that generates absolutely meaningless but impressive-looking terminal output to convince everyone you’re a coding genius without writing a single line of useful code.”</li>
</ul>
]]></description>
      <pubDate>Fri, 21 Mar 2025 14:04:31 +0000</pubDate>
      <link>https://brucelawson.co.uk/2025/reading-list-338/</link>
      <dc:creator>Bruce Lawson&#39;s  personal site</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4763611472</guid>
    </item>
    <item>
      <title><![CDATA[Blog questions challenge]]></title>
      <description><![CDATA[<p>I'm somewhat frustrated at myself for how long it took me to finish off this post that <a href="https://remysharp.com/2025/02/06/blog-questions-challenge">Remy</a> kindly tagged me in. The last time I participated in something like this was the "<a href="https://ohhelloana.blog/my-typical-day/">My Typical Day</a>" write-up. Reading it now is an interesting stroll down memory lane.</p>
<p>This challenge also reminded me of Manu's wonderful People &amp; Blogs newsletter, which comes out every Friday, and which <a href="https://manuelmoreale.com/pb-ana-rodrigues">I had the privilege of being featured in</a> many weeks ago.</p>
<h2>Why did you start blogging in the first place?</h2>
<p>I started blogging as a pre-teen in the early 2000s. At that time, I was at the peak of my confidence, before the weird teenage years hit. I was already building fan websites, but I wanted to create something personal about myself. I wanted a space where I could share everything I was enjoying at the time.</p>
<p>At that age, the things you like become badges of honor - listing your favorite bands and films was a way of defining your personality and making yourself known to your peers. Having a personal website felt like the perfect way to do this. I felt like the coolest person on the planet because hardly anyone my age knew how to create websites back then.</p>
<p>Throughout the years I always had a blog but it wouldn’t always be the same blog. As I grew I would delete and start again. So I’ve maintained a blog for years but stopped when I got my first job in tech. I picked up blogging again about 10 years ago, and haven’t stopped.</p>
<h2>What platform are you using to manage your blog, and why did you choose it? Have you blogged on other platforms before?</h2>
<p>Currently, I use 11ty because my blog has evolved beyond just a blog - it's become a whole thing. I chose 11ty because I wanted extensive control over the markup, template customization, and being able to add my own features. It's remarkably simple to use and handles everything I throw at it, making it almost fail-proof.</p>
<p>My blogging journey across platforms:</p>
<ul>
<li>Hand made HTML for many years.</li>
<li>Started with Blogspot during university, where I had a surprisingly popular blog in Portuguese documenting my journey through young adulthood, university, and my chaotic love life. It gained thousands of followers through Blogspot's follow feature.</li>
<li>When I returned to blogging around 2014, I started with self-hosted WordPress as I was feeling burned out and needed an easy way back in.</li>
<li>Later moved from WordPress to Jekyll.</li>
<li>Finally settled on 11ty, where I am now.</li>
</ul>
<p>While any blogging platform is fine to use, I personally crave the control over editing templates and customizing features, which is why 11ty works so well for me.</p>
<h2>How do you write your posts?</h2>
<p>I typically start in one of two ways:</p>
<ul>
<li>Open my editor directly.</li>
<li>When frustrated, start in a basic document (like Google Docs) for initial word-vomit drafting.</li>
</ul>
<p>As a non-native English speaker, I spend considerable time reviewing my grammar. I think faster than I type, so I need to ensure my written thoughts are coherent and connected. After editing and reviewing, I copy the content into my editor, usually creating either:</p>
<ul>
<li>A markdown file for simple text posts</li>
<li>An HTML page for posts requiring fancy features</li>
</ul>
<p>I've tried tools like Grammarly but found them unnecessary for my needs. Most often, it's just basic punctuation that needs fixing, which I've gotten better at handling on my own. And now I probably jinxed myself and anyone reading this will find lots of mistakes.</p>
<h2>When do you feel most inspired to write?</h2>
<p>My inspiration usually comes from frustration or when I need to process something in my life. While I wish I could say I had a perfect morning routine (5 AM wake-up, cold shower, coffee while gazing out the window after a morning run), the reality is quite different. Nowadays, most of my writing happens in the evening after spending the whole day processing thoughts and feelings about something. I spend the day mentally chewing on a thought, letting it build up, and then finally sit down to write about it in the evening. It's less about serene inspiration and more about processing emotions and experiences.</p>
<h2>Do you publish immediately after writing, or do you let it simmer as a draft?</h2>
<p>I do both. If it is a technical post, I will post immediately and then crawl back to edit/update it. A personal post I let it sit in the drafts at least overnight and read it the following morning.</p>
<h2>What's your favourite post on your blog?</h2>
<p>My favourite posts are my worst hits. I think my favourite posts also change every once in a while but right now my favourite posts are:</p>
<ul>
<li><a href="https://ohhelloana.blog/my-most-memorable-bad-interview/">My most memorable bad interview</a></li>
<li><a href="https://ohhelloana.blog/on-onion-cutting/">On onion cutting</a></li>
<li><a href="https://ohhelloana.blog/unsolicited-rejection/">Unsolicited rejection</a></li>
</ul>
<p>Ergh, looks like I peaked in 2021.</p>
<h2>Any future plans for your blog? Maybe a redesign, a move to another platform, or adding a new feature?</h2>
<p>Yes, I’m the worst at daydreaming what I would do to my blog if I didn’t have to work and had all the spare time to work on it.</p>
<p>I want to tidy up the layout and do a big code refactor. There’s still code lingering from an automated conversion tool I used from Wordpress to Jekyll from many years ago.</p>
<p>I keep lying to myself and tell myself that I will only day have a fully IndieWeb powered machine thing going on my blog. One day.</p>
<p>I have so much content to update like my blogroll, my bookmarks, talks section and more.</p>
<p>But, in the end, what’s the point of spicing it all up if it leaves me with no time to actually write on it?</p>
<h2>Next?</h2>
<p>I’m aware I’m slow but I love these types of chains. Next, I would tag <a href="https://calumryan.com/">Calum</a>, <a href="https://suze.dev/">Suze</a> and <a href="https://hey.georgie.nu/">Georgie</a>, if they wish to do so.</p>
]]></description>
      <pubDate>Mon, 24 Feb 2025 00:00:00 +0000</pubDate>
      <link>https://ohhelloana.blog/blog-questions-challenge/</link>
      <dc:creator>Ana Rodrigues</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4734047570</guid>
    </item>
    <item>
      <title><![CDATA[Blog Questions Challenge]]></title>
      <description><![CDATA[<p>The latest thing circulating around people still blogging is the Blog Questions Challenge; <a href="https://hicks.design/journal/blog-questions-challenge">Jon</a> did it (and <a href="https://mastodon.social/@jonhicks/113922089500368028">asked if I was</a>) and so have <a href="https://adactio.com/journal/21674">Jeremy</a> and <a href="https://ethanmarcotte.com/wrote/blog-questions-challenge/">Ethan</a> and a bunch of others, so clearly it is time I should get on board, fractionally late as ever.<sup id="sf-blog-questions-challenge-1-back"><a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-1" class="simple-footnote" title="In my defence, it was my birthday.">1</a></sup></p>
<h3>Why did you start blogging in the first place?</h3>
<p>Some other people I admired were doing it. I think the person I was most influenced by to start doing it was <a href="https://simonwillison.net">Simon Willison</a>, who is also still at it<sup id="sf-blog-questions-challenge-2-back"><a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-2" class="simple-footnote" title="although no longer at simon.incutio.com -- what even was Incutio?">2</a></sup>, but a whole bunch of people got on board at around that same time, back in the early days when you be a medium-sized fish in a small pool just by participating. Mark Pilgrim springs to mind as well -- that's a good example of having influence, when the "standard format" of permalinks got sort of hashed out collectively to be <code>/2025/02/03/blog-questions-challenge,</code> which a lot of places still adhere to (although it feels faintly quaint, these days).</p>
<p>Interestingly, a lot of the early posts on this site are short two-sentence half-paragraph things, throwaway thoughts, and that all got sucked up by social media... but social media hadn't been invented, back in 2002.</p>
<p>Also interestingly: the second post on this here blog<sup id="sf-blog-questions-challenge-3-back"><a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-3" class="simple-footnote" title="I resisted the word &quot;blog&quot; for a long time, calling it a &quot;weblog&quot;, and the activity being &quot;weblogging&quot;, because &quot;blog&quot; is such an ugly word. Like most of the fights I was picking in the mid 2000s, this also seems faintly antiquated and passé now. Sic transit gloria mundi and all that.">3</a></sup> was <a href="https://www.kryogenix.org/days/2002/04/21/release/">bitching at Mozilla about the Firefox release schedule</a>. Nothing new under the sun.<sup id="sf-blog-questions-challenge-4-back"><a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-4" class="simple-footnote" title="or &quot;nihil sub sole novum&quot;, since we're doing Latin quotes today">4</a></sup></p>
<h3>What platform are you using to manage your blog and why did you choose it? Have you blogged on other platforms before?</h3>
<p>Cor. When it started, this site was being run by <a href="https://www.kryogenix.org/code/castalian/">Castalian</a>, which was basically "classic ASP but Python instead of VBScript", a thing I built. This is because I was using ASP at work on Windows machines, so that was the model for "dynamic web pages" that I understood, but I wasn't on Windows<sup id="sf-blog-questions-challenge-5-back"><a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-5" class="simple-footnote" title="and Windows's relationship with Python has always been a bit unsteady, although it's better these days now that Microsoft are prepared to acknowledge that other people can have ideas">5</a></sup> and so I built it myself. No idea if it still works and I very much doubt it since it's old enough to buy all the drinks these days.</p>
<p>After that it was <a href="https://en.wikipedia.org/wiki/Movable_Type">Movable Type</a> for a bit and then, because I'd discovered the idea of funky caching<sup id="sf-blog-questions-challenge-6-back"><a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-6" class="simple-footnote" title="you write the pages in an online form, but then a server process builds a static HTML version of them; the advanced version of this where pages were only built on request was called &quot;funky caching&quot; back then">6</a></sup> it was <a href="https://www.kryogenix.org/code/vellum/">Vellum</a>, that model (a) in Python and (b) written by me. <em>Then</em> for a while it was "Thort", which was based on CouchDB<sup id="sf-blog-questions-challenge-7-back"><a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-7" class="simple-footnote" title="if a disinterested observer were to consider this progression, they might unfairly but accurately conclude that whatever this site runs on is basically a half-arsed system I built based on the latest thing I'm interested in, mightn't they?">7</a></sup>, and then it was WordPress, and then in 2014 I <a href="https://www.kryogenix.org/days/2014/02/13/static-electricity/">switched from WP to a static build</a> based on <a href="https://getpelican.com/">Pelican</a>, which it still is to this day. Crikey, that was over ten years ago!<sup id="sf-blog-questions-challenge-8-back"><a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-8" class="simple-footnote" title="tempus fugit. OK, I'll stop now.">8</a></sup> I like static site generators: I even wrote <a href="https://websitesetup.org/best-static-site-generators/">10 Popular Static Site Generators</a> a few years ago for WebsiteSetup which I think is still pretty good.</p>
<h3>How do you write your posts? For example, in a local editing tool, or in a panel/dashboard that’s part of your blog?</h3>
<p>In my text editor, which is <a href="https://www.sublimetext.com/">Sublime Text</a>. The static setup is here on my machine; I write a post, I type <code>make kryogenix</code>, and it runs a whole little series of scripts which invoke Pelican to build the static HTML for the blog, do a few things that I've added (such as add footnote handling<sup id="sf-blog-questions-challenge-9-back"><a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-9" class="simple-footnote" title="like this!">9</a></sup>, make <code>og:image</code> links and images<sup id="sf-blog-questions-challenge-10-back"><a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-10" class="simple-footnote" title="an idea I stole shamelessly from Zach Leatherman">10</a></sup>, and sort of handle webmentions but that's broken at the moment) and then copy it up to my actual website (via git) to be published.</p>
<p>It's all a bit lashed together, to be honest, but this whole website is like that. It is something like an ancient city, such as London or Rome; what this site is mostly built on is the ruins of the previous history of the city. Sometimes the older bits poke through because they're still actually OK, or they never got updated; sometimes they've been replaced with the new shiny. You should see the <code>.htaccess</code> file, which operates a bewildering set of redirects through about six different generations of URLs so <a href="https://www.w3.org/Provider/Style/URI">all the old links still work</a>.<sup id="sf-blog-questions-challenge-11-back"><a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-11" class="simple-footnote" title="Outgoing links are made to continue to work via unrot.link from the excellent Remy Sharp">11</a></sup></p>
<h3>When do you feel most inspired to write?</h3>
<p>When the muse seizes me. Sometimes that's a lot; sometimes not. I do quite a lot of <a href="https://www.kryogenix.org/books/">paid writing</a> as part of my various day jobs for others, and quite a lot of creative writing as part of running a <a href="https://www.youtube.com/@pbproleplaying3278">play-by-post D&amp;D campaign</a>, and that sucks up a reasonable amount of the writing energy, but there are things which just demand going on the website. Normally these days it's things where I want them to be a reference of some kind -- maybe of a useful tech thing, or some important thought, or something interesting -- for myself or for others. </p>
<p>Alternatively you might think the answer is "while in the pub, which leads to making random notes in an email to myself from my phone and then writing a blog post when I get home" and while this is not true, it's not <em>not</em> true either. I do not want to do a histogram of posting times from this site because I am worried that I will find that the majority are at, like, 11.15pm.</p>
<h3>Do you publish immediately after writing, or do you let it simmer a bit as a draft?</h3>
<p>Always post immediately. I have discovered about myself that, for semi-ephemeral stuff like posts here or projects that I do for fun, that I need to get them done as part of that initial burst of inspiration and energy. If I don't get it done, then my enthusiasm will fade and they will linger half-finished for ever and never get completed. I don't necessarily <em>like</em> this, but I've learned to live with it. If I think of an idea for a post and write a note about it and then <em>don't</em> do it, when I rediscover the note a week later it will not seem anything like as compelling. So posts are mostly written as one long stream-of-consciousness to capitalise on the burning of the creative fire before it gets doused by time or work or everything going on in the world. Carpe diem, I guess.<sup id="sf-blog-questions-challenge-12-back"><a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-12" class="simple-footnote" title="I was lying about not doing this any more, obviously">12</a></sup></p>
<h3>What’s your favourite post on your blog?</h3>
<p>Maybe <a href="https://www.kryogenix.org/days/2012/02/04/it-s-cold-outside/">It's Cold Outside</a>, or <a href="https://www.kryogenix.org/days/2012/03/11/monkey-island-2-for-about-the-fifth-time/">Monkey Island 2, for about the fifth time</a>, or <a href="https://www.kryogenix.org/days/2017/10/15/charles-paget-wade-and-the-underthing/">Charles Paget Wade and the Underthing</a> for writing, although each of them have little burrs in the wording that I want to polish when I re-read them. The <a href="https://www.kryogenix.org/days/2025/01/30/forty-nine/">series of birthday posts</a> have been going on since the beginning, one every year, which probably wins for consistency. For technical stuff, maybe <a href="https://www.kryogenix.org/days/2014/05/13/some-thoughts-on-soonsnap-and-little-big-details/">Some thoughts on soonsnap and little big details</a> (now sadly defunct) or <a href="https://www.kryogenix.org/days/2013/06/06/the-thing-and-the-whole-of-the-thing-on-drm-in-html/">The thing and the whole of the thing: on DRM in HTML</a>. I like my own writing, mostly. Arrogant, I know.</p>
<h3>Any future plans for your blog? Maybe a redesign, a move to another platform, or adding a new feature?</h3>
<p>Not really at the moment, but, as above, these things tend to arrive in a blizzard of excitement and implementation and then linger forever once done. But right now... it all seems to work OK. Ask me when I get back from the pub.</p>
<h3>Next?</h3>
<p>Well, I should probably point back at some of the people who inspired me to do this or other things and keep doing so to this day. So <a href="https://simonwillison.net/">Simon</a>, <a href="https://remysharp.com/">Remy</a>, and <a href="https://brucelawson.co.uk/">Bruce</a>, perhaps!</p><ol class="simple-footnotes"><li id="sf-blog-questions-challenge-1">In my defence, it was <a href="https://www.kryogenix.org/days/2025/01/30/forty-nine/">my birthday</a>. <a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-1-back" class="simple-footnote-back">↩</a></li><li id="sf-blog-questions-challenge-2">although no longer at <code>simon.incutio.com</code> -- what even was Incutio? <a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-2-back" class="simple-footnote-back">↩</a></li><li id="sf-blog-questions-challenge-3">I resisted the word "blog" for a <em>long</em> time, calling it a "weblog", and the activity being "weblogging", because "blog" is such an ugly word. Like most of the fights I was picking in the mid 2000s, this also seems faintly antiquated and passé now. Sic transit gloria mundi and all that. <a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-3-back" class="simple-footnote-back">↩</a></li><li id="sf-blog-questions-challenge-4">or "nihil sub sole novum", since we're doing Latin quotes today <a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-4-back" class="simple-footnote-back">↩</a></li><li id="sf-blog-questions-challenge-5">and Windows's relationship with Python has always been a bit unsteady, although it's better these days now that Microsoft are prepared to acknowledge that other people can have ideas <a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-5-back" class="simple-footnote-back">↩</a></li><li id="sf-blog-questions-challenge-6">you write the pages in an online form, but then a server process builds a static HTML version of them; the advanced version of this where pages were only built on request was called "funky caching" back then <a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-6-back" class="simple-footnote-back">↩</a></li><li id="sf-blog-questions-challenge-7">if a disinterested observer were to consider this progression, they might unfairly but accurately conclude that whatever this site runs on is basically a half-arsed system I built based on the latest thing I'm interested in, mightn't they? <a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-7-back" class="simple-footnote-back">↩</a></li><li id="sf-blog-questions-challenge-8">tempus fugit. OK, I'll stop now. <a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-8-back" class="simple-footnote-back">↩</a></li><li id="sf-blog-questions-challenge-9">like this! <a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-9-back" class="simple-footnote-back">↩</a></li><li id="sf-blog-questions-challenge-10">an idea I stole <em>shamelessly</em> from <a href="https://www.zachleat.com/">Zach Leatherman</a> <a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-10-back" class="simple-footnote-back">↩</a></li><li id="sf-blog-questions-challenge-11"><em>Outgoing</em> links are made to continue to work via <a href="https://unrot.link/">unrot.link</a> from the excellent <a href="https://remysharp.com/">Remy Sharp</a> <a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-11-back" class="simple-footnote-back">↩</a></li><li id="sf-blog-questions-challenge-12">I was lying about not doing this any more, obviously <a href="https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/#sf-blog-questions-challenge-12-back" class="simple-footnote-back">↩</a></li></ol>]]></description>
      <pubDate>Mon, 03 Feb 2025 19:17:00 +0000</pubDate>
      <link>https://www.kryogenix.org/days/2025/02/03/blog-questions-challenge/</link>
      <dc:creator>as days pass by</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4711821744</guid>
    </item>
    <item>
      <title><![CDATA[Conference line-ups]]></title>
      <description><![CDATA[

<p>When I was <a href="https://adactio.com/journal/21630">looking back at 2024</a>, I mentioned that I didn’t give a single conference talk (though I did host three conferences—Patterns Day, CSS Day, and UX London).</p>

<p>I <em>almost</em> spoke at a conference though. I was all set to speak at <a href="https://frontmania.com/">an event in the Netherlands</a>. But then the line-up was announced and I was kind of shocked at the lack of representation. <a href="https://frontmania.com/speakers-2024/">The schedule</a> was dominated by white dudes like me. There were just four women in a line-up of 30 speakers.</p>

<p>When I raised my concerns, I was told:</p>

<blockquote>
  <p>We did receive a lot of talks, but almost no women because there are almost no women in this kind of jobs.</p>
</blockquote>

<p>Yikes! I withdrew my participation.</p>

<p>I wish I could say that it was one-off occurrence, but <a href="https://adactio.com/notes/21636">it just happened again</a>.</p>

<p>I was looking forward to speaking at <a href="https://devdays.lt/">DevDays Europe</a>. I’ve never been to Vilnius but I’ve heard it’s lovely.</p>

<p>Now, to be fair, I don’t think <a href="https://events.pinetool.ai/3412/#speakers">the line-up</a> is finalised, but it’s not looking good.</p>

<p>Once again, I raised my concerns. I was told:</p>

<blockquote>
  <p>Unfortunately, we do not get a lot of applications from women and have to work with what we have.</p>
</blockquote>

<p>Even though I knew I was just proving <a href="https://en.wikipedia.org/wiki/Brandolini's_law">Brandolini’s law</a>, I tried to point out the problems with that attitude (while also explaining that I’ve curated many confernce line-ups myself):</p>

<blockquote>
  <p>It’s not really conference curation if you rely purely on whoever happens to submit a proposal. Surely you must accept some responsibility for ensuring a good diverse line-up?</p>
</blockquote>

<p>The response began with:</p>

<blockquote>
  <p>I agree that it’s important to address the lack of diversity.</p>
</blockquote>

<p>…but then went on:</p>

<blockquote>
  <p>I just wanted to share that the developer field as a whole tends to be male-dominated, not just among speakers but also attendees.</p>
</blockquote>

<p>At this point, I’m face-palming. I tried pointing out that there might just be a connection between the make-up of the attendees and the make-up of the speaker line-up. Heck, if <em>I</em> feel uncomfortable attending such a homogeneous conference, imagine what a woman developer would think!</p>

<p>Then they dropped the real clanger:</p>

<blockquote>
  <p>While we always aim for a diverse line-up, our main focus has been on ensuring high-quality presentations and providing the best experience for our audience.</p>
</blockquote>

<p>Double-yikes! I tried to remain calm in my response. I asked them to stop and think about what they were implying. They’re literally setting up a dichotomy between having a <em>diverse</em> line-up and having a <em>good</em> line-up. Like it’s inconceivable you could have both. As though one must come at the expense of the other. Just think about the deeply embedded bias that would enable that kind of worldview.</p>

<p>Needless to say, I won’t be speaking at that event.</p>

<p>This is depressing. It feels like we’re backsliding to what conferences were like 15 years ago.</p>

<p>I can’t help but spot the commonalaties between the offending events. Both of them have multiple tracks. Both of them have a policy of not paying their speakers. Both of them seem to think that opening up a form for people to submit proposals counts as curation. It doesn’t.</p>

<p>Don’t get me wrong. Having a call for proposals is great …as long as it’s part of an overall curation strategy that <em>actually</em> values diversity.</p>

<p>You can submit a proposal to speak at <a href="https://ffconf.org/">FFconf</a>, for example. But <a href="https://remysharp.com/">Remy</a> doesn’t limit his options to what people submit. He puts a lot of work into creating a superb line-up that is always diverse, and always excellent.</p>

<p>By the way, you can also <a href="https://docs.google.com/forms/d/19ZMtwtJsIn9O3rBY6oNgje0MEFdWl40Icd4UimjBrEk/">submit a proposal for UX London</a>. I’ve had lots of submissions so far, but again, I’m not going to limit my pool of potential speakers to just the people who know about that application form. That would be a classic example of <a href="https://en.wikipedia.org/wiki/Streetlight_effect">the streetlight effect</a>:</p>

<blockquote>
  <p>The streetlight effect, or the drunkard’s search principle, is a type of observational bias that occurs when people only search for something where it is easiest to look.</p>
</blockquote>

<p>It’s quite depressing to see this kind of minimal-viable conference curation result in such heavily skewed line-ups. Withdrawing from speaking at those events is literally the least I can do.</p>

<p><a href="https://karolinaszczur.com/journal/conferences-i-wont-be-speaking-at/">I’m with Karolina</a>:</p>

<blockquote>
  <p>What I’m looking for: at least 40% of speakers have to be women speaking on the subject of their expertise instead of being invited to present for the sake of adjusting the conference quotas. I want to see people of colour too. In an ideal scenario, I’d like to see as many gender identities, ethnical backgrounds, ages and races as possible.</p>
</blockquote>


            ]]></description>
      <pubDate>Thu, 16 Jan 2025 14:28:13 +0000</pubDate>
      <link>https://adactio.com/journal/21654</link>
      <dc:creator>Adactio: Journal</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4692398015</guid>
    </item>
    <item>
      <title><![CDATA[A long-awaited talk]]></title>
      <description><![CDATA[

<p>Back in 2019 I had the amazing experience of <a href="https://adactio.com/journal/14821">going to CERN</a> and being part of a team building <a href="https://worldwideweb30.com/">an emulator of the first ever browser</a>.</p>

<p><a href="https://remysharp.com/">Remy</a> was on the team too. He did the heavy lifting of actually making the thing work—quite an achievement in just five days!</p>

<blockquote>
  <p>Coming into this, I thought it was hugely ambitious to try to not only recreate the experience of using the first ever web browser (called WorldWideWeb, later Nexus), but to also try to document the historical context of the time. Now that it’s all done, I’m somewhat astounded that we managed to achieve both.</p>
</blockquote>

<p>Remy and I were both keen to talk about the work, which is why <a href="https://adactio.com/journal/15982">we did a joint talk at Fronteers in Amsterdam that year</a>. We’re both quite sceptical of talks given by duos; people think it means it’ll be half the work, when actually it’s twice the work. In the end we come up with a structure for the talk that we both liked:</p>

<blockquote>
  <p>Now, we could’ve just done everything chronologically, but that would mean I’d do the first half of the talk and Remy would do the second half. That didn’t appeal. And it sounded kind of boring. So then we come up with the idea of interweaving the two timelines.</p>
  
  <p>That worked remarkably well.</p>
</blockquote>

<p>You can <a href="https://vimeo.com/364372321">watch the video</a> of that talk in Amsterdam. You can also <a href="https://adactio.com/articles/15975">read the transcript</a>.</p>

<p>After putting so much work into the talk, we were keen to give it again somewhere. We had the chance to do that <a href="https://www.technottingham.com/events/tech-nottingham-march-2020">in Nottingham in early March 2020</a>. (cue ominous foreboding)</p>

<p>The folks from local Brighton meetup <a href="https://asyncjs.com/">Async</a> had also asked if we wanted to give the talk. We were booked in for <a href="https://asyncjs.com/how-we-built-the-web-in-five-days/">May 2020</a>. (ominous foreboding intensifies)</p>

<p>We all know what happened next. The Situation. Lockdown. No conferences. No meetups.</p>

<p>But technically the talk wasn’t cancelled. It was just postponed. And postponed. And postponed. Before you know it, five years have passed.</p>

<p>Part of the problem was that Async is usually on the first Thursday of the month and that’s when I host <a href="https://thesession.org/sessions/7758">an Irish music session in Hove</a>. I can’t miss that!</p>

<p>But finally the stars aligned and last week <a href="https://asyncjs.com/built-www-in-5-days/">Remy and I finally did the Async talk</a>. You can <a href="https://www.youtube.com/live/XONerj4rE2I?t=448s">watch a video of it</a>.</p>

<p>I really enjoyed giving the talk and the discussion that followed. There was a good buzz.</p>

<p>It also made me appreciate the work that we put into stucturing the talk. We’ve only given it a few times but with a five year gap between presentations, I can confidentally say that’s it’s a timeless topic.</p>


            ]]></description>
      <pubDate>Tue, 14 Jan 2025 16:26:34 +0000</pubDate>
      <link>https://adactio.com/journal/21649</link>
      <dc:creator>Adactio: Journal</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4690142706</guid>
    </item>
    <item>
      <title><![CDATA[Train coding]]></title>
      <description><![CDATA[

<p>When <a href="https://adactio.com/journal/21421">I went up to London for the State of the Browser conference last month</a>, I shared the train journey with <a href="https://remysharp.com/">Remy</a>.</p>

<p>I always like getting together with Remy. We usually end up discussing sci-fi books we’re reading, commiserating with one another about conference-organising, discussing the minutiae of browser APIs, or talking about the big-picture vision of the World Wide Web.</p>

<p>On this train ride we ended up talking about the march of time and how death comes for us all …and our websites.</p>

<p>Take <a href="https://thesession.org/">The Session</a>, for example. It’s been running for two and a half decades in one form or another. I plan to keep it running for many more decades to come. But I’m the weak link in that plan.</p>

<p>If I get hit by a bus tomorrow, The Session will keep running. The hosting is paid up for a while. The domain name is registered for as long as possible. But inevitably things will need to be updated. Even if no new features get added to the site, someone’s got to install updates to keep the underlying software safe and secure.</p>

<p>Remy and I discussed the long-term prospects for widening out the admin work to more people. But we also discussed smaller steps I could take in the meantime.</p>

<p>Like, there’s the actual content of the website. Now, I currently share <a href="https://github.com/adactio/thesession-data">exports from the database every week</a> in JSON, CSV, and SQLite. That’s good. But you need to be tech nerd to do anything useful with that data.</p>

<p>The more I talked about it with Remy, the more I realised that HTML would be the most useful format for the most people.</p>

<p>There’s a cute acronym in the world of digital preservation: LOCKSS. Lots Of Copies Keep Stuff Safe. If there were multiple copies of The Session’s content out there in the world, then I’d have a nice little insurance policy against some future catastrophe befalling the live site.</p>

<p>With the seed of the idea planted in my head, I waited until I had some time to dive in and see if this was doable.</p>

<p>Fortunately I had plenty of opportunity to do just that on some other train rides. When I was <a href="https://adactio.com/journal/21481">in Spain and France recently</a>, I spent hours and hours on trains. For some reason, I find train journeys very conducive to coding, especially if you don’t need an internet connection.</p>

<p>By the time I was back home, the code was done. Here’s the result:</p>

<p><a href="https://github.com/adactio/TheSession-archive">The Session archive</a>: a static copy of the content on thesession.org.</p>

<p>If you want to grab a copy for yourself, go ahead and <a href="https://github.com/adactio/TheSession-archive/archive/refs/heads/main.zip">download this .zip file</a>. Be warned that it’s quite large! The .zip file is over two gigabytes in size and the unzipped collection of web pages is almost ten gigabytes. I plan to update the content every week or so.</p>

<p>I’ve put a copy up on Netlify and I’m serving it from the subdomain <a href="https://archive.thesession.org/">archive.thesession.org</a> if you want to check out the results without downloading the whole thing.</p>

<p>Because this is a collection of static files, there’s no search. But you can use your browser’s “Find in Page” feature to search within the (very long) index pages of each section of the site.</p>

<p>You don’t need to a web server to click around between the pages: they should all work straight from your file system. Double-clicking any HTML file should give a starting point.</p>

<p>I wanted to reduce the dependencies on each page to as close to zero as I could. All the CSS is embedded in the the page. Likewise with most of the JavaScript (you’ll still need an internet connection to get audio playback and dynamic maps). This keeps the individual pages nice and self-contained. That means they can be shared around (as an email attachment, for example).</p>

<p><a href="https://thesession.org/discussions/49638">I’ve shared this project with the community on The Session</a> and people are into it. If nothing else, it could be handy to have an offline copy of the site’s content on your hard drive for those situations when you can’t access the site itself.</p>


            ]]></description>
      <pubDate>Mon, 14 Oct 2024 14:50:32 +0000</pubDate>
      <link>https://adactio.com/journal/21489</link>
      <dc:creator>Adactio: Journal</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4596076404</guid>
    </item>
    <item>
      <title><![CDATA[The selectmenu Element is No More…Long Live select!]]></title>
      <description><![CDATA[
<p>I was looking over <a href="https://css-tricks.com/the-selectmenu-element/">an older article Patrick Brosset penned for us</a> introducing <code>&lt;selectmenu&gt;</code>, a new proposal at the time for a more style-able cousin to <code>&lt;select&gt;</code>. From there, I clicked the linked-up <code>&lt;selectmenu&gt;</code> <a href="https://open-ui.org/components/select" rel="noopener">explainer</a> and got… this:</p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="2226" height="1550" src="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/09/Screenshot-2024-09-20-at-10.55.41 AM.png?resize=2226%2C1550&amp;ssl=1" alt="" class="wp-image-381135" srcset="https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/09/Screenshot-2024-09-20-at-10.55.41 AM.png?w=2226&amp;ssl=1 2226w, https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/09/Screenshot-2024-09-20-at-10.55.41 AM.png?resize=300%2C209&amp;ssl=1 300w, https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/09/Screenshot-2024-09-20-at-10.55.41 AM.png?resize=1024%2C713&amp;ssl=1 1024w, https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/09/Screenshot-2024-09-20-at-10.55.41 AM.png?resize=768%2C535&amp;ssl=1 768w, https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/09/Screenshot-2024-09-20-at-10.55.41 AM.png?resize=1536%2C1070&amp;ssl=1 1536w, https://i0.wp.com/css-tricks.com/wp-content/uploads/2024/09/Screenshot-2024-09-20-at-10.55.41 AM.png?resize=2048%2C1426&amp;ssl=1 2048w" sizes="(min-width: 735px) 864px, 96vw"></figure>



<p>OK, <a href="https://remysharp.com/2023/12/04/unrot-that-link" rel="noopener">link rot</a> is a thing and happens all the time. Perhaps the site needs a little <a href="https://blog.jim-nielsen.com/2023/examples-of-great-urls/" rel="noopener">URL designing</a>? But no, it’s not that at all. I searched a bit and found <a href="https://thathtml.blog/2024/09/new-select-styling-proposal/" rel="noopener">Jared White’s post</a> saying that <code>&lt;selectmenu&gt;</code> is no more, which came by way of <a href="https://developer.chrome.com/blog/rfc-customizable-select" rel="noopener">Una’s post over at the Chrome Developer Blog</a> seeking feedback on a “customizable select”. And <a href="https://nerdy.dev/custom-select-with-transitions-boilerplate" rel="noopener">Adam Argyle’s got a wonderful demo dedicated to it</a>, no surprise there.</p>



<span id="more-381134"></span>



<p>I’m only sharing the links for now but plan to spend some time with it and jot down notes on <a href="https://open-ui.org/components/customizableselect/" rel="noopener">Open UI’s new page</a> for the Customizable <code>&lt;select&gt;</code>. I enjoyed looking at <a href="https://nerdy.dev/custom-select-with-transitions-boilerplate#the-boilerplate" rel="noopener">the boilerplate from Adam’s demo</a> as a first glance:</p>



<pre rel="CSS" class="wp-block-csstricks-code-block language-css" data-line=""><code markup="tt">select {
  &amp;, &amp;::picker(select) {
    appearance: base-select;
  }
  
  &amp;::picker(select) {
    transition: 
      display allow-discrete 1s, 
      opacity 1s, 
      overlay 1s allow-discrete
    ;
  }
  
  &amp;:not(:open)::picker(select) {
    opacity: 0;
  }
  
  &amp;:open::picker(select) {
    opacity: 1;
    
    @starting-style {
      opacity: 0;
    }
  }
}</code></pre>



<p>I see the <code>::picker(select)</code> there that’s driving all of it. If I sneak a peek at Una’s post, I see that there are more ways to select different <code>&lt;select&gt;</code> parts, including:</p>



<ul class="wp-block-list">
<li><code>&lt;selectedoption&gt;</code> (the current selection)</li>



<li><code>&lt;option&gt;</code> (which now accepts HTML in between the tags!)
<ul class="wp-block-list">
<li><code>option::before</code></li>



<li><code>option:checked</code> (a little confusion here with the selected option)</li>
</ul>
</li>



<li><code>&lt;button&gt;</code> (the little chevron arrow marker thingy)</li>
</ul>



<p>So, perhaps Chrome is more of a fan of extending the native <code>&lt;select&gt;</code> with additional CSS features for selecting the existing parts rather than moving forward with a completely new element. That’s cool, as one of Una’s demos shows how we still get the default <code>&lt;select&gt;</code> behavior even if a browser does not support the new selectors.</p>



<div class="wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper"><iframe id="cp_embed_YzoBJRZ" src="//codepen.io/anon/embed/YzoBJRZ?height=450&amp;theme-id=1&amp;slug-hash=YzoBJRZ&amp;default-tab=result" height="450" scrolling="no" frameborder="0" allowfullscreen="" allowpaymentrequest="" name="CodePen Embed YzoBJRZ" title="CodePen Embed YzoBJRZ" class="cp_embed_iframe" style="width:100%;overflow:hidden">CodePen Embed Fallback</iframe></div>
<hr>
<p><small><a rel="nofollow" href="https://css-tricks.com/the-selectmenu-element-is-no-morelong-live-select/">The selectmenu Element is No More…Long Live select!</a> originally published on <a rel="nofollow" href="https://css-tricks.com">CSS-Tricks</a>, which is part of the <a href="https://try.digitalocean.com/css-tricks/?utm_medium=rss&amp;utm_source=css-tricks.com&amp;utm_campaign=family_&amp;utm_content=">DigitalOcean</a> family. You should <a href="https://css-tricks.com/newsletters/">get the newsletter</a>.</small></p><small>
</small>]]></description>
      <pubDate>Mon, 23 Sep 2024 15:43:05 +0000</pubDate>
      <link>https://css-tricks.com/the-selectmenu-element-is-no-morelong-live-select/</link>
      <dc:creator>CSS-Tricks</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4575949839</guid>
    </item>
    <item>
      <title><![CDATA[Back from ffconf – And Why We Need Events like This]]></title>
      <description><![CDATA[
        
          
                              <p><a href="https://ffconf.org/history/">ffconf</a> is an event in Brighton founded and organised by <a href="https://remysharp.com/">Remy Sharp</a> and his wife <a href="https://twitter.com/julieanne">Julie Sharp</a>. I know both for a long time and we share a lot of common things when it comes to running events. We run events, because we <strong>love</strong> running those and bringing people together for which we curate a set of speakers for a certain amount of time. In their case for one day at beginning of November. Julie and Remy, as well as I, come out of a very tough time for event organisers that don’t take their budgets out of a companies yearly marketing budget. We rely on people buying tickets and partnerships with companies who like what we do, who see a sense in sponsoring as they might have a benefit and who keep our events alive with their money.</p>
<p>What makes events like ffconf so important for me is not only the personal curation and with this often much more interesting talks, but also the personal connection people have with those events and the kind of people you meet and are able to exchange with. </p>
<p>Last week Friday, at ffconf, I had so many lovely conversations before, during and after the event that are fantastic input, motivation and thoughts that are different to mine and give me other perspectives. For me personally that is so much value and I hope that events like ffconf stay for a long, long time. What you can do to make sure that this is the case? Well, if you attend events like ffconf, <a href="https://patternsday.com/">Patterns Day</a>, or mine, <a href="https://beyondtellerrand.com">beyond tellerrand</a> you can:</p>
<ul>
<li><strong>Get your tickets early</strong> – organisers need to plan and work with the incoming money</li>
<li><strong>Check their sponsorship prospectus</strong> – often times sponsorship starts at a lower cost than you think and even the smallest packages help big times</li>
<li><strong>Tell other people about it</strong> – there is no big marketing budget, so you, spreading the word, means the world</li>
</ul>
<p>Especially the last part is an investment in the future of these events. </p>
<p>Thanks a lot to Julie, Remy and their team for this years joyful event and in my case also to <a href="https://hachyderm.io/@andydavies">Andy Davies</a>, who made it possible that I could be part.</p>          <a href="mailto:hello@marcthiele.com?subject=My reply to: Back from ffconf – And Why We Need Events like This">Reply via Email</a>
        
      ]]></description>
      <pubDate>Mon, 13 Nov 2023 20:54:00 +0000</pubDate>
      <link>https://marcthiele.com/notes/back-from-ffconf-we-need-these-events</link>
      <dc:creator>Marc Thiele&#39;s Journal</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4570400106</guid>
    </item>
    <item>
      <title><![CDATA[Reading patterns]]></title>
      <description><![CDATA[

<p>I can’t resist bookshelves.</p>

<p>If I’m shown into someone’s home and left alone while the host goes and does something, you can bet I’m going to peruse their bookshelves.</p>

<p>I don’t know why. Maybe I’m looking for points of commonality. “Oh, you read this book too?” Or maybe it’s the opposite, and I’m looking for something new and—pardon the pun—novel. “Oh, that book sounds interesting!”</p>

<p>I like it when people have a kind of bookshelf on their website.</p>

<ul>
<li><a href="https://aworkinglibrary.com/reading/">Mandy’s reading list</a> is always worth browsing.</li>
<li>Remy has <a href="https://remysharp.com/books">a comprehensive record</a> of his reading history.</li>
<li>Maggie has <a href="https://maggieappleton.com/library">her library</a> and <a href="https://maggieappleton.com/antilibrary">her anti-library</a>.</li>
<li>Molly White has <a href="https://www.mollywhite.net/reading/fiction">one shelf for fiction</a> and <a href="https://www.mollywhite.net/reading/nonfiction">another shelf for non-fiction</a>.</li>
</ul>

<p>Here’s <a href="https://adactio.com/notes/reading/">my ad-hoc bookshelf</a>, which is manually mirrored <a href="https://uk.bookshop.org/lists/reading-list">on Bookshop.org</a>.</p>

<p>I like having an overview of what I’ve been reading. One of the reasons I started keeping track was so that I could try to have a nice balance of fiction and non-fiction.</p>

<p>I always get a little sad when I see someone’s online reading list and it only consists of non-fiction books that are deemed somehow useful, rather than simply pleasurable. <a href="https://themaninblue.com/2024/05/27/reading-for-tomorrow/">Cameron wrote about when he used to do this</a>:</p>

<blockquote>
  <p>I felt like reading needed to have some clear purpose. The topic of any book I read needed to directly contribute to being an “adult”. So I started to read non-fiction – stuff that reflected what was happening in my career. Books on management, books on finance, books on economics, books on the creative process. And for many years this diet of dry, literary roughage felt wholesome … but joyless. Each passage I highlited in yellow marker was a point for the scoreboard, not a memory to be treasured.</p>
</blockquote>

<p>Now he’s redressing the imbalance and rediscovering the unique joy of entering other worlds by reading fiction.</p>

<p>For a while, I forced myself to have perfect balance. I didn’t allow myself to read two non-fiction books in a row or two fiction books in a row. I made myself alternate between the two.</p>

<p>I’ve let that lapse now. I’m reading more fiction than non-fiction, and I’m okay with that.</p>

<p>But I still like looking back on <a href="https://adactio.com/notes/reading/">what I’ve been reading</a> and seeing patterns emerge. Like there’s a clear boom in the last year of reading retellings of the Homeric epics (all kicked off by reading the brilliant <cite>Circe</cite> by Madeline Miller).</p>

<p>I also keep an eye out for a different kind of imbalance. I want to make sure that I’m not just reading books by people like me—middle-aged heterosexual white dudes.</p>

<p>You may think that a balanced reading diet would emerge naturally, but I’m not so sure. Here’s <a href="https://www.davidhughes.org/reading/">an online bookshelf</a>. Here’s <a href="https://kevquirk.com/tag:Books">another online bookshelf</a>. Plenty of good stuff in both. But do either of those men realise that they’ve gone more than a year without reading a book written by a woman?</p>

<p>It’s almost certainly not a conscious decision. It’s just that in the society we live in, the default mode tends towards what’s been historically privileged (see also films, music, and painting).</p>

<p>It’s like driving in a car that subtly pulls to one side. Unless you compensate for it, you’ll end up in the ditch without even realising.</p>

<p>I feel bad for calling attention to those two reading lists. It feels very judgy of me. And reading is something that doesn’t deserve judgement. Any reading is good reading.</p>

<p>Mind you, maybe being judgemental is exactly why I’m drawn to people’s bookshelves in the first place. It might be that I’m subsconsciously looking for compatibility signals. If I see a bookshelf filled with books I like, I’m bound to feel predisposed to like that person. And if I see a bookshelf dominated by Jordan Peterson and Ayn Rand, I’m probably going to pass judgement on the reader, even if I know I shouldn’t.</p>


            ]]></description>
      <pubDate>Fri, 31 May 2024 10:04:11 +0000</pubDate>
      <link>https://adactio.com/journal/21175</link>
      <dc:creator>Adactio: Journal</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4469965932</guid>
    </item>
    <item>
      <title><![CDATA[Reading List 315]]></title>
      <description><![CDATA[<ul>
<li><a href="https://www.theregister.com/2024/03/14/brave_mozilla_europe_ios/">Oh look, cracking down on Big Tech works. Brave, Firefox, Vivaldi surge on iOS</a> – “Thanks to Europe forcing Apple to offer a browser choice screen. Now, about ditching WebKit …”</li>
<li><a href="https://nypost.com/2024/03/11/business/apple-ceo-tim-cook-drastically-ramps-up-lobbying-in-washington-as-antitrust-crackdown-looms/">Apple execs and lobbyists — including CEO Tim Cook — visited White House 87 times since Biden took office as antitrust crackdown looms</a></li>
<li><a href="https://tink.uk/nielsen-needs-to-think-again/">Nielsen needs to think again</a> – “Jakob Nielsen thinks accessibility has failed. Jakob Nielsen thinks that generative AI will make my experience better. I think Nielsen needs to think again” by Léonie Watson</li>
<li><a href="https://remysharp.com/2024/02/23/why-my-code-isnt-in-typescript">Why my code isn’t in TypeScript</a> – “I even pay for CoPilot, almost exclusively, to explain TypeScript errors to me (goodness knows what the TypeScript library can’t do a decent job of explaining errors, we devs are suckers for shit tools)”. By Remy Sharp.</li>
<li><a href="https://webaim.org/projects/screenreadersurvey10/">Screen Reader User Survey #10 Results</a> – includes top 10 “gets right on my tits” list of accessibility niggles</li>
<li><a href="https://adactio.com/journal/20911">PageSpeed Insights bookmarklet</a> – by Jeremy Keith</li>
<li><a href="https://jakearchibald.com/2024/view-transitions-handling-aspect-ratio-changes/">View transitions: Handling aspect ratio changes</a> by Jank Architect of Spotify</li>
<li><a href="https://ericportis.com/posts/2024/okay-color-spaces/">Okay, Color Spaces</a> – a brilliant article on what colour spaces mean and why they matter, with a ton of interactive visualisations. By Eric Portis</li>
<li><a href="https://developer.chrome.com/blog/eyeos-journey-to-testing-mv3-service%20worker-suspension?hl=en">Chrome Extensions: eyeo’s journey to testing service worker suspension</a> – “In this post, we delve into the problem of testing extension service workers. In particular, we take a look at how to make sure that our product works correctly in case a service worker gets suspended.”</li>
<li><a href="https://daverupert.com/2024/02/ui-states/">UI = f(statesⁿ)</a> – Dave Rupert explores all the states that can affect the UI layer</li>
<li><a href="https://nuejs.org/blog/tailwind-misinformation-engine/">Tailwind marketing and misinformation engine</a> – “It’s only a matter of time before Tailwind collapses. The vendor-specific language and the misleading communication cannot hold water very long … Learn to write clean HTML and CSS and stay relevant for years to come.”</li>
<li><a href="https://deadsimplesites.com">Dead Simple Sites</a> – The most minimal sites on the web, curated in one place.</li>
</ul>
]]></description>
      <pubDate>Fri, 15 Mar 2024 14:50:19 +0000</pubDate>
      <link>https://brucelawson.co.uk/2024/reading-list-315/</link>
      <dc:creator>Bruce Lawson&#39;s  personal site</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4396393242</guid>
    </item>
    <item>
      <title><![CDATA[Like of https://remysharp.com/2024/02/23/why-my-code-isnt-in-typescript]]></title>
      <description><![CDATA[
    <p>Like of <a href="https://remysharp.com/2024/02/23/why-my-code-isnt-in-typescript">https://remysharp.com/2024/02/23/why-my-code-isnt-in-typescript</a></p>
    
    ]]></description>
      <pubDate>Fri, 23 Feb 2024 20:17:15 +0000</pubDate>
      <link>https://qubyte.codes/likes/1708719435036</link>
      <dc:creator>Qubyte Codes</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4376019404</guid>
    </item>
    <item>
      <title><![CDATA[Adventures in fixing a noisy book]]></title>
      <description><![CDATA[<p>For my daughter, I've been buying second-hand as much as possible. If it can be washed and disinfected, it will be second-hand. She loves noisy books right now, so I've been getting some cheap books from Vinted and charity shops. The other day I found a noisy book in a charity shop for £1, but I couldn't test it. I assumed the batteries had died, so I still bought it. I was right regarding the batteries - they were dead - but after replacing them, I still couldn't get the book to work. I've wanted to learn how to fix small home appliances, so I thought this would be an excellent first project.</p>
<p><img src="https://ohhelloana.blog/assets/posts/fix-noisy-book/unassembled-book.jpeg" alt="Unassembled part of the book which contains the area to press the buttons, chip, batteries and speaker."></p>
<p>I've made quite some mistakes along the way, so I will share them here, hoping that someone does not make them!
The book is now fixed and working, but I did waste some time fixing the wrong things. The first thing I did was search YouTube for videos showing how to fix noisy books. I found two of them, and they were interesting but threw me in the wrong direction. The first video showed how to replace the speaker in a noisy book. Like me, they replaced the batteries, but pressing the buttons still didn't produce any sound, so they showed how to solder a new mini speaker into the book.</p>
<p><img src="https://ohhelloana.blog/assets/posts/fix-noisy-book/soldering-kit.jpeg" alt="My soldering kit and new speaker."></p>
<p>So, of course, that's what I did! I got an intro kit into soldering, bought a mini speaker and began the task of soldering this new speaker. I spent time learning how to do it on YouTube and then tried it. It was not easy, but fascinating. Once that was done, I tested it out, and it was still not working. Bummer.</p>
<p>The second YouTube video showed me someone testing things out and replacing the chip that holds the sounds because the chip was dead. In my head, this made sense. There are only three items here: batteries, chip and speaker. If a new speaker and batteries are in, the problem must be the chip.</p>
<p>Things would get more complicated if it were the chip, but I was keen to learn! But it was time to ask for help. <a href="https://mastodon.social/@ohhelloana/111490313132551193">I tooted on Mastodon asking for help</a> and was reminded that <a href="https://ffconf.org/chat">FFConf's discord server</a> has a hardware help channel.</p>
<p><a href="https://remysharp.com/">Remy</a> asked if I had a multimeter. (which I didn't). He followed:</p>
<blockquote>
<p>"You should have continuity through the speaker if it's working - also useful to test if the voltage is coming in. Since the chip is under a resin blob, it's hard to think the chip is gone/bad, but if that's the case, I'm sure I've seen boards like this on Alix (and I'll take a look for you)."</p>
</blockquote>
<p>I bought a multimeter. A tip shared by <a href="https://sarajoy.dev/">Sarah</a> was to get one that makes beep-beep sounds so that you don't have to look at the screen. At this point, I had exceeded the cost of buying this type of book brand new, but the thought of saving this one from landfill was very exciting.</p>
<p><img src="https://ohhelloana.blog/assets/posts/fix-noisy-book/multimeter-and-book.jpeg" alt="My setup on the table. Ipad with YouTube on, multimeter and noisy book parts."></p>
<p>It was tough to find a YouTube video that showed how to use a multimeter in this scenario, and of course, I wasn't using it right.
Remy very kindly annotated the photo I provided, which helped me understand how to use the multimeter to check for continuity.
All the beep-beep was there, so continuity wasn't an issue. It was time to test the voltage.</p>
<p><img src="https://ohhelloana.blog/assets/posts/fix-noisy-book/voltage-continuity.jpg" alt="Close-up of the chip where there are some annotations of where to test for voltage and continuity. Voltage to be tested on two cables that connect batteries to the chip and continuity to be tested on the two cables that connect speaker to the chip."></p>
<p>There are three batteries, but I was only getting a little over 2V. Remy said that it was too low and should be around 4.5v.
Okay, we're getting somewhere. Using the multimeter, I checked if the batteries were full (they were), and I also took a close-up photo of the battery holder just in case. Remy spotted the culprit quickly. There was some corrosion in the metal. He then dropped pieces of wisdom:</p>
<blockquote>
<p>"This would add resistance and reduce the voltage being delivered. (...) put a very small amount of white vinegar in a pot/glass pot and put in the microwave for about 15 seconds - doesn't need much more. then drop those two metal tabs in there. it should fizz for a bit, it'll remove the corrosion - then dry them off (really well), replace and test. (battery corrosion is alkaline, and vinegar is acid, so mix the two =&gt; water)."</p>
</blockquote>
<p><img src="https://ohhelloana.blog/assets/posts/fix-noisy-book/corrosion-battery.jpg" alt="Close-up of the metal parts in the battery that show a little bit of corrosion."></p>
<p>So I did that. Then, the voltage was over 4v. Then I assembled it all, and it worked!! It worked!! I was over the moon! I was disappointed that I misidentified the cause of the issues but glad I learned something. But most importantly, it is saved from landfill!</p>
<p><img src="https://ohhelloana.blog/assets/posts/fix-noisy-book/assembled-book.jpeg" alt="Book next to assembled speaker, chip and batteries."></p>
<p>After assembled, I fixed the paper with green self adhesive paper I had left over from other crafts.</p>
<p>Thanks Remy and everyone who replied to my toot! I'm super happy I was able to fix this. Also, I was wondering if I could make a custom noisy panel for my girl. Something like a family member's face, and if she presses, something we say plays. That would be cool!</p>
<p>Lessons learned:</p>
<ul>
<li>You can do this!</li>
<li>Don't be afraid to ask for help!</li>
<li>Don't assume the first solution YouTube tells you is the right one if you don't know the basics.</li>
<li>Basics matter!</li>
</ul>
]]></description>
      <pubDate>Wed, 13 Dec 2023 00:00:00 +0000</pubDate>
      <link>https://ohhelloana.blog/fix-noisy-book/</link>
      <dc:creator>Ana Rodrigues</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4306357830</guid>
    </item>
    <item>
      <title><![CDATA[I gave a talk at FFConf!]]></title>
      <description><![CDATA[<p>Two weeks ago, I spoke at <a href="https://2023.ffconf.org/">FFConf</a>. Yes! Me! Last year, I made a little shy appearance in one of <a href="https://localghost.dev/">Sophie's</a> slides, but it was the big deal this year.</p>
<p><img src="https://ohhelloana.blog/assets/posts/ffconf2023/ffconf2022.jpg" alt="Screenshot of my blog on the bottom left corner of Sophie's slides."></p>
<p><a href="https://mastodon.social/@ohhelloana/111171359089249081">I mentioned in a toot</a> a while back how special FFConf is for me. Years ago, my friend <a href="https://paulcuth.me.uk/">Paul</a> told me about it, and it turned out to be a life-changing conference.</p>
<p>I was disheartened with the industry and tech community at the time (I think this was in 2016). The talks I saw and the people I met throughout the years were the inspiration and acceptance I desperately needed to find.</p>
<p>I even found my current job by chatting with people there. Someone told me about this agency, and I should say "hi". I did, and it turns out they were hiring!</p>
<p>As you can imagine, I was over the moon that I was invited to speak there after applying to their call for papers.</p>
<p>The topic was the same as <a href="https://2023.stateofthebrowser.com/">The State of the Browser</a>, but I changed the slides and demo based on feedback received and my own perception after watching the video. I also added a new demo at the end!</p>
<p>One of my last slides was a thank you to one of the talks from the previous years that really moved me at the time. In 2018, <a href="https://tholman.com/">Tim Holman's</a> talk showed us some enjoyable demos. Then he compiled what he learned from building some seemingly "useless things". He ends with "any idea you have has value". So there I was, on a stage, sharing what I learned from building a karaoke in the browser.</p>
<p>Unlike the previous years at FFConf, I was extremely nervous this year. My head was over the place during the day. I was the penultimate speaker, so I could relax and enjoy Salma's talk.</p>
<p>Now, I plan to watch all the videos of the other talks when they come out so that I can properly enjoy them.</p>
<p><a href="https://www.trysmudford.com/">Trys Mudford</a> took <a href="https://www.flickr.com/photos/remysharp/albums/72177720312654713">photos of the day</a> and wrote a lovely recap. So did <a href="https://amyhupe.co.uk/articles/ffconf-2023/">Amy</a> and <a href="https://remysharp.com/2023/11/15/my-experience-of-ffconf-2023">Remy</a>!</p>
<p>This has been one of the highlights of my (quite crappy) year. I hope I contributed to people feeling as happy at the end of the day as I felt all these years as an attendee. Thank you to everyone who came to say hi before and after the talk! My heart is full!</p>
<p><img src="https://ohhelloana.blog/assets/posts/ffconf2023/53328355327_64b929da0b_c.jpg" alt="Me speaking in front of my slides."></p>
<p><img src="https://ohhelloana.blog/assets/posts/ffconf2023/53329689930_cca7d5e883_c.jpg" alt="Group photo with speakers and organisers."></p>
<p>If you saw the talk and have any feedback/criticism/suggestions, please use the form below this post and share it with me. The form won't appear if you're part of the cool people who are reading this via RSS feed hehe.</p>
]]></description>
      <pubDate>Fri, 24 Nov 2023 00:00:00 +0000</pubDate>
      <link>https://ohhelloana.blog/ffconf-2023/</link>
      <dc:creator>Ana Rodrigues</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4288049068</guid>
    </item>
    <item>
      <title><![CDATA[Back from ffconf – Any Why We Need Events like This]]></title>
      <description><![CDATA[
        
          
                              <p><a href="https://ffconf.org/history/">ffconf</a> is an event in Brighton founded and organised by <a href="https://remysharp.com/">Remy Sharp</a> and his wife <a href="https://twitter.com/julieanne">Julie Sharp</a>. I know both for a long time and we share a lot of common things when it comes to running events. We run events, because we <strong>love</strong> running those and bringing people together for which we curate a set of speakers for a certain amount of time. In their case for one day at beginning of November. Julie and Remy, as well as I, come out of a very tough time for event organisers that don’t take their budgets out of a companies yearly marketing budget. We rely on people buying tickets and partnerships with companies who like what we do, who see a sense in sponsoring as they might have a benefit and who keep our events alive with their money.</p>
<p>What makes events like ffconf so important for me is not only the personal curation and with this often much more interesting talks, but also the personal connection people have with those events and the kind of people you meet and are able to exchange with. </p>
<p>Last week Friday, at ffconf, I had so many lovely conversations before, during and after the event that are fantastic input, motivation and thoughts that are different to mine and give me other perspectives. For me personally that is so much value and I hope that events like ffconf stay for a long, long time. What you can do to make sure that this is the case? Well, if you attend events like ffconf, <a href="https://patternsday.com/">Patterns Day</a>, or mine, <a href="https://beyondtellerrand.com">beyond tellerrand</a> you can:</p>
<ul>
<li><strong>Get your tickets early</strong> – organisers need to plan and work with the incoming money</li>
<li><strong>Check their sponsorship prospectus</strong> – often times sponsorship starts at a lower cost than you think and even the smallest packages help big times</li>
<li><strong>Tell other people about it</strong> – there is no big marketing budget, so you, spreading the word, means the world</li>
</ul>
<p>Especially the last part is an investment in the future of these events. </p>
<p>Thanks a lot to Julie, Remy and their team for this years joyful event and in my case also to <a href="https://hachyderm.io/@andydavies">Andy Davies</a>, who made it possible that I could be part.</p>          <a href="mailto:hello@marcthiele.com?subject=My reply to: Back from ffconf – Any Why We Need Events like This">Reply via Email</a>
        
      ]]></description>
      <pubDate>Mon, 13 Nov 2023 20:54:00 +0000</pubDate>
      <link>https://marcthiele.com/notes/back-from-ffconf-we-need-these-events</link>
      <dc:creator>Marc Thiele&#39;s Journal</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4276754712</guid>
    </item>
    <item>
      <title><![CDATA[Back from ffconf – any why we need these events]]></title>
      <description><![CDATA[
        
          
                              <p><a href="https://ffconf.org/history/">ffconf</a> is an event in Brighton founded and organised by <a href="https://remysharp.com/">Remy Sharp</a> and his wife <a href="https://twitter.com/julieanne">Julie Sharp</a>. I know both for a long time and we share a lot of common things when it comes to running events. We run events, because we <strong>love</strong> running those and bringing people together for which we curate a set of speakers for a certain amount of time. In their case for one day at beginning of November. Julie and Remy, as well as I, come out of a very tough time for event organisers that don’t take their budgets out of a companies yearly marketing budget. We rely on people buying tickets and partnerships with companies who like what we do, who see a sense in sponsoring as they might have a benefit and who keep our events alive with their money.</p>
<p>What makes events like ffconf so important for me is not only the personal curation and with this often much more interesting talks, but also the personal connection people have with those events and the kind of people you meet and are able to exchange with. </p>
<p>Last week Friday, at ffconf, I had so many lovely conversations before, during and after the event that are fantastic input, motivation and thoughts that are different to mine and give me other perspectives. For me personally that is so much value and I hope that events like ffconf stay for a long, long time. What you can do to make sure that this is the case? Well, if you attend events like ffconf, <a href="https://patternsday.com/">Patterns Day</a>, or mine, <a href="https://beyondtellerrand.com">beyond tellerrand</a> you can:</p>
<ul>
<li><strong>Get your tickets early</strong> – organisers need to plan and work with the incoming money</li>
<li><strong>Check their sponsorship prospectus</strong> – often times sponsorship starts at a lower cost than you think and even the smallest packages help big times</li>
<li><strong>Tell other people about it</strong> – there is no big marketing budget, so you, spreading the word, means the world</li>
</ul>
<p>Especially the last part is an investment in the future of these events. </p>
<p>Thanks a lot to Julie, Remy and their team for this years joyful event and in my case also to <a href="https://hachyderm.io/@andydavies">Andy Davies</a>, who made it possible that I could be part.</p>          <a href="mailto:hello@marcthiele.com?subject=My reply to: Back from ffconf – any why we need these events">Reply via Email</a>
        
      ]]></description>
      <pubDate>Mon, 13 Nov 2023 20:54:00 +0000</pubDate>
      <link>https://marcthiele.com/notes/back-from-ffconf-we-need-these-events</link>
      <dc:creator>Marc Thiele&#39;s Journal</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4276747398</guid>
    </item>
    <item>
      <title><![CDATA[Indie Web Camp Nuremberg]]></title>
      <description><![CDATA[

<p>After two days at <a href="https://adactio.com/journal/205880">border:none</a> in Nuremberg, it was time for two days at <a href="https://indieweb.org/2023/Nuremberg">Indie Web Camp</a>, also in Nuremberg.</p>

<p>I hadn’t been to an Indie Web Camp since before The Situation. It felt very good to be back. I had almost forgotten how inspiring and productive they can be.</p>

<p>This one had a good turnout of around twenty people. We had ourselves an excellent first day of thought-provoking sessions. Then on day two it was time to put some of those ideas into action.</p>

<p>A little trick I like to do on the practical day is to have two tasks to attempt: one of them quite simple, and the other more ambitious. That way, as long as I get the simpler task done, I’ll always have at least something to demo at the end of the day.</p>

<p>This time I attempted three bits of home improvement on my website.</p>

<h3>Autolinking Mastodon usernames</h3>

<p>The first problem I set myself was ostensibly the simple one. But it involved regular expressions, so then I had two problems.</p>

<p>I wanted to automatically link up Mastodon usernames if I mentioned one in <a href="https://adactio.com/">my notes</a>. For example, during border:none I mentioned <a href="https://suda.co.uk/">Brian</a>’s mastodon username <a href="https://adactio.com/notes/20581">in a note</a>: <a href="https://xn--lofll-1sat.is/@briansuda">@briansuda@loðfíll.is</a>.</p>

<p>That turned out to be an excellent test case. Those Icelandic characters made sure I wasn’t making unwarranted assumptions about character sets.</p>

<p><a href="https://gist.github.com/adactio/1c413e1180f8fd5a795275da348f009d">Here’s the regular expression I came up with</a>. It’s not foolproof by any means. Basically it looks for <code>@something@something.something</code>.</p>

<script src="https://gist.github.com/adactio/1c413e1180f8fd5a795275da348f009d.js"></script>

<p>Good enough. Ship it.</p>

<h3>Related posts</h3>

<p>My next task was a bit more ambitious. It involved SQL queries, something I’m slightly better at than regular expressions but that’s a very low bar.</p>

<p>I wanted to show related posts when you get to the end of one of my blog posts.</p>

<p>I’ve been tagging all my blog posts for years so that’s the mechanism I used for finding similar posts. There’s probably a clever SQL statement that could do this, but I ended up brute-forcing it a bit.</p>

<p>I don’t feel too bad about the hacky clunky nature of my solution, because I cache blog post pages. That means only the first person to view the blog post (usually me) will suffer any performance impacts from my clunky database queries. After that everything’s available straight from a cached file.</p>

<p>Let’s say you’re reading a blog post of mine that I’ve tagged with ten different keywords. I make a separate SQL query for each keyword to get all the other posts that use that tag. Then it’s a matter of sorting through all the results.</p>

<p>I loop through the results of each tag and apply a score to the tagged post. If the post shares one tag with the post you’re looking at, it has a score of one. If it shares two tags, it has a score of two, and so on.</p>

<p>I decided that for a post to be considered related, it had to share at least three tags. I also decided to limit the list of related posts to a maximum of five.</p>

<p>It worked out pretty well. If you scroll down on <a href="https://adactio.com/journal/20551">my recent post about JavaScript</a>, you’ll see links to related posts about JavaScript. If you read through <a href="https://adactio.com/journal/20212">a post on accessibility testing</a>, you’ll find other posts about accessibility testing. If you make it to the end of <a href="https://adactio.com/journal/19831">this post about Mars colonisation</a> you’ll see links to more posts about exploring our solar system.</p>

<p>Right now I’m just doing this for <a href="https://adactio.com/journal">my blog</a> but I’d like to do it for <a href="https://adactio.com/links">my links</a> too. A job for a future Indie Web Camp.</p>

<h3>Link rot</h3>

<p>I was very inspired by Remy’s recent post on how he’s <a href="https://remysharp.com/2023/09/26/no-more-404">tackling link rot</a> on his site. I wanted to do the same for mine.</p>

<p>On the first day at Indie Web Camp I led <a href="https://indieweb.org/2023/Nuremberg/linkrot">a session on link rot</a> to gather ideas and alternative approaches. We had a really good discussion, though it’s always worth bearing in mind that there’ll never be a perfect solution. There’ll always be some false positives and some false negatives.</p>

<p>The other Jeremy at Indie Camp Nuremberg <a href="https://www.jeremycherfas.net/blog/stop-the-linkrot">blogged about the session</a>. Sebastian Greger was attending remotely and the session inspired him to spend the second day <a href="https://sebastiangreger.net/2023/10/link-rot-and-schrodingers-url">also tackling linkrot</a>.</p>

<p>In the end I decided to stick with Remy’s two-pronged approach:</p>

<ol>
<li>a client-side script that—as a progressive enhancement—intercepts outbound links and re-routes them to</li>
<li>a server-side script that redirects to the Internet Archive if the link is broken.</li>
</ol>

<p><a href="https://gist.github.com/adactio/8be51468ff8c9591f9c98e0612bfae16">Here’s the JavaScript I wrote</a> for the first part.</p>

<script src="https://gist.github.com/adactio/8be51468ff8c9591f9c98e0612bfae16.js"></script>

<p>It’s very similar to Remy’s but with one little addition. I check to see if the clicked link is inside an <code>h-entry</code> and if it is, I pass on the date from the post’s <code>dt-published</code> value.</p>

<p><a href="https://gist.github.com/adactio/3d6983bea9b30c993a65b12537ce930c">Here’s the PHP I wrote</a> for the server-side redirector. The comments tell the story of what the code is doing:</p>

<ul>
<li>Check that the request is coming from my site.</li>
<li>There also has to be a URL provided in the query string.</li>
<li>Make a very quick <code>curl</code> request to get the response headers from the URL. The time limit is set to 1 second.</li>
<li>If there was any error (like a time out), give up and go to the URL.</li>
<li>Pick the response headers apart to get the HTTP status code.</li>
<li>If the response is OK, go to the URL.</li>
<li>If the response is a redirect, go around again but this time use the redirect URL.</li>
<li>Construct the archive.org search endpoint.</li>
<li>If we have a date, provide it. Otherwise ask for the latest snapshot.</li>
<li>Ping that archive.org URL. This time there’s no time limit; this might take a while.</li>
<li>If there’s an archived copy, redirect to that.</li>
<li>There’s no archived copy. Give up and go the URL anyway.</li>
</ul>

<p>Not perfect by any means, but it works for the most common cases of link rot.</p>

<p>For the demo at the end of the day I went back into <a href="https://adactio.com/links/archive/">my archive of over 10,000 links</a> and plucked out some old posts, like <a href="https://adactio.com/links/3966">this one from December 2005</a>. It takes a little while to do the rerouting but eventually you get to see the archived version from the same time period as when I linked to it.</p>

<p>Here’s <a href="https://adactio.com/links/4038">another link from 2005</a>. Here’s <a href="https://adactio.com/links/4033">another</a>. Those links are broken now, but with a little patience, you’ll still get to read them on the Internet Archive.</p>

<p>The Internet Archive’s wayback machine really is a gift. I can’t imagine how would it be even remotely possible to try to address link rot on my site without <a href="https://archive.org/">archive.org</a>.</p>

<p>I will continue to <a href="https://archive.org/donate">donate money to the Internet Archive</a> and I encourage you to do the same.</p>


            ]]></description>
      <pubDate>Tue, 31 Oct 2023 15:21:49 +0000</pubDate>
      <link>https://adactio.com/journal/20589</link>
      <dc:creator>Adactio: Journal</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4263636896</guid>
    </item>
    <item>
      <title><![CDATA[No more 404]]></title>
      <description><![CDATA[

<p>I really, really like the progressive enhancement approach that Remy is taking here with outbound links:</p>

<blockquote>
  <p>When a real user clicks on a link, it’s swapped out to be redirected through my own endpoint that checks if the URL is still OK, and if so permanently redirects the visitor, otherwise my endpoint checks the Web Archive for the URL and permanently redirects to that instead.</p>
</blockquote>

<p>I think I’m going to do the same! I’d have to rewrite the server-side code in PHP, but that shouldn’t be too tricky.</p>

<p>This could a project for <a href="https://indieweb.org/2023/Nuremberg">the next Indie Web Camp I attend</a>.</p>

<p><a href="https://adactio.com/links/20509">adactio.com/links/20509</a></p>

            ]]></description>
      <pubDate>Sat, 30 Sep 2023 10:55:31 +0000</pubDate>
      <link>https://remysharp.com/2023/09/26/no-more-404</link>
      <dc:creator>Adactio: Links</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4231031589</guid>
    </item>
    <item>
      <title><![CDATA[The indisputably correct list of the ten best albums ever]]></title>
      <description><![CDATA[<p>Here is the indisputably correct list of the best ten (non-compilation/ Greatest Hits) albums ever, in no particular order.</p>
<ul>
<li><b>"Never Mind The Bollocks Here’s The Sex Pistols"</b>
<p>The lurid, ransom note logo and album cover        by <a href="https://collections.vam.ac.uk/item/O76157/never-mind-the-bollocks-heres-artwork-reid-jamie/">Jamie      Ried</a> (cf my own at the top of this page). The sheer fucking <i>excitement</i> of      the opening of "God Save The Queen" or "Pretty Vacant" makes      this a fantastic album. The opening of "Bodies" still sends a      shiver up my spine.</p>
</li>
<li><b>Blue – Joni Mitchell</b>
<p>Mitchell’s guitar, dulcimer, piano playing is perfect. But it’s the songs that make it: the heart-on-her-sleeve lyrics, the melodies with their key changes. Sublime. Maaaan.</p>
<p></p>
</li>
<li><b>dubnobasswithmyheadman – Underworld</b>
<p>Electronica with real vocals. Dada-esque cut-up lyrics. Dance songs and chill-out songs. I have vivid memories of getting stoned and travelling through the skyscrapers of Bangkok in the back of a taxi listening to this.</p>
</li>
<li><b>Loveless – My Bloody Valentine</b>
<p>What on earth is wrong with this pressing? I asked myself on my 25th birthday as I played my brand new CD. Then every time I listened, I heard new sounds amongst the feedback and gently melodic crooning.</p>
<p></p>
</li>
<li><b>Dark Side of the Moon – Pink Floyd</b>
<p>Nothing to be said that hasn’t already been said. Wonderful, even if it is hippie/ rock shit.</p>
<p></p>
</li>
<li><b>"London Calling" – The Clash </b>
<p>I’ll never forget buying this double album in 1979 for £3.50 (the        same price as a single album) and the first time I played it. It was        the first time I’d heard political music. It was my first exposure to        reggae; I know it was from white boys, but until then I’d only heard        sanitised pop reggae. The Clash just        melted down loads of influences into something amazing. <a href="https://en.wikipedia.org/wiki/London_Calling">The cover</a> is        great – and the <a href="https://en.wikipedia.org/wiki/Elvis_Presley_(album)">Elvis        reference</a> is genius. </p>
</li>
<li><b>The Velvet Underground and Nico – The Velvet Underground</b>
<p>Nothing to be said that hasn’t already been said.</p>
</li>
<li><b>Revolver – The Beatles</b>
<p>It’s got ballads, kids’ songs, psychedelia, string sections. It’s got it all. The latest reissue, remixed into real stereo by Giles Martin, has crystal-clear bass that wasn’t really possible in the 60s (too much bass would cause record player styluses to jump out of the groove) so you can hear McCartney’s genius, and also the non-album single from the same sessions: Paperback Writer and its even more marvellous B-side, Rain, with its backwards vocals, stunning harmonies and bass.</p>
</li>
<li><b>Dummy – Portishead</b>
<p>No-one had ever heard music like this before. Shares in theramins went through the roof.</p>
</li>
<li><b>Blonde on Blonde – Bob Dylan</b>
<p>It’s got loads of great tracks. And “Visions of Johanna”, which is His Bobness’ towering achievement.</p>
</li>
<li>Bonus runner-up: <b>Wrong Way Up – Brian Eno And John Cale</b>
<p>Two geniuses, legendary pioneers of experimental music get together, combining loads of different and unusual instruments and cut-up loops. Instead of some unlistenable avant-garde weirdness, they produce an album of slightly off-kilter pop songs full of melodies and harmony. It initially sounds catchy but slight, and as you listen more, new depths are revealed. The album’s title comes from its song “Empty Frame,” a sea shanty about a cursed ship going around in circles, never returning to port. <a href="https://pitchfork.com/reviews/albums/brian-eno-john-cale-wrong-way-up/">A lost classic</a>.</p>
</li>
</ul>
<p class="post-modified-info">(Last Updated on <time itemprop="dateModified" datetime="2023-08-25T10:38:09+00:00"> 25 August  2023</time>)</p>
]]></description>
      <pubDate>Fri, 14 Jul 2023 11:48:09 +0000</pubDate>
      <link>https://brucelawson.co.uk/2023/indisputably-correct-10-best-albums-ever/</link>
      <dc:creator>Bruce Lawson&#39;s  personal site</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4159184507</guid>
    </item>
    <item>
      <title><![CDATA[A little progress]]></title>
      <description><![CDATA[<p>I’ve got a fairly simple posting interface for <a href="https://adactio.com/notes/">my notes</a>. A small textarea, an optional file upload, some checkboxes for syndicating to <a href="https://twitter.com/adactio">Twitter</a> and <a href="https://flickr.com/photos/adactio">Flickr</a>, and a submit button.</p>

<p><a href="https://dribbble.com/shots/2744316-Notes-posting-interface"><img src="https://d13yacurqjgara.cloudfront.net/users/13/screenshots/2744316/notes-posting-interface.png" alt="Notes posting interface" title=""></a></p>

<p>It works fine although sometimes the experience of uploading a file isn’t great, especially if I’m on a slow connection out and about. I’ve been meaning to add some kind of Ajax-y progress type thingy for the file upload, but never quite got around to it. To be honest, I thought it would be a pain.</p>

<p>But then, in his excellent <a href="https://remysharp.com/2016/05/28/state-of-the-gap">State Of The Gap</a> hit parade of web technologies, Remy included <a href="https://jsbin.com/qefigi/1/edit?js,output">a simple file upload demo</a>. Turns out that all the goodies that have been added to <code>XMLHttpRequest</code> have made this kind of thing pretty easy (and I’m guessing it’ll be easier still once we have <code>fetch</code>).</p>

<p>I’ve made a little script that <a href="https://gist.github.com/adactio/f8046bf3d52b5a08c1541a2b2df70bd8">adds a progress bar to any forms that are POSTing data</a>.</p>

<script src="https://gist.github.com/adactio/f8046bf3d52b5a08c1541a2b2df70bd8.js"></script>

<p>Feel free to use it, adapt it, and improve it. It isn’t using any ES6iness so there are some obvious candidates for improvement there.</p>

<p>It’s working a treat on my little posting interface. Now I can stare at a slowly-growing progress bar when I’m out and about on a slow connection.</p><br><br>]]></description>
      <pubDate>Sun, 29 May 2016 18:51:00 +0000</pubDate>
      <link>https://adactio.com/journal/10728</link>
      <dc:creator>Adactio: Journal</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/4036156460</guid>
    </item>
    <item>
      <title><![CDATA[JavaScript]]></title>
      <description><![CDATA[

<p>A recurring theme in my writing and talks is “lay off the JavaScript, people!” But I have to make a conscious effort to specify that I mean <em>client-side</em> JavaScript.</p>

<p>I thought it would be obvious from the context that I was talking about the copious amounts of JavaScript being shipped to end users to download, parse, and execute. But nothing’s ever really obvious. If I don’t explicitly say JavaScript <em>in the browser</em>, then someone inevitably thinks I’m having a go at JavaScript, <em>the language</em>.</p>

<p>I have absolutely nothing against JavaScript the language. Just like I have nothing against Python or Ruby or any other language that you might write with on your machine or your web server. But as soon as you deliver bytes over the wire, I start having opinions. It just so happens that JavaScript is the universal language for client-side coding so that’s why I call for restraint with JavaScript specifically.</p>

<p>There was a time when JavaScript only existed in web browsers. That changed with Node. Now it’s possible to write code for your web server and code for web browsers using the same language. Very handy!</p>

<p>But just because it’s the same language doesn’t mean you should treat it the same in both circumstance. <a href="https://remysharp.com/2022/10/13/two-javascripts">As Remy puts it</a>:</p>

<blockquote>
  <p>There are two JavaScripts.</p>
  
  <p>One for the server - where you can go wild.</p>
  
  <p>One for the client - that should be thoughtful and careful.</p>
</blockquote>

<p>I was reading something recently that referred to <a href="https://www.11ty.dev/">Eleventy</a> as a JavaScript library. It really brought me up short. I mean, on the one hand, yes, it’s a library of code and it’s written in JavaScript. It is absolutely technically correct to call it a JavaScript library.</p>

<p>But in my mind, a JavaScript library is something you ship to web browsers—jQuery, React, Vue, and so on. Whereas Eleventy executes its code in order to generate HTML and <em>that’s</em> what gets sent to end users. Conceptually, it’s like the opposite of a JavaScript library. Eleventy does its work before any user requests a URL—JavaScript libraries do their work after a user requests a URL.</p>

<p>To me it seems obvious that there should an entirely different mindset for writing code intended for a web browser. But nothing’s ever really obvious.</p>

<p>I remember when Node was getting really popular and <code>npm</code> came along as a way to manage all the bundles of code that people were assembling in their Node programmes. Makes total sense. But then I thought I heard about people using <code>npm</code> to do the same thing for client-side code. “That can’t be right!” I thought. I must’ve misunderstood. So <a href="https://adactio.com/journal/16138">I talked to someone from <code>npm</code></a> and explained how I must be misunderstanding something.</p>

<p>But it turned out that people really were treating client-side JavaScript no different than server-side JavaScript. People really were pulling in megabytes of other people’s code to ship to end users so that they could, I dunno, left pad numbers or something.</p>

<p>Listen, I don’t care what you get up to in the privacy of your own codebase. But don’t poison the well of the web with profligate <em>client-side</em> JavaScript.</p>


            ]]></description>
      <pubDate>Wed, 19 Oct 2022 14:49:06 +0000</pubDate>
      <link>https://adactio.com/journal/19531</link>
      <dc:creator>Adactio: Journal</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/3842470883</guid>
    </item>
    <item>
      <title><![CDATA[Two JavaScripts]]></title>
      <description><![CDATA[

<blockquote>
  <p>There are two JavaScripts.</p>

  <p>One for the server - where you can go wild.</p>

  <p>One for the client - that should be thoughtful and careful.</p>
</blockquote>

<p>Yes! This! I’m always astounded to see devs apply the same mindset to backend and frontend development, just because it happens to be in the same language. I don’t care what you use on your own machine or your own web server, but once you’re sending something down the wire to end users, you need to prioritise their needs over your own.</p>

<blockquote>
  <p>It’s the JavaScript on the client side that’s the problem. What’s given to the visitor.</p>

  <p>I’d ask you, if you’re still reading, that you consider a separation of JavaScript between client and server. If you’re a dev, consider the payload, your bundle and work to reduce the cost to your visitor. Heck, think <em>progressive enhancement</em>.</p>
</blockquote>

<p><a href="https://adactio.com/links/19524">adactio.com/links/19524</a></p>

            ]]></description>
      <pubDate>Thu, 13 Oct 2022 16:17:34 +0000</pubDate>
      <link>https://remysharp.com/2022/10/13/two-javascripts</link>
      <dc:creator>Adactio: Links</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/3834977751</guid>
    </item>
    <item>
      <title><![CDATA[Apple Is Not Defending Browser Engine Choice]]></title>
      <description><![CDATA[
      <p>Gentle reader, I made a terrible mistake. Yes, that's right: I read the comments on <a href="https://www.macrumors.com/2022/06/10/uk-to-target-apple-gaming-and-browser-restrictions/">a MacRumors article</a>. At my age, one knows better. And yet.</p>
<p>As penance for this error, and <a href="https://twitter.com/slightlylate/status/1534223987261157376?s=20&amp;t=Fb70BlpfllEZ6WeQrI16rQ">for being short with Miguel</a>, I must deconstruct the ways Apple has undermined browser engine diversity. Contrary to claims of Apple partisans, iOS engine restrictions are not preventing a "takeover" by Chromium — at least that's not the primary effect. Apple uses its power over browsers to strip-mine and sabotage the web, hurting all engine projects and draining the web of future potential.</p>
<p>As we will see, both the present and future of browser engine choice are squarely within Cupertino's control.</p>
<nav class="table-of-contents"><h4>Contents</h4><ul><li><a href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#apple's-long-standing-policies-are-anti-diversity">Apple's Long-Standing Policies Are Anti-Diversity</a></li><li><a href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#%22webkit-couldn't-compete-if-it-had-to.%22">"WebKit couldn't compete if it had to."</a></li><li><a href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#browsers-are-big-business">Browsers Are Big Business</a></li><li><a href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#webkit-is-no-charity">WebKit Is No Charity</a></li><li><a href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#choices%2C-choices">Choices, Choices</a><ul><li><a href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#recent-developments">Recent Developments</a></li></ul></li><li><a href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#how-apple-gutted-mozilla's-chances">How Apple Gutted Mozilla's Chances</a></li><li><a href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#back-of-the-napkin">Back Of The Napkin</a></li><li><a href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#the-best-kind-of-correct">The Best Kind Of Correct</a></li><li><a href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#what-now%3F">What Now?</a></li></ul></nav>
<h2 id="apple's-long-standing-policies-are-anti-diversity" tabindex="-1"><a class="permalink" href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#apple's-long-standing-policies-are-anti-diversity">Apple's Long-Standing Policies Are Anti-Diversity</a></h2>
<p>A refresher on Apple's iOS browser policies:</p>
<ul>
<li>From <a href="https://en.wikipedia.org/wiki/IPhone_OS_2">iOS 2.0 in '08</a> to <a href="https://en.wikipedia.org/wiki/IOS_14#:~:text=The%20default%20mail%20and%20web%20browser%20apps%20can%20now%20be%20changed">iOS 14 in late '20</a>, Apple would not allow any browser but Safari to be the default.</li>
<li>For 14 years and counting, Apple has prevented competing browsers from bringing their own engines, forcing vendors to build skins over Apple's WebKit binary, which has historically been slower, <a href="https://infrequently.org/2021/08/webkit-ios-deep-dive/#apple's-security-argument">less secure</a>, and <a href="https://infrequently.org/2021/04/progress-delayed/">lacking in features</a>.</li>
<li>Apple will not even allow competing browsers to provide different <a href="https://github.com/WebKit/WebKit/blob/main/Source/WebCore/page/Settings.yaml">runtime flags</a> to WebKit. Instead, Fruit Co. publishes <a href="https://developer.apple.com/documentation/webkit/wkwebviewconfiguration">a paltry set</a> of options that carry an unmistakable odour of first-party app requirements.</li>
<li>Apple continues to self-preference through exclusive <abbr>API</abbr> access for Safari; e.g., the ability to install <abbr title="Progressive Web App">PWA</abbr>s to the home screen, implement media codecs, and much else.</li>
</ul>
<p>Defenders of Apple's monopoly offer hard-to-test claims, but many boil down to the idea that Apple's product is inferior by necessity. This line is frankly insulting to the good people that work on WebKit. They're excellent engineers; some of the best, pound for pound, but there aren't enough of them. And that's a choice.</p>
<h2 id="%22webkit-couldn't-compete-if-it-had-to.%22" tabindex="-1"><a class="permalink" href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#%22webkit-couldn't-compete-if-it-had-to.%22"><em>"WebKit couldn't compete if it had to."</em></a></h2>
<p>Nobody frames it precisely this way; instead they'll say, <q>if WebKit weren't mandated, Chromium would take over,</q> or <q>Google would dominate the web if not for the WebKit restriction.</q> That potential future requires mechanisms of action — something to cause Safari users to switch. What are those mechanisms? And why are some commenters so sure the end is nigh for WebKit?</p>
<p>Recall the status quo: websites can <em>already</em> ask iOS users to download alternative browsers. Thanks to <a href="https://infrequently.org/2021/04/progress-delayed/">(belated) questioning by Congress</a>, they can even be set as the user's default, ensuring a higher probability to generate search traffic and derive associated revenue. None of that hinges on browser engine choice; it's just marketing. At the level of commerce, Apple's capitulation on default browser choice is a big deal, but it falls short of true differentiation.</p>
<p>So, websites can already put up banners asking users to get different browsers, If WebKit is doomed, its failure must lie in other stars; e.g., that Safari's WebKit is inferior to Gecko and Blink.</p>
<p>But the quality and completeness of WebKit is entirely within Apple's control.</p>
<p>Past swings away from <abbr title="operating system">OS</abbr> default browsers happened because alternatives offered <a href="https://www.computerworld.com/article/2567205/mozilla-launches-firefox-1-0-browser.html">new features</a>, <a href="https://www.infoq.com/news/2008/09/google-chrome-perspectives/">better performance</a>, <a href="https://web.dev/browser-sandbox/">improved security</a>, and good site compatibility. These are properties intrinsic to the engine, not just the badge on the bonnet. Marketing and distribution have a role, but in recent browser battles, better engines have powered market shifts.</p>
<p>To truly differentiate and win, competitors must be able to bring their own engines. The leads of <abbr>OS</abbr> incumbents are not insurmountable because browsers are commodities with relatively low switching costs. Better products tend to win, if allowed, and Apple knows it.</p>
<p></p><figure><a href="https://gs.statcounter.com/browser-market-share/desktop/worldwide/#yearly-2009-2022" alt="Destkop <abbr>OS</abbr>es have long created a vibrant market for browser choice, enabling competitors not tied to OS defaults to flourish over the years." target="_blank"><picture style="--lqip: 174819" class="preview">        <source sizes="(max-width: 1200px) 70vw, 600px" srcset="https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/StatCounter-browser-ww-yearly-2009-2022.png&amp;fm=avif&amp;w=3600 2400w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/StatCounter-browser-ww-yearly-2009-2022.png&amp;fm=avif&amp;w=2400 1600w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/StatCounter-browser-ww-yearly-2009-2022.png&amp;fm=avif&amp;w=1800 1200w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/StatCounter-browser-ww-yearly-2009-2022.png&amp;fm=avif&amp;w=1200 800w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/StatCounter-browser-ww-yearly-2009-2022.png&amp;fm=avif&amp;w=900 600w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/StatCounter-browser-ww-yearly-2009-2022.png&amp;fm=avif&amp;w=750 500w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/StatCounter-browser-ww-yearly-2009-2022.png&amp;fm=avif&amp;w=600 400w">      <img src="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/StatCounter-browser-ww-yearly-2009-2022.png" alt="Destkop <abbr>OS</abbr>es have long created a vibrant market for browser choice, enabling competitors not tied to OS defaults to flourish over the years." style="aspect-ratio: 1280 / 720" class="preview" decoding="async" fetchpriority="high">      </picture>          </a>        <figcaption>Destkop <abbr>OS</abbr>es have long created a vibrant market for browser choice, enabling competitors not tied to OS defaults to flourish over the years.</figcaption>      </figure><p></p>
<p>Apple's <a href="https://developer.apple.com/app-store/review/guidelines/#2.5.6">prohibition on iOS browser engine competition</a> has drained the potential of browser choice to deliver improvements. Without the ability to differentiate on features, security, performance, privacy, and compatibility, what's to sell? A slightly different <abbr title="user interface">UI</abbr>? That's meaningful, but identically feeble web features cap the potential of every iOS browser. Nobody can pull ahead, and no product can offer future-looking capabilities that might make the web a more attractive platform.</p>
<p>This is working as intended:</p>
<p></p><figure><a href="https://developer.apple.com/app-store/review/guidelines/#2.5.6" alt="<a href='https://developer.apple.com/app-store/review/guidelines/#2.5.6'>Apple's policies</a> explicitly prevent meaningful competition between browsers on iOS. In 2022, you can have any default you like, as long as it's as buggy as Safari." target="_blank"><picture style="--lqip: 174818" class="preview">        <source sizes="(max-width: 1200px) 70vw, 600px" srcset="https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/apple_2.5.6_highlight.png&amp;fm=avif&amp;w=3600 2400w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/apple_2.5.6_highlight.png&amp;fm=avif&amp;w=2400 1600w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/apple_2.5.6_highlight.png&amp;fm=avif&amp;w=1800 1200w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/apple_2.5.6_highlight.png&amp;fm=avif&amp;w=1200 800w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/apple_2.5.6_highlight.png&amp;fm=avif&amp;w=900 600w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/apple_2.5.6_highlight.png&amp;fm=avif&amp;w=750 500w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/apple_2.5.6_highlight.png&amp;fm=avif&amp;w=600 400w">      <img src="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/apple_2.5.6_highlight.png" alt="<a href='https://developer.apple.com/app-store/review/guidelines/#2.5.6'>Apple's policies</a> explicitly prevent meaningful competition between browsers on iOS. In 2022, you can have any default you like, as long as it's as buggy as Safari." style="aspect-ratio: 717 / 232" class="preview" decoding="async" loading="lazy">      </picture>          </a>        <figcaption><a href="https://developer.apple.com/app-store/review/guidelines/#2.5.6">Apple's policies</a> explicitly prevent meaningful competition between browsers on iOS. In 2022, you can have any default you like, as long as it's as buggy as Safari.</figcaption>      </figure><p></p>
<p>On <abbr>OS</abbr>es with proper browser competition, sites can recommend browsers with engines that cost less to support or unlock crucial capabilities. Major sites asking users to switch can be incredibly effective in aggregate.  Standards support is sometimes offered as a solution, but it's best to think of it as a trailing indicator.<sup class="footnote-ref"><a href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#fn-the-role-of-standards-in-compatibility-1" id="fnref-the-role-of-standards-in-compatibility-1">1</a></sup> Critical capabilities often arrive in just one engine to start with, and developers that need these features may have incentive to prompt users to switch.</p>
<p>Developers are reluctanct to do this, however; turning away users isn't a winning growth strategy, and prompting visitors to switch <a href="https://www.reddit.com/r/webdev/comments/38o43q/psa_if_your_site_uses_the_phrase_this_site_best/">is passé</a>.</p>
<p>Still, <em>in extremis</em>, <a href="https://infrequently.org/2021/04/progress-delayed/">missing features</a> and the <a href="https://www.theregister.com/2021/06/16/apple_safari_indexeddb_bug/">parade of showstopping bugs</a> render some services impossible to deliver. In these cases, suggesting an alternative beats losing users entirely.</p>
<p>But what if there's no better alternative? This is the situation that Apple has engineered on iOS. <em>Cui bono?</em> — who benefits?</p>
<p>All iOS browsers present as Safari to developers. There's no point in recommending a better browser because none is available. The combined mass of all iOS browsing pegged to the trailing edge means that folks <em>must</em> support WebKit or decamp for Apple's App Store, where it hands out capabilities like candy, but at a <a href="https://www.consumercompetitionclaims.com/collective-actions">shocking price</a>.</p>
<p>iOS's mandated inadequacy has convinced some that when engine choice is possible, users will stampede of away from Safari. This would, in turn, cause developers to skimp on testing for Apple's engine, making it inevitable that browsers based on WebKit and other minority engines could not compete. Or so the theory goes.</p>
<p>But is it predestined?</p>
<p>Perhaps some users will switch, but browser market changes take a great deal of time, and Apple enjoys numerous defences.</p>
<p>To the extent that Apple wants to win developers and avoid losing users, it has plenty of time.</p>
<p>It took over five years for Chrome to earn majority share on Windows with a superior product, and there's no reason to think iOS browser share will move faster. Then there's the countervailing evidence from macOS, where Safari manages to do just fine.</p>
<p>Regulatory mandates about engine choice will also take more than a year to come into force, giving Apple plenty of time to respond and improve the competitiveness of its engine. And that's the lower bound.</p>
<p>Apple's <a href="https://infrequently.org/2022/02/minimum-standards/">pattern of malaicious compliance</a> will likely postpone true choice even futher. As Apple fights tooth-and-nail to prevent alternative browser engines, it will try to create ambiguity about vendor's ability to ship their best products worldwide, potentially delaying high-cost investment in ports with uncertain market reach.</p>
<p>Cupertino may also try to create arduous processes that force vendors to individually challenge the lack of each API, one geography at a time. In the best case, time will still be lost to this sort of brinksmanship. This is time that Apple can use to improve WebKit and Safari to be properly competitive.</p>
<p>Why would developers recommend alternatives if Safari adds features, improves security, prioritises performance, and fumigates for showstopping bugs? Remember: developers don't <em>want</em> to prompt users to switch; they only do it under duress. The features and quality of Safari are squarely in Apple's control.</p>
<p>So, given that Apple has plenty of time to catch up, is it a rational business decision to invest enough to compete?</p>
<h2 id="browsers-are-big-business" tabindex="-1"><a class="permalink" href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#browsers-are-big-business">Browsers Are Big Business</a></h2>
<p>Browsers are both big business and industrial-scale engineering projects. Hundreds of folks are needed to implement and maintain a competitive browser with specialisations in nearly every area of computing. World-class experts in graphics, networking, cryptography, databases, language design, <abbr title="virtual machine">VM</abbr> implementation, security, usability (particularly usable security), power management, compilers, fonts, high-performance layout, codecs, real-time media, audio and video pipelines, and per-<abbr>OS</abbr> specialisation are required. And then you need infrastructure; lots of it.</p>
<p>How much does all of this cost? A reasonable floor comes from Mozilla's annual reports. The <a href="https://assets.mozilla.net/annualreport/2020/mozilla-fdn-2020-short-form-0926.pdf">latest consolidated financials (PDF) are from 2020</a> and show that, without marketing expenses, Mozilla spends between $380 and $430 million <abbr>US</abbr> per year on software development. Salaries are the largest category of these costs (~$180-210 million), and Mozilla economises by hiring remote employees paid local market rates, without large bonuses or stock-based compensation.</p>
<p>From this data, we can assume a baseline cost to build and maintain a competitive, cross-platform browser at $450 million per year.</p>
<p>Browser vendors fund their industrial-scale software engineering projects through integrations. Search engines pay browser makers for default placement within their products. They, in turn, make a lot of money because browsers send them <a href="https://www.semrush.com/blog/how-to-use-search-intent-for-your-business/">transactional and commercial intent searches</a> as part of the query stream.</p>
<p>Advertisers bid huge sums to place ads against keywords in these categories. This market, in turn, funds all the <abbr title="research and development">R&amp;D</abbr> and operational costs of search engines, including "traffic acquisition costs" like browser search default deals.<sup class="footnote-ref"><a href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#fn-ex-tac-2" id="fnref-ex-tac-2">2</a></sup></p>
<p>How much money are we talking about? Mozilla's $450 million in annual revenue comes from <a href="https://gs.statcounter.com/browser-market-share/desktop/worldwide">approximately 8% of the desktop market</a> and negligible mobile share. Browsers are big, big business.</p>
<h2 id="webkit-is-no-charity" tabindex="-1"><a class="permalink" href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#webkit-is-no-charity">WebKit Is No Charity</a></h2>
<p>Despite being largely open source, browsers and their engines are not loss leaders.</p>
<p>Safari, in particular, is <em>wildly</em> profitable. <a href="https://www.nytimes.com/2020/10/25/technology/apple-google-search-antitrust.html">The New York Times reported in late 2020</a> that Google now pays Apple between $8-12 billion <em>per year</em> to remain Safari's default search engine, up from $1 billion in 2014. Other estimates put the current payments in the <a href="https://9to5mac.com/2021/08/25/analysts-google-to-pay-apple-15-billion-to-remain-default-safari-search-engine-in-2021/">$15 billion range</a>. What does this almighty torrent of cash buy Google? Searches, preferably of the commercial intent sort.</p>
<p>Mobile <a href="https://www.perficient.com/insights/research-hub/mobile-vs-desktop-usage">accounts for two-thirds of web traffic</a> (or <a href="https://gs.statcounter.com/platform-market-share#monthly-202105-202205">thereabouts</a>), making <a href="https://www.marketingdive.com/news/survey-iphone-owners-spend-more-have-higher-incomes-than-android-users/541008/">outsized iOS adoption among wealthy users</a> particularly salient to publishers and advertisers. Google's payments to Apple are largely driven by the iPhone rather than <a href="https://en.wikipedia.org/wiki/Usage_share_of_operating_systems#Desktop_and_laptop_computers">its niche desktop products</a> where effective browser competition has reduced the influence of Apple's defaults.</p>
<p></p><figure><picture style="--lqip: 457652" class="preview">        <source sizes="(max-width: 1200px) 70vw, 600px" srcset="https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/macOS_share_us_govt_sites.png&amp;fm=avif&amp;w=3600 2400w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/macOS_share_us_govt_sites.png&amp;fm=avif&amp;w=2400 1600w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/macOS_share_us_govt_sites.png&amp;fm=avif&amp;w=1800 1200w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/macOS_share_us_govt_sites.png&amp;fm=avif&amp;w=1200 800w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/macOS_share_us_govt_sites.png&amp;fm=avif&amp;w=900 600w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/macOS_share_us_govt_sites.png&amp;fm=avif&amp;w=750 500w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/macOS_share_us_govt_sites.png&amp;fm=avif&amp;w=600 400w">      <img src="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/macOS_share_us_govt_sites.png" alt="Against considerable competition, Safari was used by 52% of visitors to <abbr>US</abbr> Government websites from macOS devices from <time datetime='2022-03-06'>March 6<sup>th</sup></time> to <time datetime='2022-04-04'>April 4<sup>th</sup>, 2022</time>" style="aspect-ratio: 600 / 380" class="preview" decoding="async" loading="lazy">      </picture>                  <figcaption>Against considerable competition, Safari was used by 52% of visitors to <abbr>US</abbr> Government websites from macOS devices from <time datetime="2022-03-06">March 6<sup>th</sup></time> to <time datetime="2022-04-04">April 4<sup>th</sup>, 2022</time></figcaption>      </figure><p></p>
<br>
<p></p><figure><picture style="--lqip: 457633" class="preview">        <source sizes="(max-width: 1200px) 70vw, 600px" srcset="https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/iOS_share_us_govt_sites.png&amp;fm=avif&amp;w=3600 2400w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/iOS_share_us_govt_sites.png&amp;fm=avif&amp;w=2400 1600w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/iOS_share_us_govt_sites.png&amp;fm=avif&amp;w=1800 1200w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/iOS_share_us_govt_sites.png&amp;fm=avif&amp;w=1200 800w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/iOS_share_us_govt_sites.png&amp;fm=avif&amp;w=900 600w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/iOS_share_us_govt_sites.png&amp;fm=avif&amp;w=750 500w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/iOS_share_us_govt_sites.png&amp;fm=avif&amp;w=600 400w">      <img src="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/iOS_share_us_govt_sites.png" alt="The influence of a dozen years of suppressed browser choice is evident on iOS, where Safari is used 90% of the time. Apple's policies caused Mozilla to delay producing an iOS browser for seven years, and its de minimus iOS share (versus 3.6% on macOS) is a predictable result." style="aspect-ratio: 600 / 380" class="preview" decoding="async" loading="lazy">      </picture>                  <figcaption>The influence of a dozen years of suppressed browser choice is evident on iOS, where Safari is used 90% of the time. Apple's policies caused Mozilla to delay producing an iOS browser for seven years, and its de minimus iOS share (versus 3.6% on macOS) is a predictable result.</figcaption>      </figure><p></p>
<br>
<p></p><figure><picture style="--lqip: 457633" class="preview">        <source sizes="(max-width: 1200px) 70vw, 600px" srcset="https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/visits_by_apple_os_us_govt_sites.png&amp;fm=avif&amp;w=3600 2400w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/visits_by_apple_os_us_govt_sites.png&amp;fm=avif&amp;w=2400 1600w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/visits_by_apple_os_us_govt_sites.png&amp;fm=avif&amp;w=1800 1200w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/visits_by_apple_os_us_govt_sites.png&amp;fm=avif&amp;w=1200 800w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/visits_by_apple_os_us_govt_sites.png&amp;fm=avif&amp;w=900 600w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/visits_by_apple_os_us_govt_sites.png&amp;fm=avif&amp;w=750 500w, https://infrequently.org/.netlify/images?url=/2022/06/apple-is-not-defending-browser-engine-choice/visits_by_apple_os_us_govt_sites.png&amp;fm=avif&amp;w=600 400w">      <img src="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/visits_by_apple_os_us_govt_sites.png" alt="iOS represents 75% of all visits to <abbr>US</abbr> Government websites from Apple <abbr>OS</abbr>es" style="aspect-ratio: 600 / 371" class="preview" decoding="async" loading="lazy">      </picture>                  <figcaption>iOS represents 75% of all visits to <abbr>US</abbr> Government websites from Apple <abbr>OS</abbr>es</figcaption>      </figure><p></p>
<p>Even with Apple's somewhat higher salaries per engineer, the skeleton staffing of WebKit, combined with the easier task of supporting fewer platforms, suggests that Apple is unlikely to spend considerably more than Mozilla does on browser development. In 2014, Apple would have enjoyed a profit margin of 50% if it had spent half a billion on browser engineering. Today, that margin would be 94-97%, depending on which figure you believe for Google's payments.</p>
<p>In absolute terms, that's more profit than Apple makes selling Macs.</p>
<p>Compare Cupertino's 3-6% search revenue reinvestment in the web with Mozilla's near 100% commitment, then recall that Mozilla has consistently delivered a superior engine to more platforms. I don't know what's more embarrassing: that some folks argue with a straight face that Apple is trying hard to build a good browser, or that it is consistently overmatched in performance, security, and compatibility by a plucky non-profit foundation that makes just ~5% of Apple's web revenue.</p>
<h2 id="choices%2C-choices" tabindex="-1"><a class="permalink" href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#choices%2C-choices">Choices, Choices</a></h2>
<p>Steve Jobs launched Safari for Windows in the same <abbr>WWDC</abbr> keynote that unveiled the iPhone.</p>
<p><lite-youtube videoid="eyuvlr9OPfI" videotitle="WWDC 2007 - One More Thing: Safari for Windows" posterloading="lazy">        <a href="https://www.youtube.com/watch?v=eyuvlr9OPfI">WWDC 2007 - One More Thing: Safari for Windows</a>      </lite-youtube></p>
<p>Commenters often fixate on the iPhone's original <a href="https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/ConfiguringWebApplications/ConfiguringWebApplications.html">web-based pitch</a>, but don't give Apple stick for reducing engine diversity by abandoning Windows <a href="https://en.wikipedia.org/wiki/Safari_version_history#Windows">three versions later</a>.</p>
<p>Today, Apple doesn't compete outside its home turf, and when it has agency, it prevents others from doing so. These are not the actions of a firm that is consciously attempting to promote engine diversity. If Apple is an ally in that cause, it is only by accident.</p>
<p>Theories that postulate a takeover by Chromium dismiss Apple's power over a situation it created and recommits to annually through its budgeting process.</p>
<p>This is not a question of resources. Recall that Apple spends <a href="https://www.cnbc.com/2022/01/03/apples-3-trillion-market-cap-shows-value-of-share-buybacks-dividend.html">$85 billion <em>per year</em> on stock buybacks</a><sup class="footnote-ref"><a href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#fn-buybacks-3" id="fnref-buybacks-3">3</a></sup>, <a href="https://www.investopedia.com/articles/markets-economy/091816/aapl-apple-dividend-analysis.asp">$15 billion on dividends</a>, <a href="https://www.macrotrends.net/stocks/charts/AAPL/apple/free-cash-flow">enjoys free cash flow</a> larger than <a href="https://en.wikipedia.org/wiki/List_of_countries_by_government_budget">the annual budgets of 47 nations</a>, and <a href="https://www.macrotrends.net/stocks/charts/AAPL/apple/cash-on-hand">retain tens of billions of dollars of cash on hand</a>.<sup class="footnote-ref"><a href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#fn-apples-cash-drawdown-4" id="fnref-apples-cash-drawdown-4">4</a></sup> And that's to say nothing of Apple's $100+ billion in non-business-related long-term investments.</p>
<p>Even if Safari were a loss leader, Apple would be able to avoid producing a <a href="https://9to5google.com/2022/06/06/chrome-mac-speedometer/">slower</a>, <a href="https://infrequently.org/2021/04/progress-delayed/">stifled</a>, <a href="https://googleprojectzero.blogspot.com/2022/02/a-walk-through-project-zero-metrics.html#h.4ajnbffcm6lj">less secure</a>, <a href="https://www.theregister.com/2021/06/16/apple_safari_indexeddb_bug/">famously buggy</a> engine without breaking the bank.</p>
<p>Apple needs fewer staff to deliver equivalent features because Safari supports fewer <abbr>OS</abbr>es. The necessary investments are also <abbr>R&amp;D</abbr> expenses that receive <a href="https://www.bdo.com/insights/tax/r-d-tax/r-d-tax-credit-faqs-for-large-and-small-businesses">heavy tax advantages</a>. Apple enjoys enviable discounts to produce a credible browser, but <a href="https://httptoolkit.tech/blog/safari-is-killing-the-web/">refuses to do so</a>.</p>
<p>Unlike Microsoft's late and underpowered efforts with <abbr title="Internet Explorer">IE</abbr> 7-11, Safari enjoys tolerable web compatibility, more than 90% share on a popular <abbr>OS<abbr>, and an unheard-of war chest with which to finance a defence. The postulated apocalypse seems far away and entirely within Apple's power to forestall.</abbr></abbr></p>
<h3 id="recent-developments" tabindex="-1"><a class="permalink" href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#recent-developments">Recent Developments</a></h3>
<p>One way to understand the voluntary nature of Safari's poor competitiveness is to put <a href="https://developer.apple.com/documentation/safari-release-notes">Cupertino's recent burst of effort</a> in context.</p>
<p>When regulators and legislators <a href="https://infrequently.org/2021/08/webkit-ios-deep-dive/#apple's-arguments">began asking questions</a> in 2019, a response was required. Following Congress' query about default browser choice, Apple quietly allowed it through iOS 14 (<a href="https://www.theverge.com/2020/9/24/21454861/apple-ios14-iphone-ipad-fix-default-mail-browser">however ham-fistedly</a>) the following year. This underscores Apple's gatekeeper status and the tiny scale of investment required to enable large changes.</p>
<p>In the past six months, the Safari team has gone on a <a href="https://jobs.apple.com/en-us/search?search=webkit&amp;sort=newest">veritable hiring spree</a>. This month's <a href="https://developer.apple.com/videos/play/wwdc2022/10048/"><abbr>WWDC</abbr> announcements</a> showcased returns on that investment. By spending more in response to regulatory pressure, Apple has eviscerated notions that it could not have delivered a safer, more capable, and competitive browser many years earlier.</p>
<p>Safari's incremental headcount allocation has been large compared to the previous size of the Safari team, but in terms of Apple's <abbr title="purchase and loss">P&amp;L</abbr>, it's loose change. Predictably, hiring talent to catch up has come at <a href="https://www.macrotrends.net/stocks/charts/AAPL/apple/gross-profit">no appreciable loss to profitability</a>.</p>
<p>The competitive potential of any browser hinges on headcount, and Apple is not limited in its ability to hire engineering talent. Recent efforts demonstrate that Apple has been able to build a better browser all along and, year after year, chose not to.</p>
<h2 id="how-apple-gutted-mozilla's-chances" tabindex="-1"><a class="permalink" href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#how-apple-gutted-mozilla's-chances">How Apple Gutted Mozilla's Chances</a></h2>
<p>For over a dozen years, setting any browser other than Safari as the iOS default was impossible. This spotted Safari a massive market share head-start. Meanwhile, restrictions on engine choice continue to hamstring competitors, removing arguments for why users should switch. But don't take my word for it; here's the recent <a href="https://www.gov.uk/cma-cases/mobile-ecosystems-market-study#final-report">"UK CMA Final Report on Mobile Ecosystems"</a> summarising submissions by Mozilla and others (pages 154-155):</p>
<blockquote>
<p><strong>5.48</strong>
The WebKit restriction also means that browser vendors that want to use Blink or Gecko on other operating systems have to build their browser on two different browser engines. Several browser vendors submitted that needing to code their browser for both WebKit and the browser engine they use on Android results in higher costs and features being deployed more slowly.</p>
<p><strong>5.49</strong>
Two browser vendors submitted that they do not offer a mobile browser for iOS due to the lack of differentiation and the extra costs, while Mozilla told us that the WebKit restriction delayed its entrance into iOS by around seven years</p>
</blockquote>
<p>That's seven years of marketing, feature iteration, and brand loyalty that Mozilla sacrificed on the principle that if they could not bring their core differentiator, there was no point.</p>
<p>It would have been better if Mozilla had made a ruckus, rather than hoping the world would notice its stoic virtue, but thankfully <a href="https://blog.mozilla.org/en/mozilla/calling-for-antitrust-reform/">the T-rex has roused from its slumber</a>.</p>
<p>Given the <a href="https://www.wired.com/story/firefox-mozilla-2022/">hard times the Mozilla Foundation has found itself in</a>, it seems worth trying to quantify the costs.</p>
<p>To start, Mozilla must fund a <em>separate</em> team to re-develop features atop a less-capable runtime. Every feature that interacts with web content must be rebuilt in an ad-hoc way <a href="https://infrequently.org/2021/08/webkit-ios-deep-dive/#introducing-apple-to-developer.apple.com">using inferior tools</a>. Everything from form autofill to password management to content blocking requires extra resources to build for iOS. Not only does this tax development of the iOS product, it makes coordinated feature launches more costly across <em>all</em> ports.</p>
<p>Most substantially, iOS policies against default browser choice — <a href="https://infrequently.org/2021/07/hobsons-browser/">combined with "in-app-browser" and search entry point shenanigans</a> — have delayed and devalued browser choice.</p>
<p>Until late 2020, users needed to explicitly tap the Firefox icon on the home screen to get back to their browser. Naïvely tapping links would, instead, load content in Safari. This split experience causes a sort of pervasive forgetfulness, making the web less useful.</p>
<p>Continuous partial amnesia about browser-managed information is bad for users, but it hurts browser makers too. On OSes with functional competition, convincing a user to download a new browser has a chance of converting nearly all of their browsing to that product. iOS (along with <a href="https://infrequently.org/2021/07/hobsons-browser/">Android and Facebook's mobile apps</a>) undermine this by constantly splitting browsing, ignoring the user's default. When users don't end up in their browser, searches occur through it less often, affecting revenue. Web developers also experience this as a reduction in visible share of browsing from competing products, reducing incentives to support alternative engines.</p>
<p>A foregetful web also hurts publishers. Ad bid rates are suppressed, and users struggle to access pay-walled content when browsing is split. The conspicuious <a href="https://infrequently.org/2021/04/progress-delayed/">lack of re-engagement features like Push Notifications</a> are the rotten cherry on top, forcing sites to push users to the App Store where Apple doesn't randomly log users out, or deprive publishers of key features.</p>
<p>Users, browser makers, web developers, and web businesses all lose. The hat-trick of value destruction.</p>
<h2 id="back-of-the-napkin" tabindex="-1"><a class="permalink" href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#back-of-the-napkin">Back Of The Napkin</a></h2>
<p>The pantomime of browser choice on iOS has created an anaemic, amnesiac web. Tapping links is more slogging than surfing when autofill fails, passwords are lost, and login state is forgotten. Browsers become less valuable as the web stops being a reliable way to complete tasks.</p>
<p>Can we quantify these losses?</p>
<p>Estimating lost business from user frustration and ad rate depression is challenging. But we can extrapolate what a dozen years of choice might have meant for Mozilla from what we know about how Apple monetises the web.</p>
<p>For the purposes of argument, let's assume Mozilla would be paid for web traffic at the same rate as Apple; $8-15 billion per year for ~75% share of traffic from Apple <abbr>OS</abbr>es.</p>
<p>If the traffic numbers to <abbr>US</abbr> government websites are reasonable proxies for the iOS/macOS traffic mix (big "if"s), then equal share for Firefox on iOS to macOS would be worth $215-400 million <em>per year</em>.<sup class="footnote-ref"><a href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#fn-mo-money-5" id="fnref-mo-money-5">5</a></sup> Put differently; there's reason to think that Mozilla would not have suffered layoffs if Apple were an ally of engine choice.</p>
<p>Apple's policies have made the web a less compelling ecosystem, its anti-competitive behaviours drive up competitor's costs, and it simultaneously starves them of revenue by undermining browser choice.</p>
<p>If Apple is a friend of engine diversity, who needs enemies?</p>
<h2 id="the-best-kind-of-correct" tabindex="-1"><a class="permalink" href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#the-best-kind-of-correct">The Best Kind Of Correct</a></h2>
<p>There is a narrow, fetid sense in which Apple's influence is nominally pro-diversity. Having anchored a significant fraction of web traffic at the trailing edge, businesses that do not decamp for the App Store may feel obliged to support WebKit.</p>
<p>This is a malignant form of diversity, not unlike other lagging engines through the years that harmed users and web-based businesses by externalizing costs. But on OSes with true browser choice, alternatives were meaningful.</p>
<p>Consider the loathed memory of <abbr>IE<abbr> 6, a browser that overstayed its welcome by nearly a decade. For as bad as it was, folks could recommend alternatives. <a href="https://en.wikipedia.org/wiki/Google_Chrome_Frame">Plugins also allowed us to transparently upgrade the platform</a>.</abbr></abbr></p>
<p>Before the rise of open-source engines, the end of one browser lineage may have been a deep loss to ecosystem diversity, but in the past 15 years, the primary way new engines emerge has been through forking and remixing.</p>
<p>But the fact of an engine being different does not make that difference valuable, and WebKit's differences are incremental. Sure, Blink now has a faster layout engine, better security, more features, and fewer bugs, but like WebKit, it is also derived from <a href="https://en.wikipedia.org/wiki/KHTML">KHTML</a>. Both engines are forks and owe many present-day traits to their ancestors.</p>
<p></p><figure><picture style="--lqip: 174819" class="preview">      <img src="https://infrequently.org/2021/08/webkit-ios-deep-dive/Timeline_of_web_browsers.svg" alt="The history of browsers includes many forks and remixes. It's naïve to think that will end if iOS becomes hospitable to browser competition. After all, it has been competition that spurred engine improvements and forks." style="aspect-ratio: 3605 / 2840" class="preview" decoding="async" loading="lazy">      </picture>                  <figcaption>The history of browsers includes many forks and remixes. It's naïve to think that will end if iOS becomes hospitable to browser competition. After all, it has been competition that spurred engine improvements and forks.</figcaption>      </figure><p></p>
<p>Today's KHTML descendants are not the end of the story. Future forks are possible. New codebases can be built from parts. Indeed, there's already valuable cross-pollination in code between Gecko, WebKit, and Chromium. Unlike the '90s and early 2000s, diversity can arrive in valuable increments through forking and recombination.</p>
<p>What's necessary for <em>leading edge</em> diversity, however, is funding.</p>
<p>By simultaneously taking a massive pot of cash for browser-building off the table, returning the least it can to engine development, and preventing others from filling the gap, Apple has foundationally imperilled the web ecosystem by destroying the utility of a diverse population of browsers and engines.</p>
<p>Apple has agency. It is not a victim, and it is not defending engine diversity.</p>
<h2 id="what-now%3F" tabindex="-1"><a class="permalink" href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#what-now%3F">What Now?</a></h2>
<p>A better, brighter future for the web is possible, and thanks to belated movement by regulators, increasingly likely. The good folks over at <a href="https://open-web-advocacy.org/">Open Web Advocacy</a> are leading the way, clearly explaining to anyone who will listen both what's at stake and what it will take to improve the situation.</p>
<p>Investigations are now underway worldwide, so if you think Apple shouldn't be afraid of a bit of competition if it will help the web thrive, consider getting involved. And if you're in the UK or do business there, <a href="https://www.kryogenix.org/days/2022/06/17/help-the-cma-help-the-web/">consider helping the CMA help the web before July 22nd, 2022.</a> The future isn't written yet, and we can change it for the better.</p>

<h2 class="footnotes-sep">FOOTNOTES</h2>
<section class="footnotes">
  <ol class="footnotes-list"><li id="fn-the-role-of-standards-in-compatibility-1" class="footnote-item"><p>Many commenters come to debates about compatibility and standards compliance with a mistaken view of <a href="https://infrequently.org/series/effective-standards-work/">how standards are made</a>. As a result, they perceive vendors with better standards conformance (rather than content compatibility) to occupy a sort of moral high ground. They do not. Instead, it usually represents a broken standards-setting process.</p>
<p>This can happen for several reasons. Sometimes standards bodies shutter, and the state of the art moves forward without them. This presents some risk for vendors that forge ahead without the cover of an <abbr title="standards developing organisation">SDO</abbr>'s protective <abbr>IP</abbr> umbrella, but that risk is often temporary and measured. <abbr>SDO</abbr>s aren't hard to come by; if new features are valuable, they can be standardised in a new venue. Alternatively, vendors can renovate the old one if others are interested in the work.</p>
<p>More often, working groups move at the speed of their most obstinate participants, uncomfortably prolonging technical debates already settled in the market and preventing definitive documentation of the winning design. In other cases, a vendor may play games with intellectual property claims to delay standardisation or lure competitors into a patent minefield (as Apple did with Touch Events).</p>
<p>At the leading edge, vendors need space to try new ideas without the need for the <em>a priori</em> consensus represented by a standard. However, compatibility concerns expressed by developers take on a different tinge over time.</p>
<p>When the specific <abbr>API</abbr> details and capabilities of ageing features do not converge, a continual tax is placed on folks trying to build sites using features from that set. When developers stress the need for compatibility, it is often in this respect.</p>
<p>Disingenuous actors sometimes try to misrepresent this interest and claim that all features must become standards <em>before</em> they are introduced in any engine. This interpretation runs against the <a href="https://www.ietf.org/about/participate/tao/#:~:text=We%20believe%20in%20rough%20consensus%20and%20running%20code">long practice of internet standards development</a> and almost always hides an ulterior motive.</p>
<p>The role of standards is to consolidate gains introduced at the leading edge through <a href="https://www.youtube.com/watch?v=hgEyQsy1D7w">responsible</a> competition. Vendors that fail to participate constructively in this process earn scorn. They bring ignominy upon their houses by failing to bring implementations in line with the rough (documented and tested) consensus or by playing the heel in <abbr>SDO</abbr>s to forestall progress they find inconvenient.</p>
<p>Vendors like Apple. <a href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#fnref-the-role-of-standards-in-compatibility-1" class="footnote-backref">⇐</a></p>
</li>
<li id="fn-ex-tac-2" class="footnote-item"><p>In the financial reports of internet businesses, you will see the costs to acquire business through channels reported as "Traffic Acquisition Costs" or "<abbr>TACM</abbr>". Many startups report their revenue "excluding <abbr>TAC</abbr>" or "ex-<abbr>TAC</abbr>". These are all ways of saying, "we paid for lead generation", and search engines are no different. <a href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#fnref-ex-tac-2" class="footnote-backref">⇐</a></p>
</li>
<li id="fn-buybacks-3" class="footnote-item"><p><em>This is money Apple believes it cannot figure out a way to invest in its products.</em> That's literally what share buybacks indicate. <a href="https://www.investopedia.com/articles/02/041702.asp#toc-the-motives">They're an admission that a company is not smart enough to invest the money in something productive.</a> Buybacks are attractive to managers because they create artificial scarcity for shares to drive up realised employee compensation — their own included. Employees who are cheesed to realise that their projects are perennially short-staffed are encouraged not to make a stink through <a href="https://www.investopedia.com/terms/r/restricted-stock-unit.asp"><abbr title="restricted stock options">RSU</abbr></a> appreciation. Everyone gets a cut, <abbr>RSU</abbr>-rich managers most of all. <a href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#fnref-buybacks-3" class="footnote-backref">⇐</a></p>
</li>
<li id="fn-apples-cash-drawdown-4" class="footnote-item"><p>Different analysts use different ways of describing <a href="https://www.macrotrends.net/stocks/charts/AAPL/apple/cash-on-hand">Apple's "cash on hand"</a>. Some analysts lump in all marketable securities, <a href="https://www.investopedia.com/ask/answers/042915/what-difference-between-current-and-noncurrent-assets.asp">current and non-current</a>, which consistently pushes the number north of $150 billion. Others report only the literal cash value on the books ($34 billion as of <time datetime="2020-05">May 2020). All of this means that it can require more context to compare the numbers in <a href="https://www.apple.com/newsroom/pdfs/FY22_Q2_Consolidated_Financial_Statements.pdf">Apple's consolidated financial statements (PDF)</a> with public reporting on them.</time></p>
<p>The picture is also clouded by changes in the way Apple manages its cash horde. Over the past two years, Apple has begun to draw from this almighty pile of dollars and spend more to inflate its stock price through share buybacks and dividends. This may cast Apple as more cash-poor than it is. A better understanding of the actual situation is derived from <a href="https://www.macrotrends.net/stocks/charts/AAPL/apple/free-cash-flow">free cash flow</a>. Perhaps Apple will continue to draw down from its tall cash mountain to inflate its stock price via buybacks, but that's not a material change in the amount Apple can potentially spend on improving its products. <a href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#fnref-apples-cash-drawdown-4" class="footnote-backref">⇐</a></p>
</li>
<li id="fn-mo-money-5" class="footnote-item"><p>Since this post first ran, several commenters have noted a point I considered while writing, but omitted in order to avoid heaping scorn on a victim; namely that Mozilla's management has been asleep at the switch regarding the business of its business.</p>
<p>Historically, when public records were available for both Opera and Mozilla, it was easy to understand how poorly Mozilla negotiated with search partners. Under successive leaders, Mozilla negotiated deals that led to payments <em>less than as half as much per point of share.</em> There's no reason to think MoCo's negotiating skills have improved dramatically in recent years. Apple, therefore, is likely to capture much more revenue per search than Mozilla ears from a Firefox user.</p>
<p>But even if Mozilla only made 1/3 of Apple's haul for equivalent use, the combined taxes of iOS feature re-development and loss of revenue would be material to the Mozilla Foundation's bottom line.</p>
<p>Obviously, to get that share, Mozilla would need to prioritise mobile, which it has not done. This is a deep own-goal and a point of continued sadness for me.</p>
<p>A noble house reduced to rubble is a tragedy no matter who demolishes the final wall. Management incompetence is in evidence, and <a href="https://www.mozilla.org/en-US/about/leadership/#directors">Mozilla's Directors</a> are clearly not fit for purpose.</p>
<p>But none of that detracts from what others have done <em>to</em> the Foundation and the web, and it would be wrong to claim Mozilla should have been perfect in ways its enemies and competitors were not. <a href="https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/#fnref-mo-money-5" class="footnote-backref">⇐</a></p>
</li>
</ol>
</section>

    ]]></description>
      <pubDate>Mon, 20 Jun 2022 00:00:00 +0000</pubDate>
      <link>https://infrequently.org/2022/06/apple-is-not-defending-browser-engine-choice/</link>
      <dc:creator>Infrequently Noted</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/3685435768</guid>
    </item>
    <item>
      <title><![CDATA[Conference speaking, transparency and fairness]]></title>
      <description><![CDATA[<p>I love speaking at conferences. Through conference speaking I’ve been able to travel to parts of the world I would never have seen, meet and talk to people I would never have met. I’ve discovered new foods I like to eat, brought new customers to our product, learned so much more about different cultures – something that helps me when supporting our customers. I’ve even started to learn to speak German due to the number of events I have been to in German speaking countries.</p>

<p>Being asked to speak at conferences is a huge privilege. It is something I take seriously – whether I’m talking to 20 people at a local meet up or 1500 on the main track of a large event. I work hard to bring a good presentation, tailored to the expected audience, and to be an asset to any conference I am part of.</p>

<p>However, speaking at conferences is almost never a direct money-making exercise. In fact, most often when I speak at a conference it costs me and my business a not insignificant amount of money. If you are a conference attendee, know that most of the people on stage are taking a financial hit <a href="http://remysharp.com/2014/03/07/youre-paying-to-speak/">just by being there</a>.</p>

<h2>What do speakers get paid?</h2>

<p>Very often, speakers at web conferences and events are unpaid. Where a fee is offered it is usually an honorarium – an amount not really tied to the amount of work that goes into creating a talk and being at the conference. </p>

<p>I have a simple rule, if someone is making money out of the conference then I expect to be paid too. As it happens an awful lot of conferences and events are not money-making enterprises. They are put on because the organiser just really wants to see the event happen, and are making it so. Unless the conference can be a day trip for me (so within a couple of hours of my home in Bristol, UK) then I expect that the conference will cover my hotel accommodation and travel. That should be seen as a critical expense of putting on a conference – like paying for the venue. The speakers are why people are attending your conference.</p>

<h2>Whether I attend is usually a business decision</h2>

<p>There are conferences I will speak at because I just like the organisers, or the city, or I want to hear the other speakers and so am happy to essentially use my own time to do the event. However the more travel I do, the less I’m able to justify doing travel just for the jolly! </p>

<p>It is vanishingly rare for a conference to offer me my day rate for all the time I will be there, never mind the time spent preparing and traveling. My business is contributing to your conference. Give me a reason why the business will benefit, that might be:</p>

<ul>
	<li>the audience is aligned to either people who might be interested in Perch or my book</li>
	<li>the conference is going to be useful for me to attend, I’m learning too</li>
	<li>there are others speakers there who it is beneficial for me to be on the lineup with or are people I know or might want to meet</li>
	<li>you can offer a way to promote my product (outside of my talk obviously) such as by adding us to the sponsor links</li>
</ul>

<h2>A plea for transparency</h2>

<p>Yesterday <a href="https://twitter.com/rachelandrew/status/461775947424075777">I mentioned on Twitter</a> how nice it was to get an invite that clearly stated what the conference was offering. I can’t mention the particular conference just yet as things haven’t been announced but I received a short, to the point email that told me:</p>

<ul>
	<li>when and where the conference was happening</li>
	<li>what the speaker package covered</li>
	<li>a note on why the organiser felt their audience would be a good fit for the things I talk about – but also for the audience I want to reach as a business</li>
</ul>

<p>I was able to check my diary and get straight back to confirm that I would love to be there. No awkward back and forth about money, and the ability to justify any out of pocket expenses I might have, and the time away from the office because I could immediately see the benefit of speaking to that audience.</p>

<p>Conversely, a friend of mine yesterday <a href="http://www.sazzy.co.uk/gracefully-bowing-out-of-giant-conference/">pulled out of a conference</a> due to discovering that speakers were not all being treated fairly, and in the same way. This led to confusion on Twitter, and accusations of gender bias in terms of who was paid. Even if there wasn’t explicit gender bias on the part of the organisers it does raise questions as to whether male speakers are more willing to speak up and demand a fee, and therefore more likely to be paid than women.</p>

<p><strong>The default expectation for appearing at a conference should be that the work, and this is work, should be paid for along with all expenses.</strong></p>

<p>If the conference cannot pay, or can only offer a token fee, then this should be assessed in the same way for all speakers and should be utterly transparent when the initial request is made. </p>

<p>This is good for everyone. For the speaker there is no need to feel awkward in asking what is covered. Everyone saves time on back and forth emails only to discover that due to expenses or lack of fee this won’t work out. The conference saves potentially embarrassing situations where speakers pull out, or show up and realise when talking to other speakers there is disparity in what has been offered. We all talk to each other, organisers might be surprised at the number of emails I get from fellow speakers asking what my experience was when I spoke at a particular conference. </p>

<h2>Transparency and diversity</h2>

<p>I believe being transparent and taking a default stance that compensation should be expected will help to diversify our conferences. New speakers are the ones who most often get burned by the practice of only offering a fee if asked, or needing to negotiate a fee when they have no idea what is acceptable. </p>

<p>I saw a tweet from an event organiser last night saying that they don’t offer a fee unless people ask “to help keep costs down”. This is exactly the sort of behaviour that causes the problems seen yesterday and may well lead to women, if it is the case that women are less likely to ask for a fee, finding they are the ones in a line-up not being paid. </p>

<p>There are great speakers on almost every subject all over the world. If a conference has a limited budget then perhaps they need to look closer to home for speakers. While it is lovely to fly in a big name from the other side of the world, if that burns up the budget so the conference can’t compensate other speakers and they can’t use that name to help attract sponsorship that covers the expense, then maybe they need to reconsider that choice. Looking closer to home will also narrow the pool of “same old names” to pick from, and hopefully bring in some new speakers. What would be great to see would be conferences assigning a couple of slots to new faces, deliberately selecting local people (therefore being able to offer the same expenses package, it would just be naturally less expensive) and offering them help in preparing for their talk.</p>

<p>If you are a speaker or potential speaker it is reasonable to expect that you will be compensated. You can balance that against genuine business reasons to be there. Woolly statements about exposure are nonsense, assess what you will gain in real business or professional terms. If the initial request does not include expenses and payment information then your first reply should be to ask what they are offering speakers in terms of payment and expenses. You can then take negotiations from that point. <strong>Remember that where your time and actual cash outlay is not being financially compensated it is the job of the organiser to make sure there is a tangible benefit for you to take the hit of being there</strong>.</p>

<h3>Further reading</h3>

<p>Several other people have weighed into the debate,I’m editing this post to add resources as I spot them.</p>

<p>Seb Lee-Delisle posted an excellent post today on <a href="http://seb.ly/2014/05/how-to-ask-to-get-paid-to-speak/">exactly how to ask to be paid</a>.</p>

<p>Jenn Lukas gave some tips on <a href="http://www.thenerdary.net/post/84544230452/a-formula-for-speaking-fees">how to calculate your speaking fee</a>, see the comments for more great suggestions.</p>
            
            ]]></description>
      <pubDate>Fri, 02 May 2014 08:31:00 +0000</pubDate>
      <link>https://rachelandrew.co.uk/archives/2014/05/02/conference-speaking-transparency-and-fairness/</link>
      <dc:creator>Rachel Andrew</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/3658185995</guid>
    </item>
    <item>
      <title><![CDATA[Why I write and why I won’t]]></title>
      <description><![CDATA[

<p>This is the best description of what my own website feels like to me:</p>

<blockquote>
  <p>A search engine for my mind</p>
</blockquote>

<p><a href="https://adactio.com/links/18634">adactio.com/links/18634</a></p>

            ]]></description>
      <pubDate>Sun, 21 Nov 2021 13:45:02 +0000</pubDate>
      <link>https://remysharp.com/2021/11/21/why-i-write-and-when-i-dont</link>
      <dc:creator>Adactio: Links</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/3394464935</guid>
    </item>
    <item>
      <title><![CDATA[Links on Typography]]></title>
      <description><![CDATA[
<ul><li><a href="https://dribbble.com/stories/2021/04/26/web-design-data-fonts"><strong>I studied the fonts of the top 1000 websites. Here’s what I learned.</strong></a> — Michael Li brings the data. San-serif has total dominance. “[…] it is rare to go below 10px or above 24px.” And poor <code>&lt;h5&gt;</code> always being the same size as <code>&lt;p&gt;</code>. Makes me feel extra sad for <code>&lt;h6&gt;</code>, are you destined to be <em>smaller</em> than body copy?<br></li><li><a href="https://www.zeichenschatz.net/typography/tracking-and-kering-all-caps-text"><strong>How tracking and kerning improves all caps text</strong></a> — Oliver Schöndorfer gets into why ALL CAPS text generally looks better when spaced out (i.e. <code><a href="https://css-tricks.com/almanac/properties/l/letter-spacing/">letter-spacing</a></code> in CSS). I’m not exactly a renowned typographer, but this tracks with what I’ve always felt. All-caps looks good spaced out (sometimes quite a bit), and conversely, it almost never looks good to track out lowercase. Like the PG version of the <a href="https://quotesondesign.com/frederic-goudy/">famous quote</a>.<br></li><li><a href="https://blog.jim-nielsen.com/2020/system-fonts-on-the-web/"><strong>Leveraging System Fonts on the Web</strong></a> — Jim Nielsen shared some of my confusion with “system fonts” in CSS. Like we have <code>system-ui</code> now, which I use pretty often because it actually works in Chrome and Safari for selecting the system font (i.e. getting to use San Francisco on macOS). Before that was a thing, to leverage the same kind of thing, you’d do <a href="https://css-tricks.com/snippets/css/system-font-stack/">a big long stack</a>. But we kinda still need the stack for real production sites, since <code>system-ui</code> isn’t universally supported. There is a nice world going forward though, because we’re getting <code>ui-sans-serif</code>, <code>ui-sans-serif</code>, <code>ui-monospace</code>, and <code>ui-rounded</code>. Browser support is quite limited, but it’s gonna <a href="https://css-tricks.com/wp-content/uploads/2021/06/Screen-Shot-2021-06-11-at-12.54.36-PM.png">be nice</a>.<br></li><li><a href="https://mass-driver.com/article/simpler-font-licensing-introducing-v2"><strong>Simpler Font Licensing: Introducing V2</strong></a> — “The core of V2 is this:&nbsp;<em>you buy a font, and then you can use it.</em>” God bless ’em. As the owner of several sites that get a lot of page views but don’t have waterfalls of cash as a budget, I need web font pricing that is sane.<br></li><li><a href="https://iainbean.com/posts/2021/5-steps-to-faster-web-fonts/"><strong>5 steps to faster web fonts</strong></a> — Iain&nbsp;Bean goes through the biggies: WOFF2, <code><a href="https://css-tricks.com/almanac/properties/f/font-display/">font-display</a></code>, <code>&lt;link rel="preload" ...&gt;</code>, Subsetting, and self-hosting. And never forget about <a href="https://www.zachleat.com/web/comprehensive-webfonts/">the holy bible</a>.<br></li><li><a href="https://www.smashingmagazine.com/2021/05/reduce-font-loading-impact-css-descriptors/"><strong>A New Way To Reduce Font Loading Impact: CSS Font Descriptors</strong></a> — Barry Pollard looks at new CSS descriptors (not just regular properties as they only work within <code>@font-face</code> blocks) like <code>size-adjust</code> and <code>ascent-override</code>. <strong>YES. THIS IS AWESOME.</strong> I declared perfect font fallbacks <a href="https://css-tricks.com/books/greatest-css-tricks/perfect-font-fallbacks/">one of the all-time great CSS tricks</a>, but alas, it required a smidge of JavaScript and hackery. This brings it all into CSS perfectly.<br></li><li><a href="https://www.youtube.com/watch?v=41i9EN9l8uc"><strong>Why You Should Stop Using Times New Roman</strong></a> — Vanessa Hill was asked to reformat a research paper into Times New Roman. She was told it’s because it’s so readable and researches the truth: it’s not. Personally, I can’t stand the look of it because it looks like your font-stack failed in CSS. <br></li><li><a href="https://yal.cc/r/20/pixelfont/"><strong>Pixel font converter!</strong></a> — Looks like an ancient tool (<a href="https://remysharp.com/links/2021-05-14-803ab535">via</a> Remy Sharp) but I love it as it opens up the idea of creating a font to anyone who knows how to draw some letters and save a static image.</li></ul>



<p></p>
<hr>
<p><small>The post <a rel="nofollow" href="https://css-tricks.com/links-on-typography-2/">Links on Typography</a> appeared first on <a rel="nofollow" href="https://css-tricks.com">CSS-Tricks</a>. You can support CSS-Tricks by being an <a href="https://css-tricks.com/product/mvp-supporter/">MVP Supporter</a>.</small></p>
]]></description>
      <pubDate>Fri, 18 Jun 2021 13:44:17 +0000</pubDate>
      <link>https://css-tricks.com/links-on-typography-2/</link>
      <dc:creator>CSS-Tricks</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/3178978530</guid>
    </item>
    <item>
      <title><![CDATA[More bookmarks from 2021]]></title>
      <description><![CDATA[<p><em>This is a snapshot of the <a href="https://ohhelloana.blog/more-bookmarks-from-2021/">original post</a> shared on my blog.</em></p>




<ul>
<li>
<a href="https://www.stefanjudis.com/today-i-learned/how-to-use-language-dependent-quotes-in-css/">How to display language-specific quotes in CSS</a> by Stefan Judis</li>
<li>
<a href="https://www.sarasoueidan.com/blog/accessible-icon-buttons/">Accessible Icon Buttons</a> by Sara Soueidan.</li>
<li>
<a href="https://www.thetimes.co.uk/article/sharing-deepfake-images-must-be-made-a-crime-thf20kqw2">Sharing deepfake images ‘must be made a crime’</a> by Jonathan Ames.</li>
<li>
<a href="https://kittygiraudel.com/2021/02/17/hiding-content-responsibly/">Hiding content responsibily</a> by Kitty Giraudel.</li>
<li>
<a href="https://iainbean.com/posts/2021/system-fonts-dont-have-to-be-ugly/">System fonts don’t have to be ugly</a> by Iain Bean.</li>
<li>
<a href="https://charity.wtf/2021/02/19/questionable-advice-how-can-i-sniff-out-bad-managers-while-interviewing-for-a-job/">Questionable Advice: “How can I sniff out bad managers while interviewing for a job?”</a> by Charity Majors.</li>
<li>
<a href="https://ishadeed.com/article/css-logical-properties/">Digging Into CSS Logical Properties</a> by Ahmad Shadeed.</li>
<li>
<a href="https://dev.to/georgedoescode/a-generative-svg-starter-kit-5cm1">A Generative SVG Starter Kit</a> by George Francis.</li>
<li>
<a href="https://infrequently.org/2021/03/the-performance-inequality-gap/">The Mobile Performance Inequality Gap, 2021</a> by Alex Russell.</li>
<li>
<a href="https://www.pennlive.com/news/2021/03/pa-woman-created-deepfake-videos-to-force-rivals-off-daughters-cheerleading-squad-police.html">Pa. woman created ‘deepfake’ videos to force rivals off daughter’s cheerleading squad</a> by Jana Benscoter.</li>
<li>
<a href="https://leaddev.com/career-paths-progression-promotion/why-individual-contributor-tetris-block">Why is an individual contributor like a Tetris block?</a> by Denise Yu.</li>
<li>
<a href="https://remysharp.com/til/css/perfect-fullscreen-43-aspect-ratio">Perfect fullscreen 4:3 aspect ratio</a> by Remy Sharp.</li>
<li>
<a href="https://dev.to/afif/100-underline-overlay-animation-the-ultimate-css-collection-4p40">100 underline/overlay animations | The ultimate CSS collection</a> by Temani Afif.</li>
<li>
<a href="https://www.noiseandgradient.com/?chaos=0.1&amp;colors=%23ed625d-%2342b6c6-%23f79f88-%23b2dfe6-%2303232d&amp;grain=0.1">Noise &amp; gradient</a> by Clara B.</li>
<li>
<a href="https://www.documentjournal.com/2021/01/the-internet-didnt-kill-counterculture-you-just-wont-find-it-on-instagram/">The internet didn’t kill counterculture—you just won’t find it on Instagram</a> by Caroline Busta.</li>
<li>
<a href="https://kittygiraudel.com/2021/03/22/a-tale-of-languages/">A tale of languages</a> by Kitty Giraudel.</li>
<li>
<a href="https://codepen.io/michellebarker/pen/KKagoLy">Kentrosaurus</a> by Michelle Barker.</li>
<li>
<a href="https://css-tricks.com/mistakes-ive-made-as-an-engineering-manager/">Mistakes I’ve Made as an Engineering Manager</a> by Sarah Drasner.</li>
<li>
<a href="http://www.craigabbott.co.uk/blog/defining-a-strategy-for-accessibility">Defining a strategy for accessibility</a> by Craig Abbott.</li>
<li>
<a href="https://jvns.ca/blog/2017/04/27/no-feigning-surprise/">No feigning surprise</a> by Julia Evans.</li>
<li>
<a href="https://www.nytimes.com/2021/04/07/opinion/google-job-harassment.html">After Working at Google, I’ll Never Let Myself Love a Job Again</a> by Emi Nietfeld.</li>
<li>
<a href="https://www.rollingstone.com/culture/culture-features/target-sex-trafficking-tiktok-hoax-1151665/">A Target Sex-Trafficking Hoax Is Going Viral on TikTok</a> by EJ Dickson.</li>
<li>
<a href="https://ericwbailey.design/writing/how-to-make-an-ineffective-404-page/">How to make an ineffective 404 page</a> by Eric W Bailey.</li>
<li>
<a href="https://www.matuzo.at/blog/html-boilerplate/">My current HTML boilerplate</a> by Manuel Matuzovic.</li>
<li>
<a href="https://www.technologyreview.com/2021/04/02/1021635/beauty-filters-young-girls-augmented-reality-social-media/">Beauty filters are changing the way young girls see themselves</a> by Tate Ryan-Mosleyarchive.</li>
<li>
<a href="https://piccalil.li/tutorial/build-a-fancy-hover-animation">Build a fancy hover animation</a> by Andy Bell.</li>
<li>
<a href="https://www.youtube.com/watch?v=96DCTASFniI">The Layers of the Web</a> by Jeremy Keith.</li>
<li>
<a href="https://devyarns.com/logical-focus-order/">Understanding Logical Focus Order</a> by Rachel Leggett.</li>
<li>
<a href="https://ishadeed.com/article/tiny-enhancements-in-css/">The Beauty Of Tiny Enhancements In CSS</a> by Ahmad Shadeed.</li>
<li>
<a href="https://adrianroselli.com/2021/01/bulletproofing-embedded-tweets.html">Bulletproofing Embedded Tweets</a> by Adrian Roselli.</li>
<li>
<a href="https://css-tricks.com/the-importance-of-career-laddering/">The Importance of Career Laddering</a> by Sarah Drasner.</li>
<li>
<a href="https://github.com/andy-piccalilli/11ty-base-no-blog">Project base for Eleventy Sites</a> by Andy Bell.</li>
<li>
<a href="https://www.bloomberg.com/news/articles/2021-04-22/how-to-go-viral-on-tiktok-like-megan-thee-stallion-play-the-app-s-game">How TikTok Chooses Which Songs Go Viral</a> by Shelly Banjo.</li>
<li>
<a href="https://brianlovin.com/writing/make-a-personal-changelog">Make a personal changelog</a> by Brian Lovin.</li>
<li>
<a href="https://webdevlaw.uk/2021/04/20/your-cut-and-keep-guide-to-the-unregulated-wild-west-internet/">Your cut-and-keep guide to the “unregulated wild west internet”</a> by Heather Burns.</li>
<li>
<a href="https://github.com/davatron5000/awesome-standalones">Awesome standalones</a> by Dave Rupert.</li>
<li>
<a href="https://martinschneider.me/articles/going-public/">Going public</a> by Martin Schneider.</li>
<li>
<a href="https://lab.hakim.se/flora/">Flora</a> by Hakim El Hattab.</li>
<li>
<a href="https://www.phirephoenix.com/blog/2021-05-03/privacy">Left alone, together</a> by Jenny Zhang.</li>
<li>
<a href="https://css-tricks.com/how-to-add-a-double-border-to-svg-shapes/">How to Add a Double Border to SVG Shapes</a> by Mariana Beldi.</li>
<li>
<a href="https://github.com/rubymorillo/pocket-tech-writing-list">The Pocket Technical Writing List</a> by Stephanie Morillo.</li>
<li>
<a href="https://css-irl.info/creating-generative-svg-characters/">Creating Generative SVG Characters</a> by Michelle Barker.</li>
<li>
<a href="https://testingaccessibility.com/">Learn How to Build Accessible Web Apps</a> by Marcy Sutton.</li>
<li>
<a href="https://maggieappleton.com/nontechnical-gardening">Digital Gardening for Non-Technical Folks</a> by Maggie Appleton.</li>
<li>
<a href="https://www.deque.com/blog/auditing-design-systems-for-accessibility/">Auditing Design Systems for Accessibility</a> by Anna E. Cook.</li>
<li>
<a href="https://www.tpgi.com/accessibility-testing-as-a-screen-reader-user/">Accessibility testing as a screen reader user</a> by Isabel Holdsworth.</li>
<li>
<a href="https://www.sarasoueidan.com/blog/tips-for-reader-modes/">Design for reading: tips for optimizing content for Reader modes and reading apps</a> by Sara Soueidan.</li>
<li>
<a href="https://technology.blog.gov.uk/2021/04/19/simple-things-are-complicated-making-a-show-password-option/">Simple things are complicated: making a show password option</a> by Andy Sellick.</li>
<li>
<a href="https://visitmy.website/2020/11/01/why-i-write-weeknotes/">Why I write weeknotes</a> by Steve Messer.</li>
<li>
<a href="https://bnijenhuis.nl/notes/2021-05-10-automatically-generate-open-graph-images-in-eleventy/">Automatically generate open graph images in Eleventy</a> by Bernard Nijenhuis.</li>
<li>
<a href="https://ericwbailey.design/writing/dont-use-custom-css-mouse-cursors/">Don’t use custom CSS mouse cursors</a> by Eric W Bailey.</li>
<li>
<a href="https://hiddedevries.nl/en/blog/2021-05-24-introducing-an-eleventy-starter-project-for-wcag-reports">Introducing: an Eleventy starter project for WCAG reports</a> by Hidde de Vries.</li>
<li>
<a href="https://uxdesign.cc/inclusive-ux-in-an-era-of-anxiety-dc89c39ec202">Inclusive UX in an era of anxiety</a> by Cara Brashears.</li>
<li>
<a href="https://shkspr.mobi/blog/2021/05/what-are-unusual-characters/">What are “unusual characters”</a> by Terence Eden.</li>
<li>
<a href="https://opml.glitch.me/">Twitter to OPLM</a> by Luca Hammer.</li>
<li>
<a href="https://css-tricks.com/html-inputs-and-labels-a-love-story/">HTML Inputs and Labels: A Love Story</a> by Amber Wilson.</li>
<li>
<a href="https://adactio.com/journal/18046">Get the FLoC out</a> by Jeremy Keith.</li>
<li>
<a href="https://www.cassie.codes/posts/swipey-image-grids/">Swipey Image Grids</a> by Cassie Evans.</li>
<li>
<a href="https://www.smashingmagazine.com/2021/05/complete-guide-css-container-queries/">A Primer On CSS Container Queries</a> by Stephanie Eckles.</li>
<li>
<a href="https://georgefrancis.dev/writing/create-a-liquid-hover-effect-with-gsap-and-svg/">Create a Liquid Hover Effect with GSAP &amp; SVG</a> by George Francis.</li>
<li>
<a href="https://jvns.ca/blog/2021/05/24/blog-about-what-you-ve-struggled-with/">Blog about what you've struggled with</a> by Julia Evans.</li>
<li>
<a href="https://adactio.com/journal/18117">The cage</a> by Jeremy Keith.</li>
<li>
<a href="https://chias.blog/2021/in-defense-of-disorder-on-career-creativity-and-professionalism/">In defense of disorder: on career, creativity, and professionalism</a> by Chiara Amisola.</li>
</ul>

]]></description>
      <pubDate>Thu, 03 Jun 2021 18:10:07 +0000</pubDate>
      <link>https://dev.to/ohhelloana/more-bookmarks-from-2021-686</link>
      <dc:creator>DEV Community</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/3156693903</guid>
    </item>
    <item>
      <title><![CDATA[More bookmarks from 2021]]></title>
      <description><![CDATA[<p>I'm not gonna lie - I'm quite disappointed in myself that I still haven't got my poop together and gone back to doing this monthly. I managed to write some blog posts since March but all those happened because I milked really hard the surge of energy I had at that moment.</p>
<p>As I've gone a bit quieter, the following quote has been haunting me every time I sign in on Twitter.</p>
<blockquote>
<p>On the platform, silence isn’t an option, at least not if you want the network to remember you exist.</p>
</blockquote>
<p>Quote via <a href="https://www.documentjournal.com/2021/01/the-internet-didnt-kill-counterculture-you-just-wont-find-it-on-instagram/">The internet didn’t kill counterculture—you just won’t find it on Instagram</a>.</p>
<p>Bookmarks related to tech and web development</p>
<ul>
<li><a href="https://www.stefanjudis.com/today-i-learned/how-to-use-language-dependent-quotes-in-css/">How to display language-specific quotes in CSS</a> by Stefan Judis</li>
<li><a href="https://www.sarasoueidan.com/blog/accessible-icon-buttons/">Accessible Icon Buttons</a> by Sara Soueidan.</li>
<li><a href="https://www.thetimes.co.uk/article/sharing-deepfake-images-must-be-made-a-crime-thf20kqw2">Sharing deepfake images ‘must be made a crime’</a> by Jonathan Ames.</li>
<li><a href="https://kittygiraudel.com/2021/02/17/hiding-content-responsibly/">Hiding content responsibily</a> by Kitty Giraudel.</li>
<li><a href="https://iainbean.com/posts/2021/system-fonts-dont-have-to-be-ugly/">System fonts don’t have to be ugly</a> by Iain Bean.</li>
<li><a href="https://charity.wtf/2021/02/19/questionable-advice-how-can-i-sniff-out-bad-managers-while-interviewing-for-a-job/">Questionable Advice: “How can I sniff out bad managers while interviewing for a job?”</a> by Charity Majors.</li>
<li><a href="https://ishadeed.com/article/css-logical-properties/">Digging Into CSS Logical Properties</a> by Ahmad Shadeed.</li>
<li><a href="https://dev.to/georgedoescode/a-generative-svg-starter-kit-5cm1">A Generative SVG Starter Kit</a> by George Francis.</li>
<li><a href="https://infrequently.org/2021/03/the-performance-inequality-gap/">The Mobile Performance Inequality Gap, 2021</a> by Alex Russell.</li>
<li><a href="https://www.pennlive.com/news/2021/03/pa-woman-created-deepfake-videos-to-force-rivals-off-daughters-cheerleading-squad-police.html">Pa. woman created ‘deepfake’ videos to force rivals off daughter’s cheerleading squad</a> by Jana Benscoter.</li>
<li><a href="https://leaddev.com/career-paths-progression-promotion/why-individual-contributor-tetris-block">Why is an individual contributor like a Tetris block?</a> by Denise Yu.</li>
<li><a href="https://remysharp.com/til/css/perfect-fullscreen-43-aspect-ratio">Perfect fullscreen 4:3 aspect ratio</a> by Remy Sharp.</li>
<li><a href="https://dev.to/afif/100-underline-overlay-animation-the-ultimate-css-collection-4p40">100 underline/overlay animations | The ultimate CSS collection</a> by Temani Afif.</li>
<li><a href="https://www.noiseandgradient.com/?chaos=0.1&amp;colors=%23ed625d-%2342b6c6-%23f79f88-%23b2dfe6-%2303232d&amp;grain=0.1">Noise &amp; gradient</a> by Clara B.</li>
<li><a href="https://www.documentjournal.com/2021/01/the-internet-didnt-kill-counterculture-you-just-wont-find-it-on-instagram/">The internet didn’t kill counterculture—you just won’t find it on Instagram</a> by Caroline Busta.</li>
<li><a href="https://kittygiraudel.com/2021/03/22/a-tale-of-languages/">A tale of languages</a> by Kitty Giraudel.</li>
<li><a href="https://codepen.io/michellebarker/pen/KKagoLy" title="Kentrosaurus">Kentrosaurus</a> by Michelle Barker.</li>
<li><a href="https://css-tricks.com/mistakes-ive-made-as-an-engineering-manager/">Mistakes I’ve Made as an Engineering Manager</a> by Sarah Drasner.</li>
<li><a href="http://www.craigabbott.co.uk/blog/defining-a-strategy-for-accessibility">Defining a strategy for accessibility</a> by Craig Abbott.</li>
<li><a href="https://jvns.ca/blog/2017/04/27/no-feigning-surprise/">No feigning surprise</a> by Julia Evans.</li>
<li><a href="https://www.nytimes.com/2021/04/07/opinion/google-job-harassment.html">After Working at Google, I’ll Never Let Myself Love a Job Again</a> by Emi Nietfeld.</li>
<li><a href="https://www.rollingstone.com/culture/culture-features/target-sex-trafficking-tiktok-hoax-1151665/">A Target Sex-Trafficking Hoax Is Going Viral on TikTok</a> by EJ Dickson.</li>
<li><a href="https://ericwbailey.design/writing/how-to-make-an-ineffective-404-page/">How to make an ineffective 404 page</a> by Eric W Bailey.</li>
<li><a href="https://www.matuzo.at/blog/html-boilerplate/">My current HTML boilerplate</a> by Manuel Matuzovic.</li>
<li><a href="https://www.technologyreview.com/2021/04/02/1021635/beauty-filters-young-girls-augmented-reality-social-media/">Beauty filters are changing the way young girls see themselves</a> by Tate Ryan-Mosleyarchive.</li>
<li><a href="https://piccalil.li/tutorial/build-a-fancy-hover-animation">Build a fancy hover animation</a> by Andy Bell.</li>
<li><a href="https://www.youtube.com/watch?v=96DCTASFniI">The Layers of the Web</a> by Jeremy Keith.</li>
<li><a href="https://devyarns.com/logical-focus-order/">Understanding Logical Focus Order</a> by Rachel Leggett.</li>
<li><a href="https://ishadeed.com/article/tiny-enhancements-in-css/">The Beauty Of Tiny Enhancements In CSS</a> by Ahmad Shadeed.</li>
<li><a href="https://adrianroselli.com/2021/01/bulletproofing-embedded-tweets.html">Bulletproofing Embedded Tweets</a> by Adrian Roselli.</li>
<li><a href="https://css-tricks.com/the-importance-of-career-laddering/">The Importance of Career Laddering</a> by Sarah Drasner.</li>
<li><a href="https://github.com/andy-piccalilli/11ty-base-no-blog">Project base for Eleventy Sites</a> by Andy Bell.</li>
<li><a href="https://www.bloomberg.com/news/articles/2021-04-22/how-to-go-viral-on-tiktok-like-megan-thee-stallion-play-the-app-s-game">How TikTok Chooses Which Songs Go Viral</a> by Shelly Banjo.</li>
<li><a href="https://brianlovin.com/writing/make-a-personal-changelog">Make a personal changelog</a> by Brian Lovin.</li>
<li><a href="https://webdevlaw.uk/2021/04/20/your-cut-and-keep-guide-to-the-unregulated-wild-west-internet/">Your cut-and-keep guide to the “unregulated wild west internet”</a> by Heather Burns.</li>
<li><a href="https://github.com/davatron5000/awesome-standalones">Awesome standalones</a> by Dave Rupert.</li>
<li><a href="https://martinschneider.me/articles/going-public/">Going public</a> by Martin Schneider.</li>
<li><a href="https://lab.hakim.se/flora/">Flora</a> by Hakim El Hattab.</li>
<li><a href="https://www.phirephoenix.com/blog/2021-05-03/privacy">Left alone, together</a> by Jenny Zhang.</li>
<li><a href="https://css-tricks.com/how-to-add-a-double-border-to-svg-shapes/">How to Add a Double Border to SVG Shapes</a> by Mariana Beldi.</li>
<li><a href="https://github.com/rubymorillo/pocket-tech-writing-list">The Pocket Technical Writing List</a> by Stephanie Morillo.</li>
<li><a href="https://css-irl.info/creating-generative-svg-characters/">Creating Generative SVG Characters</a> by Michelle Barker.</li>
<li><a href="https://testingaccessibility.com/">Learn How to Build Accessible Web Apps</a> by Marcy Sutton.</li>
<li><a href="https://maggieappleton.com/nontechnical-gardening">Digital Gardening for Non-Technical Folks</a> by Maggie Appleton.</li>
<li><a href="https://www.deque.com/blog/auditing-design-systems-for-accessibility/">Auditing Design Systems for Accessibility</a> by Anna E. Cook.</li>
<li><a href="https://www.tpgi.com/accessibility-testing-as-a-screen-reader-user/">Accessibility testing as a screen reader user</a> by Isabel Holdsworth.</li>
<li><a href="https://www.sarasoueidan.com/blog/tips-for-reader-modes/">Design for reading: tips for optimizing content for Reader modes and reading apps</a> by Sara Soueidan.</li>
<li><a href="https://technology.blog.gov.uk/2021/04/19/simple-things-are-complicated-making-a-show-password-option/">Simple things are complicated: making a show password option</a> by Andy Sellick.</li>
<li><a href="https://visitmy.website/2020/11/01/why-i-write-weeknotes/">Why I write weeknotes</a> by Steve Messer.</li>
<li><a href="https://bnijenhuis.nl/notes/2021-05-10-automatically-generate-open-graph-images-in-eleventy/">Automatically generate open graph images in Eleventy</a> by Bernard Nijenhuis.</li>
<li><a href="https://ericwbailey.design/writing/dont-use-custom-css-mouse-cursors/">Don’t use custom CSS mouse cursors</a> by Eric W Bailey.</li>
<li><a href="https://hiddedevries.nl/en/blog/2021-05-24-introducing-an-eleventy-starter-project-for-wcag-reports">Introducing: an Eleventy starter project for WCAG reports</a> by Hidde de Vries.</li>
<li><a href="https://uxdesign.cc/inclusive-ux-in-an-era-of-anxiety-dc89c39ec202">Inclusive UX in an era of anxiety</a> by Cara Brashears.</li>
<li><a href="https://shkspr.mobi/blog/2021/05/what-are-unusual-characters/">What are “unusual characters”</a> by Terence Eden.</li>
<li><a href="https://opml.glitch.me/">Twitter to OPLM</a> by Luca Hammer.</li>
<li><a href="https://css-tricks.com/html-inputs-and-labels-a-love-story/">HTML Inputs and Labels: A Love Story</a> by Amber Wilson.</li>
<li><a href="https://adactio.com/journal/18046">Get the FLoC out</a> by Jeremy Keith.</li>
<li><a href="https://www.cassie.codes/posts/swipey-image-grids/">Swipey Image Grids</a> by Cassie Evans.</li>
<li><a href="https://www.smashingmagazine.com/2021/05/complete-guide-css-container-queries/">A Primer On CSS Container Queries</a> by Stephanie Eckles.</li>
<li><a href="https://georgefrancis.dev/writing/create-a-liquid-hover-effect-with-gsap-and-svg/">Create a Liquid Hover Effect with GSAP &amp; SVG</a> by George Francis.</li>
<li><a href="https://jvns.ca/blog/2021/05/24/blog-about-what-you-ve-struggled-with/">Blog about what you've struggled with</a> by Julia Evans.</li>
<li><a href="https://adactio.com/journal/18117">The cage</a> by Jeremy Keith.</li>
<li><a href="https://chias.blog/2021/in-defense-of-disorder-on-career-creativity-and-professionalism/">In defense of disorder: on career, creativity, and professionalism</a> by Chiara Amisola.</li>
</ul>
<p>Other bookmarks</p>
<ul>
<li><a href="https://www.aljazeera.com/features/2021/3/10/how-portugal-silenced-centuries-of-violence-and-trauma">How Portugal silenced ‘centuries of violence and trauma’</a> by Ana Naomi de Sousa.</li>
<li><a href="https://twitter.com/cdespinosa/status/1371162640173559810">All culture is cancel culture </a>(via twitter).</li>
<li><a href="https://www.latimes.com/opinion/op-ed/la-xpm-2013-apr-07-la-oe-0407-silk-ring-theory-20130407-story.html">How not to say the wrong thing by Susan Silk</a> and Barry Goldman.</li>
<li><a href="https://twitter.com/wank_666/status/1376580978311901186">Crab mentality</a> (via twitter).</li>
<li><a href="https://twitter.com/joulee/status/1377645731515822081">My identity = my job has a dark side</a> (via twitter).</li>
<li><a href="https://www.theguardian.com/news/2021/apr/06/letting-go-my-battle-to-help-my-parents-die-a-good-death">Letting go: my battle to help my parents die a good death</a> by Kate Clanchy.</li>
<li><a href="https://www.polygon.com/22358945/wii-fit-nintendo-health-ring-fit-adventure">For some, Wii Fit’s legacy is body shame</a> by Ana Diaz.</li>
<li><a href="https://www.irishtimes.com/culture/books/kevin-power-my-first-novel-was-a-hit-i-could-write-full-time-and-that-made-me-angry-1.4543526">My first novel was a hit. I could write full-time. And that made me … angry</a> by Kevin Power.</li>
<li><a href="https://www.vice.com/en/article/y3dmav/what-does-it-cost-to-go-on-rupauls-drag-race">Shantay, You Pay: Inside the Heavy Financial Burden of Going On ‘Drag Race’</a> by Rachel Miller.</li>
<li><a href="https://www.theguardian.com/politics/2021/may/13/eu-citizens-arriving-in-uk-being-locked-up-and-expelled">EU citizens arriving in UK being locked up and expelled</a> by Giles Tremlett and Lisa O'Carroll.</li>
<li><a href="https://the-orbit.net/brutereason/2016/03/24/boundary-setting-vs-tone-policing">Boundary Setting vs Tone Policing</a> by Miri.</li>
<li><a href="https://annehelen.substack.com/p/just-because-your-early-career-was">Just because your early career was hell doesn't mean others' has to be</a> by Anne Helen Petersen.</li>
<li><a href="https://amyhupe.co.uk/articles/hope-in-the-dark/">Hope in the dark: a post for mental health awareness week</a> by Amy Hupe.</li>
</ul>
]]></description>
      <pubDate>Thu, 03 Jun 2021 08:43:33 +0000</pubDate>
      <link>https://ohhelloana.blog/more-bookmarks-from-2021/</link>
      <dc:creator>Ana Rodrigues</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/3156658525</guid>
    </item>
    <item>
      <title><![CDATA[165+ Developer Resources I Discovered in 2020-2021]]></title>
      <description><![CDATA[<p>Since starting to actively code in 2020, I have come across many helpful resources.</p>

<p>Some I have completed and others I still have in the queue. Hopefully, they will be helpful to you as well! </p>

<h4>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#resource-types">
  </a>
  Resource Types
</h4>

<p>🎓 = Complete course on a subject(s) <br>
🧰 = Tool that makes development easier <br>
🧐 = Single article or video on a subject(s)</p>

<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#resources-lists">
  </a>
  Resources Lists
</h1>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-html">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#htmlSection">HTML</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-css">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#cssSection">CSS</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-javascript">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#jsSection">JavaScript</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-react">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#reactSection">React</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-wordpress">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#wpSection">WordPress</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-git-amp-cli">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#gitSection">Git &amp; CLI</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-hosting">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#hostingSection">Hosting</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-optimizations">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#optimizeSection">Optimizations</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-databases">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#databaseSection">Databases</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-misc-web-dev">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#miscSection">MISC Web Dev</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-career">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#careerSection">Career</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-design">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#designSection">Design</a>
</h3>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#html-resources">
  </a>
  HTML Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td><a href="https://moz.com/learn/seo/alt-text">Alt Text</a></td>
<td>Loved how it gave examples of what good alt text looks like.</td>
<td>🧐</td>
</tr>
<tr>
<td>2</td>
<td><a href="https://www.techonthenet.com/html/elements/doctype_tag.php">HTML: <code>&lt;!DOCTYPE&gt;</code> tag</a></td>
<td>Especially helpful when I was first learning HTML syntax</td>
<td>🧐</td>
</tr>
<tr>
<td>3</td>
<td><a href="https://www.w3schools.com/html/html5_semantic_elements.asp">W3S HTML5 Semantic Elements</a></td>
<td>Great quick intro to why everything shouldn't be in a <code>&lt;div&gt;</code>.</td>
<td>🧐</td>
</tr>
<tr>
<td>4</td>
<td><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element">MDN HTML elements reference</a></td>
<td>Ready to go to the next level? This guide goes even deeper in the many HTML elements.</td>
<td>🧐</td>
</tr>
<tr>
<td>5</td>
<td><a href="https://dev.opera.com/articles/new-structural-elements-in-html5/">New Structural Elements in HTML5</a></td>
<td>This guide really helped me understand elements like <code>&lt;figure&gt;</code> and <code>&lt;figcaption&gt;</code>
</td>
<td>🧐</td>
</tr>
<tr>
<td>6</td>
<td><a href="https://websitesetup.org/html5-periodical-table/">HTML5 Periodical Table</a></td>
<td>I love how interactive, yet simplified this approach is to learning the elements.</td>
<td>🧐</td>
</tr>
<tr>
<td>7</td>
<td><a href="https://javascript.info/script-async-defer">Scripts: async, defer</a></td>
<td>This taught me different ways to load JS into html files, drastically improving performance.</td>
<td>🧐</td>
</tr>
<tr>
<td>8</td>
<td><a href="https://learn.shayhowe.com/html-css/">Learn to Code HTML &amp; CSS</a></td>
<td>Took this course to prepare for the bootcamp. Great intro to HTML.</td>
<td>🎓</td>
</tr>
<tr>
<td>9</td>
<td><a href="https://learn.shayhowe.com/advanced-html-css/">Learn to Code Advanced HTML &amp; CSS</a></td>
<td>I really enjoyed the above beginner course and looking forward to taking this one.</td>
<td>🎓</td>
</tr>
<tr>
<td>10</td>
<td><a href="https://www.youtube.com/watch?v=4HuAnM6b2d8">Derek Banas Handlebars Tutorial</a></td>
<td>Not technically HTML, but it sure helps you write it efficiently. Looking forward to viewing this tutorial.</td>
<td>🧐</td>
</tr>
<tr>
<td>11</td>
<td><a href="https://metatags.io/">metatags.io</a></td>
<td>One of my favorite generators for creating meta tags for multiple social media platforms.</td>
<td>🧰</td>
</tr>
<tr>
<td>12</td>
<td><a href="https://css-tricks.com/a-complete-guide-to-links-and-buttons/">A Complete Guide to Links and Buttons</a></td>
<td>Using the right tool for the right job is never more apparent in this deep-dive comparison article.</td>
<td>🧐</td>
</tr>
<tr>
<td>13</td>
<td><a href="https://getwaves.io">getwaves.io</a></td>
<td>Love this tool! Generate svg waves, to create curved separations for page sections!</td>
<td>🧰</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#css-resources">
  </a>
  CSS Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>14</td>
<td><a href="https://getbootstrap.com/docs/5.0/getting-started/introduction/">Bootstrap Documentation</a></td>
<td>Even if I am not using the framework I love using their documentation for inspiration on common web components.</td>
<td>🧐</td>
</tr>
<tr>
<td>15</td>
<td><a href="https://css-tricks.com/specifics-on-css-specificity/">Specifics on CSS Specificity</a></td>
<td>Great breakdown by CSS-Tricks and has nice graphic examples at the end.</td>
<td>🧐</td>
</tr>
<tr>
<td>16</td>
<td><a href="https://www.w3schools.com/css/css3_box-sizing.asp">CSS Box Sizing</a></td>
<td>Very easy to approach example of how the box-model works.</td>
<td>🧐</td>
</tr>
<tr>
<td>17</td>
<td><a href="https://www.creativebloq.com/advice/tips-for-css-animation">12 tips for amazing CSS animation</a></td>
<td>This has so many good tips on creating cool animations and making sure they are performant.</td>
<td>🧐</td>
</tr>
<tr>
<td>18</td>
<td><a href="https://designcode.io/css-layout-and-animations">CSS Layout and Animations</a></td>
<td>Haven't taken this one yet, but can't wait to do so. The course designs are top notch.</td>
<td>🎓</td>
</tr>
<tr>
<td>19</td>
<td><a href="https://www.youtube.com/playlist?list=PL4cUxeGkcC9iEwigam3gTjU_7IA3W2WZA">Net Ninja SASS Tutorial</a></td>
<td>This was my first course on SASS and still refer back to it from time to time.</td>
<td>🎓</td>
</tr>
<tr>
<td>20</td>
<td><a href="https://www.youtube.com/watch?v=Zz6eOVaaelI">Learn Sass In 20 Minutes</a></td>
<td>This is great for a first primer into what SASS is.</td>
<td>🎓</td>
</tr>
<tr>
<td>21</td>
<td><a href="https://medium.com/@andrew_barnes/bem-and-sass-a-perfect-match-5e48d9bc3894">BEM and SASS: A Perfect Match</a></td>
<td>This blew my mind when introduced how BEM and SASS could be used together.</td>
<td>🧐</td>
</tr>
<tr>
<td>22</td>
<td><a href="http://getbem.com/">getbem.com</a></td>
<td>This gives an overview from the creators of the popular naming convention.</td>
<td>🧐</td>
</tr>
<tr>
<td>23</td>
<td><a href="https://css-tricks.com/bem-101/">CSS-Tricks BEM 101</a></td>
<td>I love the button examples that this article gives on how to use BEM.</td>
<td>🧐</td>
</tr>
<tr>
<td>24</td>
<td><a href="https://sparkbox.com/foundry/bem_by_example">BEM by Example </a></td>
<td>This explanation on BEM is really good, but I especially like how they have a short and full versions of the article.</td>
<td>🧐</td>
</tr>
<tr>
<td>25</td>
<td><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/display">MDN Display Docs</a></td>
<td>Everything you could ever want to know about the powerful <code>display</code> property.</td>
<td>🧐</td>
</tr>
<tr>
<td>26</td>
<td><a href="https://css-tricks.com/a-couple-of-use-cases-for-calc/">A Couple of Use Cases for Calc()</a></td>
<td>
<code>calc()</code> is one of the more powerful features in CSS and this article shows some great use cases for it.</td>
<td>🧐</td>
</tr>
<tr>
<td>27</td>
<td><a href="https://cssgrid.io">Wes Bos CSS Grid</a></td>
<td>You can't argue with free and that Wes Bos is one of the best teachers out there for development.</td>
<td>🎓</td>
</tr>
<tr>
<td>28</td>
<td><a href="https://flexbox.io">Wes Bos Flexbox</a></td>
<td>See above, but this time for Flexbox</td>
<td>🎓</td>
</tr>
<tr>
<td>29</td>
<td><a href="https://www.cssmatic.com">CSSmatic</a></td>
<td>Collection of powerful css generators for gradients, border radius, noise texture and box shadows.</td>
<td>🧰</td>
</tr>
<tr>
<td>30</td>
<td><a href="https://css-tricks.com/almanac/properties/p/position/">CSS Tricks Position</a></td>
<td>If I could have access to only one resource for the <code>position</code> property, this would be it.</td>
<td>🧐</td>
</tr>
<tr>
<td>31</td>
<td><a href="https://caniuse.com">Can I Use?</a></td>
<td>This site lets you know the browser support for every property out there.</td>
<td>🧰</td>
</tr>
<tr>
<td>32</td>
<td><a href="https://yoksel.github.io/flex-cheatsheet/">yoksel Flex Cheatsheet</a></td>
<td>I love the layout and way it lets you visually preview the flexbox properties.</td>
<td>🧐</td>
</tr>
<tr>
<td>33</td>
<td><a href="https://code.tutsplus.com/tutorials/the-30-css-selectors-you-must-memorize--net-16048">The 30 CSS Selectors You Must Memorize</a></td>
<td>When I feel like getting into the weeds of CSS selectors, (sorry BEM) this is the article I refer back to.</td>
<td>🧐</td>
</tr>
<tr>
<td>34</td>
<td><a href="http://csslint.net">CSS Lint</a></td>
<td>This tool will check your code and highlight any errors.</td>
<td>🧰</td>
</tr>
<tr>
<td>35</td>
<td><a href="https://systemfontstack.com">System Font Stack</a></td>
<td>Predefined font fallback stacks that can be plugged into a project.</td>
<td>🧰</td>
</tr>
<tr>
<td>36</td>
<td><a href="https://neumorphism.io/#c0b5b5">Neumorphism.io</a></td>
<td>This tool makes elements look like they are just under the surface of the page.</td>
<td>🧰</td>
</tr>
<tr>
<td>37</td>
<td><a href="https://www.udemy.com/course/advanced-css-and-sass/">Advanced CSS and Sass: Flexbox, Grid, Animations and More!</a></td>
<td>Bought this amazing course on Udemy but haven't gotten a chance to take it yet...one day soon though!</td>
<td>🎓</td>
</tr>
<tr>
<td>38</td>
<td><a href="https://css-scroll-shadows.now.sh/?bgColor=9d80d6&amp;shadowColor=222222&amp;pxSize=15">CSS Scroll Shadows</a></td>
<td>This tool generates shadows that appear based on scroll position with just CSS!</td>
<td>🧰</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#javascript-resources">
  </a>
  JavaScript Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>39</td>
<td><a href="https://javascript.info">javascript.info</a></td>
<td>This is one of the complete and well explained overview of JS.</td>
<td>🧐</td>
</tr>
<tr>
<td>40</td>
<td><a href="https://codebeautify.org/jsvalidate">Code Beautify</a></td>
<td>Before getting into ESlint, I really liked this tool to make sure my JS was all kosher.</td>
<td>🧰</td>
</tr>
<tr>
<td>41</td>
<td><a href="https://www.sitepoint.com/javascript-truthy-falsy/">Truthy and Falsy: When All is Not Equal in JavaScript</a></td>
<td>This article is a great refernce for all the instances that a value might be considered true or false.</td>
<td>🧐</td>
</tr>
<tr>
<td>42</td>
<td><a href="https://youtu.be/8aGhZQkoFbQ">What the heck is the event loop anyway?</a></td>
<td>I have not watched this yet, but looking forward to it.</td>
<td>🧐</td>
</tr>
<tr>
<td>43</td>
<td><a href="https://www.youtube.com/watch?v=s9wW2PpJsmQ">JavaScript Loops</a></td>
<td>If I could only watch one video to understand common JS loops, this would be the one.</td>
<td>🧐</td>
</tr>
<tr>
<td>44</td>
<td><a href="https://www.tutorialrepublic.com/javascript-tutorial/javascript-loops.php">JavaScript Loops</a></td>
<td>If I could only read one article to understand common JS loops, this would be the one.</td>
<td>🧐</td>
</tr>
<tr>
<td>45</td>
<td><a href="https://www.codecademy.com/learn/introduction-to-javascript/modules/learn-javascript-introduction/cheatsheet">Codecademy JS Cheatsheet</a></td>
<td>Totally free and a nice collection of common JS elements and concepts.</td>
<td>🧐</td>
</tr>
<tr>
<td>46</td>
<td><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String">MDN JS String</a></td>
<td>Everything I'd ever want to know about strings and where to use them.</td>
<td>🧐</td>
</tr>
<tr>
<td>47</td>
<td><a href="https://medium.com/@debbie.obrien/json-parse-v-json-stringify-4b9d104c78d0">JSON Parse v JSON Stringify</a></td>
<td>These JSON functions confused me to no end. This article really helped explain the differences.</td>
<td>🧐</td>
</tr>
<tr>
<td>48</td>
<td><a href="https://developers.google.com/speed/libraries#jquery">Google Hosted Library jQuery</a></td>
<td>Bookmark this link. :) It has the latest jQuery cdn script at all time.</td>
<td>🧰</td>
</tr>
<tr>
<td>49</td>
<td><a href="https://github.com/public-apis/public-apis/">Public APIs</a></td>
<td>Great list of public APIs that you can use projects today!</td>
<td>🧰</td>
</tr>
<tr>
<td>50</td>
<td><a href="https://dmitripavlutin.com/javascript-event-delegation/">Javascript Event Delegation</a></td>
<td>Awesome visual representation of what events are and how event delegation works.</td>
<td>🧐</td>
</tr>
<tr>
<td>51</td>
<td><a href="https://www.freecodecamp.org/news/var-let-and-const-whats-the-difference/">Var, Let, and Const – What's the Difference?</a></td>
<td>Great introduction to the different variable types (and why <code>var</code> is trash.)</td>
<td>🧐</td>
</tr>
<tr>
<td>52</td>
<td><a href="https://dmitripavlutin.com/differences-between-arrow-and-regular-functions/">5 Differences Between Arrow and Regular Functions</a></td>
<td>I love how this demystifies how the two function types are used.</td>
<td>🧐</td>
</tr>
<tr>
<td>53</td>
<td><a href="https://www.youtube.com/watch?v=0ik6X4DJKCc">JavaScript DOM Crash Course - Part 1</a></td>
<td>Discover how to select elements in the DOM to be used with JS</td>
<td>🎓</td>
</tr>
<tr>
<td>54</td>
<td><a href="https://www.youtube.com/watch?v=mPd2aJXCZ2g">JavaScript DOM Crash Course - Part 2</a></td>
<td>Learn the basics of how to traverse the DOM.</td>
<td>🎓</td>
</tr>
<tr>
<td>55</td>
<td><a href="https://www.youtube.com/watch?v=wK2cBMcDTss">JavaScript DOM Crash Course - Part 3</a></td>
<td>Learn how to attach attach events to DOM elements.</td>
<td>🎓</td>
</tr>
<tr>
<td>56</td>
<td><a href="https://www.youtube.com/watch?v=i37KVt_IcXw">JavaScript DOM Crash Course - Part 4</a></td>
<td>Build a small project based on the last 3 videos.</td>
<td>🎓</td>
</tr>
<tr>
<td>57</td>
<td><a href="https://www.digitalocean.com/community/tutorials/introduction-to-the-dom">Introduction to the DOM</a></td>
<td>Another great resource on the DOM, this quick article will get you up and running.</td>
<td>🧐</td>
</tr>
<tr>
<td>58</td>
<td><a href="https://www.youtube.com/playlist?list=PL4cUxeGkcC9jx2TTZk3IGWKSbtugYdrlu">Asynchronous Javascript</a></td>
<td>I forgot I bookmarked this until now. This an awesome free course by the Net Ninja.</td>
<td>🧐</td>
</tr>
<tr>
<td>59</td>
<td><a href="https://www.codewars.com/kata/54c27a33fb7da0db0100040e/train/javascript">Code Wars Kata</a></td>
<td>This awesomely themed training tool lets you practice your sweet Javascript skills.</td>
<td>🧰</td>
</tr>
<tr>
<td>60</td>
<td><a href="https://www.sitepoint.com/event-bubbling-javascript/">What Is Event Bubbling in JavaScript?</a></td>
<td>Another great resource on what event bubbling is and how to take advantage of it.</td>
<td>🧐</td>
</tr>
<tr>
<td>61</td>
<td><a href="https://www.sitepoint.com/javascript-event-delegation-is-easier-than-you-think/">JavaScript Event Delegation is Easier than You Think</a></td>
<td>Learn how to trigger and listen to events correctly.</td>
<td>🧐</td>
</tr>
<tr>
<td>62</td>
<td><a href="http://www.quirksmode.org/js/events_properties.html#target">Which HTML element is the target of the event?</a></td>
<td>Find out which element was interacted with.</td>
<td>🧐</td>
</tr>
<tr>
<td>63</td>
<td><a href="https://scotch.io/tutorials/understanding-scope-in-javascript">Understanding Scope in JavaScript</a></td>
<td>Love the design of this site and it does a thorough job of explaining scope.</td>
<td>🧐</td>
</tr>
<tr>
<td>64</td>
<td><a href="https://medium.com/til-js/different-ways-of-writing-a-function-in-javascript-part-i-80d9a9e0138b">Different ways of writing a function in JavaScript</a></td>
<td>Quick article on how to write a "Function Declaration" function.</td>
<td>🧐</td>
</tr>
<tr>
<td>65</td>
<td><a href="https://www.softauthor.com/javascript-image-slider-slideshow-carousel/">JavaScript Image Slider for Beginners</a></td>
<td>This teaches how to build a simple image slider with Vanilla JS.</td>
<td>🧐</td>
</tr>
<tr>
<td>66</td>
<td><a href="https://testingjavascript.com">Learn the smart, efficient way to test any JavaScript application.</a></td>
<td>I have not taken this one yet, but looking forward to it—as it is such an important subject!</td>
<td>🎓</td>
</tr>
<tr>
<td>67</td>
<td><a href="https://www.udemy.com/course/js-algorithms-and-data-structures-masterclass/">JavaScript Algorithms and Data Structures Masterclass</a></td>
<td>I am not a fan of algorithms, but that is why I have this course bookmarked!</td>
<td>🧐</td>
</tr>
<tr>
<td>68</td>
<td><a href="https://teamtreehouse.com/library/ajax-basics-2">AJAX Basics</a></td>
<td>Everything you ever wanted to know about making AJAX requests to a web server.</td>
<td>🎓</td>
</tr>
<tr>
<td>69</td>
<td><a href="https://www.taniarascia.com/how-to-connect-to-an-api-with-javascript/">How to Connect to an API with JavaScript</a></td>
<td>This article really helped me understand how API calls can be used in projects.</td>
<td>🧐</td>
</tr>
<tr>
<td>70</td>
<td><a href="https://www.taniarascia.com/how-to-use-json-data-with-php-or-javascript/">JSON Tutorial: Request API Data with JavaScript or PHP</a></td>
<td>It's so interesting to see how PHP and JavaScript handle JSON differently.</td>
<td>🧐</td>
</tr>
<tr>
<td>71</td>
<td><a href="https://barnabas.hashnode.dev/basics-of-javascript-reduce-method-ckdk81c6402y7zzs1f13p4x7t">Basics Of JavaScript Reduce Method</a></td>
<td>This short article does such a great job of breaking down this powerful JS method.</td>
<td>🧐</td>
</tr>
<tr>
<td>72</td>
<td><a href="https://blog.logrocket.com/axios-or-fetch-api/#:~:text=To%20send%20data%2C%20fetch(),set%20in%20the%20options%20object">Axios or fetch(): Which should you use? </a></td>
<td>I tend to reach for Axios, but this article does a great job explaining both.</td>
<td>🧐</td>
</tr>
<tr>
<td>73</td>
<td><a href="https://www.codecademy.com/learn/introduction-to-javascript">Learn JavaScript  Start </a></td>
<td>I took this 30-hour course and it is amazing. Does a great job explaining the basics.</td>
<td>🎓</td>
</tr>
<tr>
<td>74</td>
<td><a href="https://validatejs.org">validatejs.org</a></td>
<td>Great tool to use on sign-up and login forms to make sure the user data is correct.</td>
<td>🧰</td>
</tr>
<tr>
<td>75</td>
<td><a href="https://www.youtube.com/watch?v=ymmtEgp0Tuc">HTML5 Canvas Tutorial for Beginners</a></td>
<td>As a designer, this is one I am very excited about diving into.</td>
<td>🧐</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#react-resources">
  </a>
  React Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>76</td>
<td><a href="https://ihatetomatoes.net/wp-content/uploads/2017/01/react-cheat-sheet-v1.pdf">React Cheat Sheet</a></td>
<td>Quick and easy to skim cheat sheet on common React patterns and pieces.</td>
<td>🧰</td>
</tr>
<tr>
<td>77</td>
<td><a href="https://advancedreact.com">Fullstack Advanced  React &amp; GraphQL</a></td>
<td>Little pricer then Udemy, but no one teaches like Wes Bos. Hopefully will be able to purchase this one soon.</td>
<td>🎓</td>
</tr>
<tr>
<td>78</td>
<td><a href="https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en">React Developer Tools</a></td>
<td>This lets you view props, components, renders and more right in Chrome DevTools</td>
<td>🧰</td>
</tr>
<tr>
<td>79</td>
<td><a href="https://react-icons.github.io/react-icons/">React Icons</a></td>
<td>This is one of my favorite icon packages, because it has almost every major icon library out there.</td>
<td>🧰</td>
</tr>
<tr>
<td>80</td>
<td><a href="https://www.udemy.com/course/react-the-complete-guide-incl-redux/">React - The Complete Guide (incl Hooks, React Router, Redux)</a></td>
<td>One of my favorite courses and has prepared me so much to code in React.</td>
<td>🎓</td>
</tr>
<tr>
<td>81</td>
<td><a href="https://daveceddia.com/usereducer-hook-examples/">Examples of the useReducer Hook</a></td>
<td>This article / video breaks down a very cool hook lets you get a "Redux-like" store without downloading the library.</td>
<td>🧐</td>
</tr>
<tr>
<td>82</td>
<td><a href="https://mdxjs.com/getting-started">MDX Documentation</a></td>
<td>This syntax combines JSX and Markdown in one!</td>
<td>🎓</td>
</tr>
<tr>
<td>83</td>
<td><a href="https://reactfordesigners.com">React For Designers</a></td>
<td>This features some great courses and beginner projects for getting started in React.</td>
<td>🎓</td>
</tr>
<tr>
<td>84</td>
<td><a href="https://github.com/react-bootstrap/react-router-bootstrap">React Router Bootstrap</a></td>
<td>Get the power of React Router navigation and the stylings of Bootstrap mixed into one.</td>
<td>🧰</td>
</tr>
<tr>
<td>85</td>
<td><a href="https://github.com/nfl/react-helmet">React Helmet</a></td>
<td>I really want to learn this package. It lets you add SEO meta tags to different "React Pages"</td>
<td>🧰</td>
</tr>
<tr>
<td>86</td>
<td><a href="https://web.dev/code-splitting-suspense/?utm_source=lighthouse&amp;utm_medium=devtools">Code splitting with React.lazy and Suspense</a></td>
<td>This really works! After implementing on my website my performance scores improved.</td>
<td>🧐</td>
</tr>
<tr>
<td>87</td>
<td><a href="https://react.rocks/tag/Validation">33 Validation Examples</a></td>
<td>Awesome collection of form validation and demo code for React.</td>
<td>🧐</td>
</tr>
<tr>
<td>88</td>
<td><a href="https://www.reddit.com/r/learnjavascript/comments/ifqa03/37_reactjs_basics_useref_hook/">37 ReactJS basics useRef Hook</a></td>
<td>Helpful video on how to work with the React hook <code>useRef</code>.</td>
<td>🧐</td>
</tr>
<tr>
<td>89</td>
<td><a href="https://www.npmjs.com/package/react-validation">npm react-validation</a></td>
<td>Robust package to set up form validation. Need to dive deeper one day to learn all it can do.</td>
<td>🧰</td>
</tr>
<tr>
<td>90</td>
<td><a href="https://github.com/formsy/formsy-react/">Formsy React</a></td>
<td>This package lets you build custom forms and it takes care of the validation for you.</td>
<td>🧰</td>
</tr>
<tr>
<td>91</td>
<td><a href="https://styled-components.com">Styled Componets</a></td>
<td>A favorite with React users, allowing you to create CSS focused custom components.</td>
<td>🧰</td>
</tr>
<tr>
<td>92</td>
<td><a href="https://medium.com/@ttennant/react-inline-styles-and-media-queries-using-a-custom-react-hook-e76fa9ec89f6">React inline styles and media queries using a custom React Hook</a></td>
<td>This article helped me mimic responsive styling within the JSX environment.</td>
<td>🧐</td>
</tr>
<tr>
<td>93</td>
<td><a href="https://react-bootstrap.github.io/getting-started/introduction/">React Bootstrap</a></td>
<td>Really good documentation on using bootstrap with React.</td>
<td>🧐</td>
</tr>
<tr>
<td>94</td>
<td><a href="https://www.youtube.com/watch?v=3zoIigieur0">React Redux Using Hooks</a></td>
<td>Work with the modern Hook syntax for Redux. This saved me so much time!</td>
<td>🧐</td>
</tr>
<tr>
<td>95</td>
<td><a href="https://stackoverflow.com/questions/37755997/why-cant-i-directly-modify-a-components-state-really">Why can't I directly modify a component's state, really?</a></td>
<td>This explains so well why you must use <code>setState</code> for changing state in class components.</td>
<td>🧐</td>
</tr>
<tr>
<td>96</td>
<td><a href="https://blog.bitsrc.io/react-communication-between-components-c0cfccfa996a">React: Communication Between Components</a></td>
<td>Great deep dive into how React components pass data to one another.</td>
<td>🧐</td>
</tr>
<tr>
<td>97</td>
<td><a href="https://www.freecodecamp.org/news/how-to-identify-and-resolve-wasted-renders-in-react-cc4b1e910d10/">How to identify and resolve wasted renders in React</a></td>
<td>Performance is everything and this teaches how to work with renders correctly.</td>
<td>🧐</td>
</tr>
<tr>
<td>98</td>
<td><a href="https://reactjs.org/docs/components-and-props.html">Components and Props</a></td>
<td>One of the core and most visited pages in the React Documentation for me.</td>
<td>🧐</td>
</tr>
<tr>
<td>99</td>
<td><a href="https://medium.com/@samueldinesh/setting-up-redux-devtools-a-simple-guide-3b386a6254fa">Setting Up Redux DevTools</a></td>
<td>Redux DevTools is not the most straightforward thing for me to set up, but this helped explain the process well.</td>
<td>🧐</td>
</tr>
<tr>
<td>100</td>
<td><a href="https://www.reddit.com/r/learnjavascript/comments/ipfikv/stuck_with_learning_react_redux_i_am_making_a/?utm_source=share&amp;utm_medium=ios_app&amp;utm_name=iossmf">React Redux Easy Peasy Course</a></td>
<td>Haven't watched this beginner course on Redux yet, but heard good things.</td>
<td>🎓</td>
</tr>
<tr>
<td>101</td>
<td><a href="https://www.gatsbyjs.org/">Gatsby JS</a></td>
<td>So excited to work with this static site generator very soon.</td>
<td>🧰</td>
</tr>
<tr>
<td>102</td>
<td><a href="https://www.udemy.com/course/mern-stack-front-to-back/">MERN Stack Front To Back</a></td>
<td>Purchased this course but have not taken it yet. Very excited to do so soon as it covers so much.</td>
<td>🎓</td>
</tr>
<tr>
<td>103</td>
<td><a href="https://www.udemy.com/course/react-native-the-practical-guide/">React Native The Practical Guide</a></td>
<td>In the middle of taking this now and love all the detail it goes into.</td>
<td>🎓</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#wordpress-resources">
  </a>
  WordPress Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>104</td>
<td><a href="https://www.youtube.com/watch?v=-h7gOJbIpmo">How to Create a Custom WordPress Theme - Full Course</a></td>
<td>Wonderful introduction to custom theming in WordPress.</td>
<td>🎓</td>
</tr>
<tr>
<td>105</td>
<td><a href="https://www.youtube.com/playlist?list=PLC5E59DD6D84D34DC">WordPress Basics</a></td>
<td>All the videos are very well broken out.</td>
<td>🎓</td>
</tr>
<tr>
<td>106</td>
<td><a href="https://www.youtube.com/playlist?list=PLriKzYyLb28nUFbe0Y9d-19uVkOnhYxFE">WordPress 101 for Beginner Developers</a></td>
<td>Another great playlist on the basics of WordPress.</td>
<td>🎓</td>
</tr>
<tr>
<td>107</td>
<td><a href="https://www.youtube.com/playlist?list=PLriKzYyLb28kpEnFFi9_vJWPf5-_7d3rX">Create a Premium WordPress Theme</a></td>
<td>Haven't taken this one, but there are a lot of helpful video topics in this playlist.</td>
<td>🎓</td>
</tr>
<tr>
<td>108</td>
<td><a href="https://www.youtube.com/playlist?list=PLLnpHn493BHGACfv4rC29kJamYMtw34D9">Customizing WordPress</a></td>
<td>Really helpful playlist on advanced WordPress theme topics.</td>
<td>🎓</td>
</tr>
<tr>
<td>109</td>
<td><a href="https://www.udemy.com/course/wordpress-intermediate/">WordPress Intermediate Skills</a></td>
<td>I like that this course covers working with a server as well.</td>
<td>🎓</td>
</tr>
<tr>
<td>110</td>
<td><a href="https://www.youtube.com/watch?v=OriRDlUbAFg">How to install WordPress on your local computer with MAMP (Mac)</a></td>
<td>This video taught me how to work with WordPress locally on my machine.</td>
<td>🧐</td>
</tr>
<tr>
<td>111</td>
<td><a href="https://wphierarchy.com/">wphierarchy.com</a></td>
<td>This website does a great job in explaining all the different file types in WordPress and their importance levels.</td>
<td>🧐</td>
</tr>
<tr>
<td>112</td>
<td><a href="https://developer.wordpress.org/themes/basics/including-css-javascript/">Including CSS &amp; JavaScript</a></td>
<td>Documentation on using CSS &amp; JS in WordPress.</td>
<td>🧐</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#git-amp-cli-resources">
  </a>
  Git &amp; CLI Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>113</td>
<td><a href="https://www.atlassian.com/git/tutorials/comparing-workflows">Comparing Git Workflows</a></td>
<td>This was so helpful in understanding there are different Git workflows for each team need.</td>
<td>🧐</td>
</tr>
<tr>
<td>114</td>
<td><a href="https://commandlinepoweruser.com/">Command Line Power User</a></td>
<td>Can't wait to become a true terminal master with this course.</td>
<td>🎓</td>
</tr>
<tr>
<td>115</td>
<td><a href="https://learngitbranching.js.org/">Learn Git Branching</a></td>
<td>This interactive course was so helpful in understanding how branching worked.</td>
<td>🎓</td>
</tr>
<tr>
<td>116</td>
<td><a href="https://www.youtube.com/watch?v=oFYyTZwMyAg">GITHUB PULL REQUEST, Branching, Merging &amp; Team Workflow</a></td>
<td>Great overview of how it looks to work with a team in a Git workflow.</td>
<td>🧐</td>
</tr>
<tr>
<td>117</td>
<td><a href="https://guides.github.com/features/mastering-markdown/">Mastering Markdown</a></td>
<td>Such a great resource for seeing common Markdown syntax and upgrading Git README</td>
<td>🧐</td>
</tr>
<tr>
<td>118</td>
<td><a href="https://www.quora.com/What-is-the-difference-between-the-add-and-commit-commands-in-Git">Mastering Markdown</a></td>
<td>Super helpful when I first started using Git for version control.</td>
<td>🧐</td>
</tr>
<tr>
<td>119</td>
<td><a href="https://reactsensei.com/basic-git-commands/">Basic Git Commands</a></td>
<td>Another great cheat sheet on common git commands.</td>
<td>🧐</td>
</tr>
<tr>
<td>120</td>
<td><a href="https://guides.github.com/activities/hello-world/">GitHub Guide Hello World</a></td>
<td>Get started with Github with this very user friendly guide.</td>
<td>🧐</td>
</tr>
<tr>
<td>121</td>
<td><a href="http://rogerdudler.github.io/git-guide/">Git Commands</a></td>
<td>Very visual approach for common Git commands.</td>
<td>🧐</td>
</tr>
<tr>
<td>122</td>
<td><a href="https://shortcode.dev/git-cheatsheet#git-cheatsheet">Short Code Git Cheat Sheet</a></td>
<td>Searchable cheatsheet</td>
<td>🧐</td>
</tr>
<tr>
<td>123</td>
<td><a href="https://www.codecademy.com/articles/command-line-commands">List of Command Line Commands</a></td>
<td>Awesome list by Codecademy on many CLI terminal commands.</td>
<td>🧐</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#hosting-resources">
  </a>
  Hosting Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>124</td>
<td><a href="https://www.netlify.com/products/build/">Netlify Build</a></td>
<td>Awesome Netlify process to trigger builds to the live site once a specific branch is updated.</td>
<td>🧰</td>
</tr>
<tr>
<td>125</td>
<td><a href="https://www.youtube.com/playlist?list=PLzlG0L9jlhEPMR8haUPkxj2hJ_3jh5qa6">Netlify Tutorials</a></td>
<td>Free course to get up and running with Netlify hosting</td>
<td>🎓</td>
</tr>
<tr>
<td>126</td>
<td><a href="https://www.youtube.com/watch?v=6ElQ689HRcY">Simple Contact Form Submission With Netlify</a></td>
<td>Easy tutorial on how to set up Netlify as the mail server.</td>
<td>🧐</td>
</tr>
<tr>
<td>127</td>
<td><a href="https://www.youtube.com/watch?v=6r9NJDHiJwA">PHPStorm FTP Server Connection to Remote Host </a></td>
<td>Tutorial on how to connect with SFTP or FTP with PHPStorm. (It makes it a joy compared to VS Code)</td>
<td>🧐</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#optimization-resources">
  </a>
  Optimization Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>128</td>
<td><a href="https://teamtreehouse.com/library/front-end-web-optimization-workflow">Front End Web Optimization Workflow</a></td>
<td>Can't wait to take this one and learn about CDNs and optimizing assets</td>
<td>🎓</td>
</tr>
<tr>
<td>129</td>
<td><a href="https://yoast.com/rel-canonical/"><code>rel=canonical</code>: the ultimate guide</a></td>
<td>Such a good description of what Canonical urls are and where to use them.</td>
<td>🧐</td>
</tr>
<tr>
<td>130</td>
<td><a href="https://developer.mozilla.org/en-US/docs/Web/Performance/Lazy_loading">MDN Lazy Loading</a></td>
<td>Great place to start to learn how Lazy loading works.</td>
<td>🧐</td>
</tr>
<tr>
<td>131</td>
<td><a href="https://hackernoon.com/seo-web-development-tutorial-for-beginners-7273308b6448">SEO Web Development Tutorial for Beginners</a></td>
<td>Awesome intro for what SEO is and how to approach it.</td>
<td>🧐</td>
</tr>
<tr>
<td>132</td>
<td><a href="https://moz.com/learn/seo/page-speed">MOZ Page Speed</a></td>
<td>This shows a bunch of areas to check for poor page speeds.</td>
<td>🧐</td>
</tr>
<tr>
<td>133</td>
<td><a href="https://remysharp.com/2015/10/14/the-art-of-debugging">The Art of Debugging</a></td>
<td>Fascinating deep dive on the process of debugging a website and tools to help.</td>
<td>🧐</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#databases-resources">
  </a>
  Databases Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>134</td>
<td><a href="https://www.freecodecamp.org/news/introduction-to-mongoose-for-mongodb-d2a7aa593c57">Introduction to Mongoose for MongoDB</a></td>
<td>This article thoroughly explains what MongoDB is and why it is essential to use Mongoose with it.</td>
<td>🧐</td>
</tr>
<tr>
<td>135</td>
<td><a href="https://medium.com/@atingenkay/restful-routes-what-are-they-8fe221521bb">Restful Routes, What are they?</a></td>
<td>I did not fully understand RESTful API calls until reading this.</td>
<td>🧐</td>
</tr>
<tr>
<td>136</td>
<td><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status">HTTP response status codes</a></td>
<td>Code 418 is the best. ;)</td>
<td>🧐</td>
</tr>
<tr>
<td>137</td>
<td><a href="http://www.passportjs.org/docs/">Passport</a></td>
<td>Great tool to use for full-stack user authentication</td>
<td>🧰</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#misc-web-dev-resources">
  </a>
  MISC Web Dev Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>138</td>
<td><a href="https://www.youtube.com/watch?v=OdQtww8ZfEw">Working with Code Written by Someone Else</a></td>
<td>Wonderful tips in how to explore a new codebase.</td>
<td>🧐</td>
</tr>
<tr>
<td>139</td>
<td><a href="https://www.tablesgenerator.com/markdown_tables">Markdown Table Generator</a></td>
<td>This is how I made the tables in this post ;)</td>
<td>🧰</td>
</tr>
<tr>
<td>140</td>
<td><a href="https://facebook.github.io/jest/">Jest</a></td>
<td>One of the industry testing frameworks used for test driven development.</td>
<td>🧰</td>
</tr>
<tr>
<td>141</td>
<td><a href="https://get.foundation/emails.html">Foundation for Emails</a></td>
<td>This framework makes it easy to code responsive HTML emails.</td>
<td>🧰</td>
</tr>
<tr>
<td>142</td>
<td><a href="https://www.youtube.com/playlist?list=PLR_ZJO3q73HalAe5sRs7ByjHvptmbflsL">Zurb Foundation for Email Course</a></td>
<td>Great course for the above email framework.</td>
<td>🎓</td>
</tr>
<tr>
<td>143</td>
<td><a href="https://www.npmjs.com/package/dotenv">NPM dotenv</a></td>
<td>This package lets you secure sensitive information like API keys within projects.</td>
<td>🧰</td>
</tr>
<tr>
<td>144</td>
<td><a href="https://typing.io/">typing.io</a></td>
<td>I used this before the bootcamp to practice typing code faster.</td>
<td>🧰</td>
</tr>
<tr>
<td>145</td>
<td><a href="https://developers.google.com/maps/documentation/">Google Maps Platform Documentation</a></td>
<td>Api documentation for using Google Maps in projects.</td>
<td>🧐</td>
</tr>
<tr>
<td>146</td>
<td><a href="https://auth0.com/blog/what-is-and-how-does-single-sign-on-work/">What Is and How Does Single Sign-On Authentication Work?</a></td>
<td>This was so helpful in helping me understand at a high-level how SSO works</td>
<td>🧐</td>
</tr>
<tr>
<td>147</td>
<td><a href="https://www.searchenginejournal.com/subdomains-vs-subfolders-seo/239795/#close">Subdomains vs. Subfolders: Which Is Better for SEO &amp; Why?</a></td>
<td>Very interesting article on how to structure loosely related web content.</td>
<td>🧐</td>
</tr>
<tr>
<td>148</td>
<td><a href="https://favicon.io/favicon-generator/">favicon.io</a></td>
<td>This is my favorite Favicon generator (small icon in browser tab) and has a great interface.</td>
<td>🧰</td>
</tr>
<tr>
<td>149</td>
<td><a href="https://github.com/wesbos/eslint-config-wesbos">Wes Bos Eslint Config</a></td>
<td>Download the settings that Wes Bos uses for linting his code.</td>
<td>🧐</td>
</tr>
<tr>
<td>150</td>
<td><a href="https://docs.emmet.io/cheat-sheet/">Emmet Cheat Sheet</a></td>
<td>Super helpful reference to common Emmet commands in multiple languages</td>
<td>🧐</td>
</tr>
<tr>
<td>151</td>
<td><a href="https://www.jetbrains.com/phpstorm/documentation/">Learn Jetbrains PHPStorm IDE</a></td>
<td>This became my favorite IDE and love all their resources on how to use it correctly.</td>
<td>🧐</td>
</tr>
<tr>
<td>152</td>
<td><a href="https://www.youtube.com/watch?v=yc3J2TGreBo">Agile Scrum Development Process and How UI/UX Design Fit In</a></td>
<td>Really good overview of how Agile workflows are set up.</td>
<td>🧐</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#career-resources">
  </a>
  Career Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>153</td>
<td><a href="https://medium.com/@archie4321/the-golden-guide-to-landing-a-developer-position-c78ad34a965f">The Golden Guide to Landing a Developer Position</a></td>
<td>An incredible guide on preparing hiring material like resumes to interviewing with examples.</td>
<td>🧐</td>
</tr>
<tr>
<td>154</td>
<td><a href="https://www.coursera.org/learn/learning-how-to-learn?action=enroll">Learn How To Learn</a></td>
<td>Can't wait to take this one and learn how to be a better "learner".</td>
<td>🎓</td>
</tr>
<tr>
<td>155</td>
<td><a href="https://www.glassdoor.com/blog/common-interview-questions/">Glassdoor Common Interview Questions</a></td>
<td>List of 50 questions that can be asked in interviews</td>
<td>🧐</td>
</tr>
<tr>
<td>156</td>
<td><a href="https://www.themuse.com/advice/how-to-tackle-something-you-have-no-idea-how-to-do">How to Tackle Something You Have No Idea How to Do</a></td>
<td>This is one of my favorite articles and I often refer back to it for motivation.</td>
<td>🧐</td>
</tr>
<tr>
<td>157</td>
<td><a href="https://coding-bootcamp-whiteboarding-algorithms.readthedocs-hosted.com/en/latest/modules/practicing-for-the-whiteboarding-interview/">Practice for the Whiteboarding Interview</a></td>
<td>Helpful links and guide to doing a Whiteboarding interview.</td>
<td>🎓</td>
</tr>
<tr>
<td>158</td>
<td><a href="https://m.youtube.com/watch?v=XKu_SEDAykw&amp;feature=youtu.be">How to: Work at Google — Example Coding/Engineering Interview</a></td>
<td>Very interesting to see the level of interviewing at Google.</td>
<td>🧐</td>
</tr>
<tr>
<td>159</td>
<td><a href="https://www.jobscan.co/">jobscan.co</a></td>
<td>Helpful site that optimizes cover letters and resumes.</td>
<td>🧰</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#design-resources">
  </a>
  Design Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>160</td>
<td><a href="https://teamtreehouse.com/library/rapid-website-prototyping">Rapid Website Prototyping</a></td>
<td>Learning how to quickly mockup feature ideas and this covers many important areas of how to do it.</td>
<td>🎓</td>
</tr>
<tr>
<td>161</td>
<td><a href="https://teamtreehouse.com/tracks/ux-design">Tree House UX Design</a></td>
<td>This course covers so many important UX subjects and how to think through design.</td>
<td>🎓</td>
</tr>
<tr>
<td>162</td>
<td><a href="https://youtube.com/playlist?list=PLXC_gcsKLD6n7p6tHPBxsKjN5hA_quaPI">Flux Free Web Design Course 2020</a></td>
<td>One of the best free courses in the basics of Web Design.</td>
<td>🎓</td>
</tr>
<tr>
<td>163</td>
<td><a href="https://www.youtube.com/watch?v=H18PvAKtkSY&amp;list=PLxjRS2tWLJdE-FS4tpsfyjN3eF_XxkbAY&amp;index=11">Build it in Figma: Design a responsive website</a></td>
<td>This video goes deep into using auto layout in Figma.</td>
<td>🧐</td>
</tr>
<tr>
<td>164</td>
<td><a href="https://www.youtube.com/watch?v=rfAdJYLRVqI&amp;list=PLxjRS2tWLJdE-FS4tpsfyjN3eF_XxkbAY&amp;index=9">In the file: A look into building selection colors and OpenType</a></td>
<td>Haven't seen this one yet, but can't wait to go through it.</td>
<td>🧐</td>
</tr>
<tr>
<td>165</td>
<td><a href="https://www.youtube.com/watch?v=TkKm87Crfns">In the File: Making data-informed design decisions</a></td>
<td>Such a fascinating webinar on how big brands take data into account when creating designs or making changes.</td>
<td>🧐</td>
</tr>
<tr>
<td>166</td>
<td><a href="https://www.youtube.com/watch?v=8RFDPC_Fsnc">In the File: Developer and designer, working together to build design systems</a></td>
<td>Another one I can't wait to watch. Truly effective teams have clear communication between design and development early in the process.</td>
<td>🧐</td>
</tr>
<tr>
<td>167</td>
<td><a href="https://youtu.be/WPRD8_L6hf0">Build it in Figma: Design a responsive website navigation</a></td>
<td>There are many design tidbits and Figma tricks backed into this one.</td>
<td>🧐</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#nice-job-making-it-to-the-end">
  </a>
  Nice job making it to the end!
</h3>

<p>Here is a happy dance Gif to celebrate upgrading your sweet skills!</p>

<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DTK4dbnX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://i.gifer.com/CFSn.gif" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DTK4dbnX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://i.gifer.com/CFSn.gif" alt="Napoleon Dynomite Happy Dance"></a></p>




<p><em>Thumbnail designed with <a href="https://www.adobe.com/">photoshop</a> and <a href="https://unsplash.com/photos/w7ZyuGYNpRQ">unsplash</a></em></p>

]]></description>
      <pubDate>Mon, 26 Apr 2021 12:56:03 +0000</pubDate>
      <link>https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma</link>
      <dc:creator>DEV Community</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/3062254618</guid>
    </item>
    <item>
      <title><![CDATA[165+ Developer Resources I Discovered in 2020-2021]]></title>
      <description><![CDATA[<p>Since starting to actively code in 2020, I have come across many helpful resources.</p>

<p>Some I have completed and others I still have in the queue. Hopefully, they will be helpful to you as well! </p>

<h4>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#resource-types">
  </a>
  Resource Types
</h4>

<p>🎓 = Complete course on a subject(s) <br>
🧰 = Tool that makes development easier <br>
🧐 = Single article or video on a subject(s)</p>

<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#resources-lists">
  </a>
  Resources Lists
</h1>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-html">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#htmlSection">HTML</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-css">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#cssSection">CSS</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-javascript">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#jsSection">JavaScript</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-react">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#reactSection">React</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-wordpress">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#wpSection">WordPress</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-git-amp-cli">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#gitSection">Git &amp; CLI</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-hosting">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#hostingSection">Hosting</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-optimizations">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#optimizeSection">Optimizations</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-databases">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#databaseSection">Databases</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-misc-web-dev">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#miscSection">MISC Web Dev</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-career">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#careerSection">Career</a>
</h3>

<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#-design">
  </a>
  • <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#designSection">Design</a>
</h3>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#html-resources">
  </a>
  HTML Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td><a href="https://moz.com/learn/seo/alt-text">Alt Text</a></td>
<td>Loved how it gave examples of what good alt text looks like.</td>
<td>🧐</td>
</tr>
<tr>
<td>2</td>
<td><a href="https://www.techonthenet.com/html/elements/doctype_tag.php">HTML: <code>&lt;!DOCTYPE&gt;</code> tag</a></td>
<td>Especially helpful when I was first learning HTML syntax</td>
<td>🧐</td>
</tr>
<tr>
<td>3</td>
<td><a href="https://www.w3schools.com/html/html5_semantic_elements.asp">W3S HTML5 Semantic Elements</a></td>
<td>Great quick intro to why everything shouldn't be in a <code>&lt;div&gt;</code>.</td>
<td>🧐</td>
</tr>
<tr>
<td>4</td>
<td><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element">MDN HTML elements reference</a></td>
<td>Ready to go to the next level? This guide goes even deeper in the many HTML elements.</td>
<td>🧐</td>
</tr>
<tr>
<td>5</td>
<td><a href="https://dev.opera.com/articles/new-structural-elements-in-html5/">New Structural Elements in HTML5</a></td>
<td>This guide really helped me understand elements like <code>&lt;figure&gt;</code> and <code>&lt;figcaption&gt;</code>
</td>
<td>🧐</td>
</tr>
<tr>
<td>6</td>
<td><a href="https://websitesetup.org/html5-periodical-table/">HTML5 Periodical Table</a></td>
<td>I love how interactive, yet simplified this approach is to learning the elements.</td>
<td>🧐</td>
</tr>
<tr>
<td>7</td>
<td><a href="https://javascript.info/script-async-defer">Scripts: async, defer</a></td>
<td>This taught me different ways to load JS into html files, drastically improving performance.</td>
<td>🧐</td>
</tr>
<tr>
<td>8</td>
<td><a href="https://learn.shayhowe.com/html-css/">Learn to Code HTML &amp; CSS</a></td>
<td>Took this course to prepare for the bootcamp. Great intro to HTML.</td>
<td>🎓</td>
</tr>
<tr>
<td>9</td>
<td><a href="https://learn.shayhowe.com/advanced-html-css/">Learn to Code Advanced HTML &amp; CSS</a></td>
<td>I really enjoyed the above beginner course and looking forward to taking this one.</td>
<td>🎓</td>
</tr>
<tr>
<td>10</td>
<td><a href="https://www.youtube.com/watch?v=4HuAnM6b2d8">Derek Banas Handlebars Tutorial</a></td>
<td>Not technically HTML, but it sure helps you write it efficiently. Looking forward to viewing this tutorial.</td>
<td>🧐</td>
</tr>
<tr>
<td>11</td>
<td><a href="https://metatags.io/">metatags.io</a></td>
<td>One of my favorite generators for creating meta tags for multiple social media platforms.</td>
<td>🧰</td>
</tr>
<tr>
<td>12</td>
<td><a href="https://css-tricks.com/a-complete-guide-to-links-and-buttons/">A Complete Guide to Links and Buttons</a></td>
<td>Using the right tool for the right job is never more apparent in this deep-dive comparison article.</td>
<td>🧐</td>
</tr>
<tr>
<td>13</td>
<td><a href="https://getwaves.io">getwaves.io</a></td>
<td>Love this tool! Generate svg waves, to create curved separations for page sections!</td>
<td>🧰</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#css-resources">
  </a>
  CSS Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>14</td>
<td><a href="https://getbootstrap.com/docs/5.0/getting-started/introduction/">Bootstrap Documentation</a></td>
<td>Even if I am not using the framework I love using their documentation for inspiration on common web components.</td>
<td>🧐</td>
</tr>
<tr>
<td>15</td>
<td><a href="https://css-tricks.com/specifics-on-css-specificity/">Specifics on CSS Specificity</a></td>
<td>Great breakdown by CSS-Tricks and has nice graphic examples at the end.</td>
<td>🧐</td>
</tr>
<tr>
<td>16</td>
<td><a href="https://www.w3schools.com/css/css3_box-sizing.asp">CSS Box Sizing</a></td>
<td>Very easy to approach example of how the box-model works.</td>
<td>🧐</td>
</tr>
<tr>
<td>17</td>
<td><a href="https://www.creativebloq.com/advice/tips-for-css-animation">12 tips for amazing CSS animation</a></td>
<td>This has so many good tips on creating cool animations and making sure they are performant.</td>
<td>🧐</td>
</tr>
<tr>
<td>18</td>
<td><a href="https://designcode.io/css-layout-and-animations">CSS Layout and Animations</a></td>
<td>Haven't taken this one yet, but can't wait to do so. The course designs are top notch.</td>
<td>🎓</td>
</tr>
<tr>
<td>19</td>
<td><a href="https://www.youtube.com/playlist?list=PL4cUxeGkcC9iEwigam3gTjU_7IA3W2WZA">Net Ninja SASS Tutorial</a></td>
<td>This was my first course on SASS and still refer back to it from time to time.</td>
<td>🎓</td>
</tr>
<tr>
<td>20</td>
<td><a href="https://www.youtube.com/watch?v=Zz6eOVaaelI">Learn Sass In 20 Minutes</a></td>
<td>This is great for a first primer into what SASS is.</td>
<td>🎓</td>
</tr>
<tr>
<td>21</td>
<td><a href="https://medium.com/@andrew_barnes/bem-and-sass-a-perfect-match-5e48d9bc3894">BEM and SASS: A Perfect Match</a></td>
<td>This blew my mind when introduced how BEM and SASS could be used together.</td>
<td>🧐</td>
</tr>
<tr>
<td>22</td>
<td><a href="http://getbem.com/">getbem.com</a></td>
<td>This gives an overview from the creators of the popular naming convention.</td>
<td>🧐</td>
</tr>
<tr>
<td>23</td>
<td><a href="https://css-tricks.com/bem-101/">CSS-Tricks BEM 101</a></td>
<td>I love the button examples that this article gives on how to use BEM.</td>
<td>🧐</td>
</tr>
<tr>
<td>24</td>
<td><a href="https://sparkbox.com/foundry/bem_by_example">BEM by Example </a></td>
<td>This explanation on BEM is really good, but I especially like how they have a short and full versions of the article.</td>
<td>🧐</td>
</tr>
<tr>
<td>25</td>
<td><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/display">MDN Display Docs</a></td>
<td>Everything you could ever want to know about the powerful <code>display</code> property.</td>
<td>🧐</td>
</tr>
<tr>
<td>26</td>
<td><a href="https://css-tricks.com/a-couple-of-use-cases-for-calc/">A Couple of Use Cases for Calc()</a></td>
<td>
<code>calc()</code> is one of the more powerful features in CSS and this article shows some great use cases for it.</td>
<td>🧐</td>
</tr>
<tr>
<td>27</td>
<td><a href="https://cssgrid.io">Wes Bos CSS Grid</a></td>
<td>You can't argue with free and that Wes Bos is one of the best teachers out there for development.</td>
<td>🎓</td>
</tr>
<tr>
<td>28</td>
<td><a href="https://flexbox.io">Wes Bos Flexbox</a></td>
<td>See above, but this time for Flexbox</td>
<td>🎓</td>
</tr>
<tr>
<td>29</td>
<td><a href="https://www.cssmatic.com">CSSmatic</a></td>
<td>Collection of powerful css generators for gradients, border radius, noise texture and box shadows.</td>
<td>🧰</td>
</tr>
<tr>
<td>30</td>
<td><a href="https://css-tricks.com/almanac/properties/p/position/">CSS Tricks Position</a></td>
<td>If I could have access to only one resource for the <code>position</code> property, this would be it.</td>
<td>🧐</td>
</tr>
<tr>
<td>31</td>
<td><a href="https://caniuse.com">Can I Use?</a></td>
<td>This site lets you know the browser support for every property out there.</td>
<td>🧰</td>
</tr>
<tr>
<td>32</td>
<td><a href="https://yoksel.github.io/flex-cheatsheet/">yoksel Flex Cheatsheet</a></td>
<td>I love the layout and way it lets you visually preview the flexbox properties.</td>
<td>🧐</td>
</tr>
<tr>
<td>33</td>
<td><a href="https://code.tutsplus.com/tutorials/the-30-css-selectors-you-must-memorize--net-16048">The 30 CSS Selectors You Must Memorize</a></td>
<td>When I feel like getting into the weeds of CSS selectors, (sorry BEM) this is the article I refer back to.</td>
<td>🧐</td>
</tr>
<tr>
<td>34</td>
<td><a href="http://csslint.net">CSS Lint</a></td>
<td>This tool will check your code and highlight any errors.</td>
<td>🧰</td>
</tr>
<tr>
<td>35</td>
<td><a href="https://systemfontstack.com">System Font Stack</a></td>
<td>Predefined font fallback stacks that can be plugged into a project.</td>
<td>🧰</td>
</tr>
<tr>
<td>36</td>
<td><a href="https://neumorphism.io/#c0b5b5">Neumorphism.io</a></td>
<td>This tool makes elements look like they are just under the surface of the page.</td>
<td>🧰</td>
</tr>
<tr>
<td>37</td>
<td><a href="https://www.udemy.com/course/advanced-css-and-sass/">Advanced CSS and Sass: Flexbox, Grid, Animations and More!</a></td>
<td>Bought this amazing course on Udemy but haven't gotten a chance to take it yet...one day soon though!</td>
<td>🎓</td>
</tr>
<tr>
<td>38</td>
<td><a href="https://css-scroll-shadows.now.sh/?bgColor=9d80d6&amp;shadowColor=222222&amp;pxSize=15">CSS Scroll Shadows</a></td>
<td>This tool generates shadows that appear based on scroll position with just CSS!</td>
<td>🧰</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#javascript-resources">
  </a>
  JavaScript Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>39</td>
<td><a href="https://javascript.info">javascript.info</a></td>
<td>This is one of the complete and well explained overview of JS.</td>
<td>🧐</td>
</tr>
<tr>
<td>40</td>
<td><a href="https://codebeautify.org/jsvalidate">Code Beautify</a></td>
<td>Before getting into ESlint, I really liked this tool to make sure my JS was all kosher.</td>
<td>🧰</td>
</tr>
<tr>
<td>41</td>
<td><a href="https://www.sitepoint.com/javascript-truthy-falsy/">Truthy and Falsy: When All is Not Equal in JavaScript</a></td>
<td>This article is a great refernce for all the instances that a value might be considered true or false.</td>
<td>🧐</td>
</tr>
<tr>
<td>42</td>
<td><a href="https://youtu.be/8aGhZQkoFbQ">What the heck is the event loop anyway?</a></td>
<td>I have not watched this yet, but looking forward to it.</td>
<td>🧐</td>
</tr>
<tr>
<td>43</td>
<td><a href="https://www.youtube.com/watch?v=s9wW2PpJsmQ">JavaScript Loops</a></td>
<td>If I could only watch one video to understand common JS loops, this would be the one.</td>
<td>🧐</td>
</tr>
<tr>
<td>44</td>
<td><a href="https://www.tutorialrepublic.com/javascript-tutorial/javascript-loops.php">JavaScript Loops</a></td>
<td>If I could only read one article to understand common JS loops, this would be the one.</td>
<td>🧐</td>
</tr>
<tr>
<td>45</td>
<td><a href="https://www.codecademy.com/learn/introduction-to-javascript/modules/learn-javascript-introduction/cheatsheet">Codecademy JS Cheatsheet</a></td>
<td>Totally free and a nice collection of common JS elements and concepts.</td>
<td>🧐</td>
</tr>
<tr>
<td>46</td>
<td><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String">MDN JS String</a></td>
<td>Everything I'd ever want to know about strings and where to use them.</td>
<td>🧐</td>
</tr>
<tr>
<td>47</td>
<td><a href="https://medium.com/@debbie.obrien/json-parse-v-json-stringify-4b9d104c78d0">JSON Parse v JSON Stringify</a></td>
<td>These JSON functions confused me to no end. This article really helped explain the differences.</td>
<td>🧐</td>
</tr>
<tr>
<td>48</td>
<td><a href="https://developers.google.com/speed/libraries#jquery">Google Hosted Library jQuery</a></td>
<td>Bookmark this link. :) It has the latest jQuery cdn script at all time.</td>
<td>🧰</td>
</tr>
<tr>
<td>49</td>
<td><a href="https://github.com/public-apis/public-apis/">Public APIs</a></td>
<td>Great list of public APIs that you can use projects today!</td>
<td>🧰</td>
</tr>
<tr>
<td>50</td>
<td><a href="https://dmitripavlutin.com/javascript-event-delegation/">Javascript Event Delegation</a></td>
<td>Awesome visual representation of what events are and how event delegation works.</td>
<td>🧐</td>
</tr>
<tr>
<td>51</td>
<td><a href="https://www.freecodecamp.org/news/var-let-and-const-whats-the-difference/">Var, Let, and Const – What's the Difference?</a></td>
<td>Great introduction to the different variable types (and why <code>var</code> is trash.)</td>
<td>🧐</td>
</tr>
<tr>
<td>52</td>
<td><a href="https://dmitripavlutin.com/differences-between-arrow-and-regular-functions/">5 Differences Between Arrow and Regular Functions</a></td>
<td>I love how this demystifies how the two function types are used.</td>
<td>🧐</td>
</tr>
<tr>
<td>53</td>
<td><a href="https://www.youtube.com/watch?v=0ik6X4DJKCc">JavaScript DOM Crash Course - Part 1</a></td>
<td>Discover how to select elements in the DOM to be used with JS</td>
<td>🎓</td>
</tr>
<tr>
<td>54</td>
<td><a href="https://www.youtube.com/watch?v=mPd2aJXCZ2g">JavaScript DOM Crash Course - Part 2</a></td>
<td>Learn the basics of how to traverse the DOM.</td>
<td>🎓</td>
</tr>
<tr>
<td>55</td>
<td><a href="https://www.youtube.com/watch?v=wK2cBMcDTss">JavaScript DOM Crash Course - Part 3</a></td>
<td>Learn how to attach attach events to DOM elements.</td>
<td>🎓</td>
</tr>
<tr>
<td>56</td>
<td><a href="https://www.youtube.com/watch?v=i37KVt_IcXw">JavaScript DOM Crash Course - Part 4</a></td>
<td>Build a small project based on the last 3 videos.</td>
<td>🎓</td>
</tr>
<tr>
<td>57</td>
<td><a href="https://www.digitalocean.com/community/tutorials/introduction-to-the-dom">Introduction to the DOM</a></td>
<td>Another great resource on the DOM, this quick article will get you up and running.</td>
<td>🧐</td>
</tr>
<tr>
<td>58</td>
<td><a href="https://www.youtube.com/playlist?list=PL4cUxeGkcC9jx2TTZk3IGWKSbtugYdrlu">Asynchronous Javascript</a></td>
<td>I forgot I bookmarked this until now. This an awesome free course by the Net Ninja.</td>
<td>🧐</td>
</tr>
<tr>
<td>59</td>
<td><a href="https://www.codewars.com/kata/54c27a33fb7da0db0100040e/train/javascript">Code Wars Kata</a></td>
<td>This awesomely themed training tool lets you practice your sweet Javascript skills.</td>
<td>🧰</td>
</tr>
<tr>
<td>60</td>
<td><a href="https://www.sitepoint.com/event-bubbling-javascript/">What Is Event Bubbling in JavaScript?</a></td>
<td>Another great resource on what event bubbling is and how to take advantage of it.</td>
<td>🧐</td>
</tr>
<tr>
<td>61</td>
<td><a href="https://www.sitepoint.com/javascript-event-delegation-is-easier-than-you-think/">JavaScript Event Delegation is Easier than You Think</a></td>
<td>Learn how to trigger and listen to events correctly.</td>
<td>🧐</td>
</tr>
<tr>
<td>62</td>
<td><a href="http://www.quirksmode.org/js/events_properties.html#target">Which HTML element is the target of the event?</a></td>
<td>Find out which element was interacted with.</td>
<td>🧐</td>
</tr>
<tr>
<td>63</td>
<td><a href="https://scotch.io/tutorials/understanding-scope-in-javascript">Understanding Scope in JavaScript</a></td>
<td>Love the design of this site and it does a thorough job of explaining scope.</td>
<td>🧐</td>
</tr>
<tr>
<td>64</td>
<td><a href="https://medium.com/til-js/different-ways-of-writing-a-function-in-javascript-part-i-80d9a9e0138b">Different ways of writing a function in JavaScript</a></td>
<td>Quick article on how to write a "Function Declaration" function.</td>
<td>🧐</td>
</tr>
<tr>
<td>65</td>
<td><a href="https://www.softauthor.com/javascript-image-slider-slideshow-carousel/">JavaScript Image Slider for Beginners</a></td>
<td>This teaches how to build a simple image slider with Vanilla JS.</td>
<td>🧐</td>
</tr>
<tr>
<td>66</td>
<td><a href="https://testingjavascript.com">Learn the smart, efficient way to test any JavaScript application.</a></td>
<td>I have not taken this one yet, but looking forward to it—as it is such an important subject!</td>
<td>🎓</td>
</tr>
<tr>
<td>67</td>
<td><a href="https://www.udemy.com/course/js-algorithms-and-data-structures-masterclass/">JavaScript Algorithms and Data Structures Masterclass</a></td>
<td>I am not a fan of algorithms, but that is why I have this course bookmarked!</td>
<td>🧐</td>
</tr>
<tr>
<td>68</td>
<td><a href="https://teamtreehouse.com/library/ajax-basics-2">AJAX Basics</a></td>
<td>Everything you ever wanted to know about making AJAX requests to a web server.</td>
<td>🎓</td>
</tr>
<tr>
<td>69</td>
<td><a href="https://www.taniarascia.com/how-to-connect-to-an-api-with-javascript/">How to Connect to an API with JavaScript</a></td>
<td>This article really helped me understand how API calls can be used in projects.</td>
<td>🧐</td>
</tr>
<tr>
<td>70</td>
<td><a href="https://www.taniarascia.com/how-to-use-json-data-with-php-or-javascript/">JSON Tutorial: Request API Data with JavaScript or PHP</a></td>
<td>It's so interesting to see how PHP and JavaScript handle JSON differently.</td>
<td>🧐</td>
</tr>
<tr>
<td>71</td>
<td><a href="https://barnabas.hashnode.dev/basics-of-javascript-reduce-method-ckdk81c6402y7zzs1f13p4x7t">Basics Of JavaScript Reduce Method</a></td>
<td>This short article does such a great job of breaking down this powerful JS method.</td>
<td>🧐</td>
</tr>
<tr>
<td>72</td>
<td><a href="https://blog.logrocket.com/axios-or-fetch-api/#:~:text=To%20send%20data%2C%20fetch(),set%20in%20the%20options%20object">Axios or fetch(): Which should you use? </a></td>
<td>I tend to reach for Axios, but this article does a great job explaining both.</td>
<td>🧐</td>
</tr>
<tr>
<td>73</td>
<td><a href="https://www.codecademy.com/learn/introduction-to-javascript">Learn JavaScript  Start </a></td>
<td>I took this 30-hour course and it is amazing. Does a great job explaining the basics.</td>
<td>🎓</td>
</tr>
<tr>
<td>74</td>
<td><a href="https://validatejs.org">validatejs.org</a></td>
<td>Great tool to use on sign-up and login forms to make sure the user data is correct.</td>
<td>🧰</td>
</tr>
<tr>
<td>75</td>
<td><a href="https://www.youtube.com/watch?v=ymmtEgp0Tuc">HTML5 Canvas Tutorial for Beginners</a></td>
<td>As a designer, this is one I am very excited about diving into.</td>
<td>🧐</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#react-resources">
  </a>
  React Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>76</td>
<td><a href="https://ihatetomatoes.net/wp-content/uploads/2017/01/react-cheat-sheet-v1.pdf">React Cheat Sheet</a></td>
<td>Quick and easy to skim cheat sheet on common React patterns and pieces.</td>
<td>🧰</td>
</tr>
<tr>
<td>77</td>
<td><a href="https://advancedreact.com">Fullstack Advanced  React &amp; GraphQL</a></td>
<td>Little pricer then Udemy, but no one teaches like Wes Bos. Hopefully will be able to purchase this one soon.</td>
<td>🎓</td>
</tr>
<tr>
<td>78</td>
<td><a href="https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en">React Developer Tools</a></td>
<td>This lets you view props, components, renders and more right in Chrome DevTools</td>
<td>🧰</td>
</tr>
<tr>
<td>79</td>
<td><a href="https://react-icons.github.io/react-icons/">React Icons</a></td>
<td>This is one of my favorite icon packages, because it has almost every major icon library out there.</td>
<td>🧰</td>
</tr>
<tr>
<td>80</td>
<td><a href="https://www.udemy.com/course/react-the-complete-guide-incl-redux/">React - The Complete Guide (incl Hooks, React Router, Redux)</a></td>
<td>One of my favorite courses and has prepared me so much to code in React.</td>
<td>🎓</td>
</tr>
<tr>
<td>81</td>
<td><a href="https://daveceddia.com/usereducer-hook-examples/">Examples of the useReducer Hook</a></td>
<td>This article / video breaks down a very cool hook lets you get a "Redux-like" store without downloading the library.</td>
<td>🧐</td>
</tr>
<tr>
<td>82</td>
<td><a href="https://mdxjs.com/getting-started">MDX Documentation</a></td>
<td>This syntax combines JSX and Markdown in one!</td>
<td>🎓</td>
</tr>
<tr>
<td>83</td>
<td><a href="https://reactfordesigners.com">React For Designers</a></td>
<td>This features some great courses and beginner projects for getting started in React.</td>
<td>🎓</td>
</tr>
<tr>
<td>84</td>
<td><a href="https://github.com/react-bootstrap/react-router-bootstrap">React Router Bootstrap</a></td>
<td>Get the power of React Router navigation and the stylings of Bootstrap mixed into one.</td>
<td>🧰</td>
</tr>
<tr>
<td>85</td>
<td><a href="https://github.com/nfl/react-helmet">React Helmet</a></td>
<td>I really want to learn this package. It lets you add SEO meta tags to different "React Pages"</td>
<td>🧰</td>
</tr>
<tr>
<td>86</td>
<td><a href="https://web.dev/code-splitting-suspense/?utm_source=lighthouse&amp;utm_medium=devtools">Code splitting with React.lazy and Suspense</a></td>
<td>This really works! After implementing on my website my performance scores improved.</td>
<td>🧐</td>
</tr>
<tr>
<td>87</td>
<td><a href="https://react.rocks/tag/Validation">33 Validation Examples</a></td>
<td>Awesome collection of form validation and demo code for React.</td>
<td>🧐</td>
</tr>
<tr>
<td>88</td>
<td><a href="https://www.reddit.com/r/learnjavascript/comments/ifqa03/37_reactjs_basics_useref_hook/">37 ReactJS basics useRef Hook</a></td>
<td>Helpful video on how to work with the React hook <code>useRef</code>.</td>
<td>🧐</td>
</tr>
<tr>
<td>89</td>
<td><a href="https://www.npmjs.com/package/react-validation">npm react-validation</a></td>
<td>Robust package to set up form validation. Need to dive deeper one day to learn all it can do.</td>
<td>🧰</td>
</tr>
<tr>
<td>90</td>
<td><a href="https://github.com/formsy/formsy-react/">Formsy React</a></td>
<td>This package lets you build custom forms and it takes care of the validation for you.</td>
<td>🧰</td>
</tr>
<tr>
<td>91</td>
<td><a href="https://styled-components.com">Styled Componets</a></td>
<td>A favorite with React users, allowing you to create CSS focused custom components.</td>
<td>🧰</td>
</tr>
<tr>
<td>92</td>
<td><a href="https://medium.com/@ttennant/react-inline-styles-and-media-queries-using-a-custom-react-hook-e76fa9ec89f6">React inline styles and media queries using a custom React Hook</a></td>
<td>This article helped me mimic responsive styling within the JSX environment.</td>
<td>🧐</td>
</tr>
<tr>
<td>93</td>
<td><a href="https://react-bootstrap.github.io/getting-started/introduction/">React Bootstrap</a></td>
<td>Really good documentation on using bootstrap with React.</td>
<td>🧐</td>
</tr>
<tr>
<td>94</td>
<td><a href="https://www.youtube.com/watch?v=3zoIigieur0">React Redux Using Hooks</a></td>
<td>Work with the modern Hook syntax for Redux. This saved me so much time!</td>
<td>🧐</td>
</tr>
<tr>
<td>95</td>
<td><a href="https://stackoverflow.com/questions/37755997/why-cant-i-directly-modify-a-components-state-really">Why can't I directly modify a component's state, really?</a></td>
<td>This explains so well why you must use <code>setState</code> for changing state in class components.</td>
<td>🧐</td>
</tr>
<tr>
<td>96</td>
<td><a href="https://blog.bitsrc.io/react-communication-between-components-c0cfccfa996a">React: Communication Between Components</a></td>
<td>Great deep dive into how React components pass data to one another.</td>
<td>🧐</td>
</tr>
<tr>
<td>97</td>
<td><a href="https://www.freecodecamp.org/news/how-to-identify-and-resolve-wasted-renders-in-react-cc4b1e910d10/">How to identify and resolve wasted renders in React</a></td>
<td>Performance is everything and this teaches how to work with renders correctly.</td>
<td>🧐</td>
</tr>
<tr>
<td>98</td>
<td><a href="https://reactjs.org/docs/components-and-props.html">Components and Props</a></td>
<td>One of the core and most visited pages in the React Documentation for me.</td>
<td>🧐</td>
</tr>
<tr>
<td>99</td>
<td><a href="https://medium.com/@samueldinesh/setting-up-redux-devtools-a-simple-guide-3b386a6254fa">Setting Up Redux DevTools</a></td>
<td>Redux DevTools is not the most straightforward thing for me to set up, but this helped explain the process well.</td>
<td>🧐</td>
</tr>
<tr>
<td>100</td>
<td><a href="https://www.reddit.com/r/learnjavascript/comments/ipfikv/stuck_with_learning_react_redux_i_am_making_a/?utm_source=share&amp;utm_medium=ios_app&amp;utm_name=iossmf">React Redux Easy Peasy Course</a></td>
<td>Haven't watched this beginner course on Redux yet, but heard good things.</td>
<td>🎓</td>
</tr>
<tr>
<td>101</td>
<td><a href="https://www.gatsbyjs.org/">Gatsby JS</a></td>
<td>So excited to work with this static site generator very soon.</td>
<td>🧰</td>
</tr>
<tr>
<td>102</td>
<td><a href="https://www.udemy.com/course/mern-stack-front-to-back/">MERN Stack Front To Back</a></td>
<td>Purchased this course but have not taken it yet. Very excited to do so soon as it covers so much.</td>
<td>🎓</td>
</tr>
<tr>
<td>103</td>
<td><a href="https://www.udemy.com/course/react-native-the-practical-guide/">React Native The Practical Guide</a></td>
<td>In the middle of taking this now and love all the detail it goes into.</td>
<td>🎓</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#wordpress-resources">
  </a>
  WordPress Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>104</td>
<td><a href="https://www.youtube.com/watch?v=-h7gOJbIpmo">How to Create a Custom WordPress Theme - Full Course</a></td>
<td>Wonderful introduction to custom theming in WordPress.</td>
<td>🎓</td>
</tr>
<tr>
<td>105</td>
<td><a href="https://www.youtube.com/playlist?list=PLC5E59DD6D84D34DC">WordPress Basics</a></td>
<td>All the videos are very well broken out.</td>
<td>🎓</td>
</tr>
<tr>
<td>106</td>
<td><a href="https://www.youtube.com/playlist?list=PLriKzYyLb28nUFbe0Y9d-19uVkOnhYxFE">WordPress 101 for Beginner Developers</a></td>
<td>Another great playlist on the basics of WordPress.</td>
<td>🎓</td>
</tr>
<tr>
<td>107</td>
<td><a href="https://www.youtube.com/playlist?list=PLriKzYyLb28kpEnFFi9_vJWPf5-_7d3rX">Create a Premium WordPress Theme</a></td>
<td>Haven't taken this one, but there are a lot of helpful video topics in this playlist.</td>
<td>🎓</td>
</tr>
<tr>
<td>108</td>
<td><a href="https://www.youtube.com/playlist?list=PLLnpHn493BHGACfv4rC29kJamYMtw34D9">Customizing WordPress</a></td>
<td>Really helpful playlist on advanced WordPress theme topics.</td>
<td>🎓</td>
</tr>
<tr>
<td>109</td>
<td><a href="https://www.udemy.com/course/wordpress-intermediate/">WordPress Intermediate Skills</a></td>
<td>I like that this course covers working with a server as well.</td>
<td>🎓</td>
</tr>
<tr>
<td>110</td>
<td><a href="https://www.youtube.com/watch?v=OriRDlUbAFg">How to install WordPress on your local computer with MAMP (Mac)</a></td>
<td>This video taught me how to work with WordPress locally on my machine.</td>
<td>🧐</td>
</tr>
<tr>
<td>111</td>
<td><a href="https://wphierarchy.com/">wphierarchy.com</a></td>
<td>This website does a great job in explaining all the different file types in WordPress and their importance levels.</td>
<td>🧐</td>
</tr>
<tr>
<td>112</td>
<td><a href="https://developer.wordpress.org/themes/basics/including-css-javascript/">Including CSS &amp; JavaScript</a></td>
<td>Documentation on using CSS &amp; JS in WordPress.</td>
<td>🧐</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#git-amp-cli-resources">
  </a>
  Git &amp; CLI Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>113</td>
<td><a href="https://www.atlassian.com/git/tutorials/comparing-workflows">Comparing Git Workflows</a></td>
<td>This was so helpful in understanding there are different Git workflows for each team need.</td>
<td>🧐</td>
</tr>
<tr>
<td>114</td>
<td><a href="https://commandlinepoweruser.com/">Command Line Power User</a></td>
<td>Can't wait to become a true terminal master with this course.</td>
<td>🎓</td>
</tr>
<tr>
<td>115</td>
<td><a href="https://learngitbranching.js.org/">Learn Git Branching</a></td>
<td>This interactive course was so helpful in understanding how branching worked.</td>
<td>🎓</td>
</tr>
<tr>
<td>116</td>
<td><a href="https://www.youtube.com/watch?v=oFYyTZwMyAg">GITHUB PULL REQUEST, Branching, Merging &amp; Team Workflow</a></td>
<td>Great overview of how it looks to work with a team in a Git workflow.</td>
<td>🧐</td>
</tr>
<tr>
<td>117</td>
<td><a href="https://guides.github.com/features/mastering-markdown/">Mastering Markdown</a></td>
<td>Such a great resource for seeing common Markdown syntax and upgrading Git README</td>
<td>🧐</td>
</tr>
<tr>
<td>118</td>
<td><a href="https://www.quora.com/What-is-the-difference-between-the-add-and-commit-commands-in-Git">Mastering Markdown</a></td>
<td>Super helpful when I first started using Git for version control.</td>
<td>🧐</td>
</tr>
<tr>
<td>119</td>
<td><a href="https://reactsensei.com/basic-git-commands/">Basic Git Commands</a></td>
<td>Another great cheat sheet on common git commands.</td>
<td>🧐</td>
</tr>
<tr>
<td>120</td>
<td><a href="https://guides.github.com/activities/hello-world/">GitHub Guide Hello World</a></td>
<td>Get started with Github with this very user friendly guide.</td>
<td>🧐</td>
</tr>
<tr>
<td>121</td>
<td><a href="http://rogerdudler.github.io/git-guide/">Git Commands</a></td>
<td>Very visual approach for common Git commands.</td>
<td>🧐</td>
</tr>
<tr>
<td>122</td>
<td><a href="https://shortcode.dev/git-cheatsheet#git-cheatsheet">Short Code Git Cheat Sheet</a></td>
<td>Searchable cheatsheet</td>
<td>🧐</td>
</tr>
<tr>
<td>123</td>
<td><a href="https://www.codecademy.com/articles/command-line-commands">List of Command Line Commands</a></td>
<td>Awesome list by Codecademy on many CLI terminal commands.</td>
<td>🧐</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#hosting-resources">
  </a>
  Hosting Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>124</td>
<td><a href="https://www.netlify.com/products/build/">Netlify Build</a></td>
<td>Awesome Netlify process to trigger builds to the live site once a specific branch is updated.</td>
<td>🧰</td>
</tr>
<tr>
<td>125</td>
<td><a href="https://www.youtube.com/playlist?list=PLzlG0L9jlhEPMR8haUPkxj2hJ_3jh5qa6">Netlify Tutorials</a></td>
<td>Free course to get up and running with Netlify hosting</td>
<td>🎓</td>
</tr>
<tr>
<td>126</td>
<td><a href="https://www.youtube.com/watch?v=6ElQ689HRcY">Simple Contact Form Submission With Netlify</a></td>
<td>Easy tutorial on how to set up Netlify as the mail server.</td>
<td>🧐</td>
</tr>
<tr>
<td>127</td>
<td><a href="https://www.youtube.com/watch?v=6r9NJDHiJwA">PHPStorm FTP Server Connection to Remote Host </a></td>
<td>Tutorial on how to connect with SFTP or FTP with PHPStorm. (It makes it a joy compared to VS Code)</td>
<td>🧐</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#optimization-resources">
  </a>
  Optimization Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>128</td>
<td><a href="https://teamtreehouse.com/library/front-end-web-optimization-workflow">Front End Web Optimization Workflow</a></td>
<td>Can't wait to take this one and learn about CDNs and optimizing assets</td>
<td>🎓</td>
</tr>
<tr>
<td>129</td>
<td><a href="https://yoast.com/rel-canonical/"><code>rel=canonical</code>: the ultimate guide</a></td>
<td>Such a good description of what Canonical urls are and where to use them.</td>
<td>🧐</td>
</tr>
<tr>
<td>130</td>
<td><a href="https://developer.mozilla.org/en-US/docs/Web/Performance/Lazy_loading">MDN Lazy Loading</a></td>
<td>Great place to start to learn how Lazy loading works.</td>
<td>🧐</td>
</tr>
<tr>
<td>131</td>
<td><a href="https://hackernoon.com/seo-web-development-tutorial-for-beginners-7273308b6448">SEO Web Development Tutorial for Beginners</a></td>
<td>Awesome intro for what SEO is and how to approach it.</td>
<td>🧐</td>
</tr>
<tr>
<td>132</td>
<td><a href="https://moz.com/learn/seo/page-speed">MOZ Page Speed</a></td>
<td>This shows a bunch of areas to check for poor page speeds.</td>
<td>🧐</td>
</tr>
<tr>
<td>133</td>
<td><a href="https://remysharp.com/2015/10/14/the-art-of-debugging">The Art of Debugging</a></td>
<td>Fascinating deep dive on the process of debugging a website and tools to help.</td>
<td>🧐</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#databases-resources">
  </a>
  Databases Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>134</td>
<td><a href="https://www.freecodecamp.org/news/introduction-to-mongoose-for-mongodb-d2a7aa593c57">Introduction to Mongoose for MongoDB</a></td>
<td>This article thoroughly explains what MongoDB is and why it is essential to use Mongoose with it.</td>
<td>🧐</td>
</tr>
<tr>
<td>135</td>
<td><a href="https://medium.com/@atingenkay/restful-routes-what-are-they-8fe221521bb">Restful Routes, What are they?</a></td>
<td>I did not fully understand RESTful API calls until reading this.</td>
<td>🧐</td>
</tr>
<tr>
<td>136</td>
<td><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status">HTTP response status codes</a></td>
<td>Code 418 is the best. ;)</td>
<td>🧐</td>
</tr>
<tr>
<td>137</td>
<td><a href="http://www.passportjs.org/docs/">Passport</a></td>
<td>Great tool to use for full-stack user authentication</td>
<td>🧰</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#misc-web-dev-resources">
  </a>
  MISC Web Dev Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>138</td>
<td><a href="https://www.youtube.com/watch?v=OdQtww8ZfEw">Working with Code Written by Someone Else</a></td>
<td>Wonderful tips in how to explore a new codebase.</td>
<td>🧐</td>
</tr>
<tr>
<td>139</td>
<td><a href="https://www.tablesgenerator.com/markdown_tables">Markdown Table Generator</a></td>
<td>This is how I made the tables in this post ;)</td>
<td>🧰</td>
</tr>
<tr>
<td>140</td>
<td><a href="https://facebook.github.io/jest/">Jest</a></td>
<td>One of the industry testing frameworks used for test driven development.</td>
<td>🧰</td>
</tr>
<tr>
<td>141</td>
<td><a href="https://get.foundation/emails.html">Foundation for Emails</a></td>
<td>This framework makes it easy to code responsive HTML emails.</td>
<td>🧰</td>
</tr>
<tr>
<td>142</td>
<td><a href="https://www.youtube.com/playlist?list=PLR_ZJO3q73HalAe5sRs7ByjHvptmbflsL">Zurb Foundation for Email Course</a></td>
<td>Great course for the above email framework.</td>
<td>🎓</td>
</tr>
<tr>
<td>143</td>
<td><a href="https://www.npmjs.com/package/dotenv">NPM dotenv</a></td>
<td>This package lets you secure sensitive information like API keys within projects.</td>
<td>🧰</td>
</tr>
<tr>
<td>144</td>
<td><a href="https://typing.io/">typing.io</a></td>
<td>I used this before the bootcamp to practice typing code faster.</td>
<td>🧰</td>
</tr>
<tr>
<td>145</td>
<td><a href="https://developers.google.com/maps/documentation/">Google Maps Platform Documentation</a></td>
<td>Api documentation for using Google Maps in projects.</td>
<td>🧐</td>
</tr>
<tr>
<td>146</td>
<td><a href="https://auth0.com/blog/what-is-and-how-does-single-sign-on-work/">What Is and How Does Single Sign-On Authentication Work?</a></td>
<td>This was so helpful in helping me understand at a high-level how SSO works</td>
<td>🧐</td>
</tr>
<tr>
<td>147</td>
<td><a href="https://www.searchenginejournal.com/subdomains-vs-subfolders-seo/239795/#close">Subdomains vs. Subfolders: Which Is Better for SEO &amp; Why?</a></td>
<td>Very interesting article on how to structure loosely related web content.</td>
<td>🧐</td>
</tr>
<tr>
<td>148</td>
<td><a href="https://favicon.io/favicon-generator/">favicon.io</a></td>
<td>This is my favorite Favicon generator (small icon in browser tab) and has a great interface.</td>
<td>🧰</td>
</tr>
<tr>
<td>149</td>
<td><a href="https://github.com/wesbos/eslint-config-wesbos">Wes Bos Eslint Config</a></td>
<td>Download the settings that Wes Bos uses for linting his code.</td>
<td>🧐</td>
</tr>
<tr>
<td>150</td>
<td><a href="https://docs.emmet.io/cheat-sheet/">Emmet Cheat Sheet</a></td>
<td>Super helpful reference to common Emmet commands in multiple languages</td>
<td>🧐</td>
</tr>
<tr>
<td>151</td>
<td><a href="https://www.jetbrains.com/phpstorm/documentation/">Learn Jetbrains PHPStorm IDE</a></td>
<td>This became my favorite IDE and love all their resources on how to use it correctly.</td>
<td>🧐</td>
</tr>
<tr>
<td>152</td>
<td><a href="https://www.youtube.com/watch?v=yc3J2TGreBo">Agile Scrum Development Process and How UI/UX Design Fit In</a></td>
<td>Really good overview of how Agile workflows are set up.</td>
<td>🧐</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#career-resources">
  </a>
  Career Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>153</td>
<td><a href="https://medium.com/@archie4321/the-golden-guide-to-landing-a-developer-position-c78ad34a965f">The Golden Guide to Landing a Developer Position</a></td>
<td>An incredible guide on preparing hiring material like resumes to interviewing with examples.</td>
<td>🧐</td>
</tr>
<tr>
<td>154</td>
<td><a href="https://www.coursera.org/learn/learning-how-to-learn?action=enroll">Learn How To Learn</a></td>
<td>Can't wait to take this one and learn how to be a better "learner".</td>
<td>🎓</td>
</tr>
<tr>
<td>155</td>
<td><a href="https://www.glassdoor.com/blog/common-interview-questions/">Glassdoor Common Interview Questions</a></td>
<td>List of 50 questions that can be asked in interviews</td>
<td>🧐</td>
</tr>
<tr>
<td>156</td>
<td><a href="https://www.themuse.com/advice/how-to-tackle-something-you-have-no-idea-how-to-do">How to Tackle Something You Have No Idea How to Do</a></td>
<td>This is one of my favorite articles and I often refer back to it for motivation.</td>
<td>🧐</td>
</tr>
<tr>
<td>157</td>
<td><a href="https://coding-bootcamp-whiteboarding-algorithms.readthedocs-hosted.com/en/latest/modules/practicing-for-the-whiteboarding-interview/">Practice for the Whiteboarding Interview</a></td>
<td>Helpful links and guide to doing a Whiteboarding interview.</td>
<td>🎓</td>
</tr>
<tr>
<td>158</td>
<td><a href="https://m.youtube.com/watch?v=XKu_SEDAykw&amp;feature=youtu.be">How to: Work at Google — Example Coding/Engineering Interview</a></td>
<td>Very interesting to see the level of interviewing at Google.</td>
<td>🧐</td>
</tr>
<tr>
<td>159</td>
<td><a href="https://www.jobscan.co/">jobscan.co</a></td>
<td>Helpful site that optimizes cover letters and resumes.</td>
<td>🧰</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<p><a></a></p>

<h1>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#design-resources">
  </a>
  Design Resources
</h1>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>#</th>
<th>Title</th>
<th>My Thoughts</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td>160</td>
<td><a href="https://teamtreehouse.com/library/rapid-website-prototyping">Rapid Website Prototyping</a></td>
<td>Learning how to quickly mockup feature ideas and this covers many important areas of how to do it.</td>
<td>🎓</td>
</tr>
<tr>
<td>161</td>
<td><a href="https://teamtreehouse.com/tracks/ux-design">Tree House UX Design</a></td>
<td>This course covers so many important UX subjects and how to think through design.</td>
<td>🎓</td>
</tr>
<tr>
<td>162</td>
<td><a href="https://youtube.com/playlist?list=PLXC_gcsKLD6n7p6tHPBxsKjN5hA_quaPI">Flux Free Web Design Course 2020</a></td>
<td>One of the best free courses in the basics of Web Design.</td>
<td>🎓</td>
</tr>
<tr>
<td>163</td>
<td><a href="https://www.youtube.com/watch?v=H18PvAKtkSY&amp;list=PLxjRS2tWLJdE-FS4tpsfyjN3eF_XxkbAY&amp;index=11">Build it in Figma: Design a responsive website</a></td>
<td>This video goes deep into using auto layout in Figma.</td>
<td>🧐</td>
</tr>
<tr>
<td>164</td>
<td><a href="https://www.youtube.com/watch?v=rfAdJYLRVqI&amp;list=PLxjRS2tWLJdE-FS4tpsfyjN3eF_XxkbAY&amp;index=9">In the file: A look into building selection colors and OpenType</a></td>
<td>Haven't seen this one yet, but can't wait to go through it.</td>
<td>🧐</td>
</tr>
<tr>
<td>165</td>
<td><a href="https://www.youtube.com/watch?v=TkKm87Crfns">In the File: Making data-informed design decisions</a></td>
<td>Such a fascinating webinar on how big brands take data into account when creating designs or making changes.</td>
<td>🧐</td>
</tr>
<tr>
<td>166</td>
<td><a href="https://www.youtube.com/watch?v=8RFDPC_Fsnc">In the File: Developer and designer, working together to build design systems</a></td>
<td>Another one I can't wait to watch. Truly effective teams have clear communication between design and development early in the process.</td>
<td>🧐</td>
</tr>
<tr>
<td>167</td>
<td><a href="https://youtu.be/WPRD8_L6hf0">Build it in Figma: Design a responsive website navigation</a></td>
<td>There are many design tidbits and Figma tricks backed into this one.</td>
<td>🧐</td>
</tr>
</tbody>
</table></div>

<p><a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#top">Go to 🔝</a></p>




<h3>
  <a href="https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma#nice-job-making-it-to-the-end">
  </a>
  Nice job making it to the end!
</h3>

<p>Here is a happy dance Gif to celebrate upgrading your sweet skills!</p>

<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DTK4dbnX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://i.gifer.com/CFSn.gif" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DTK4dbnX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://i.gifer.com/CFSn.gif" alt="Napoleon Dynomite Happy Dance"></a></p>




<p><em>Thumbnail designed with <a href="https://www.adobe.com/">photoshop</a> and <a href="https://unsplash.com/photos/w7ZyuGYNpRQ">unsplash</a></em></p>

]]></description>
      <pubDate>Mon, 26 Apr 2021 12:56:03 +0000</pubDate>
      <link>https://dev.to/gedalyakrycer/165-developer-resources-i-discovered-in-2020-2021-6ma</link>
      <dc:creator>DEV Community</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/3062254492</guid>
    </item>
    <item>
      <title><![CDATA[The State of the Web —&nbsp;the links]]></title>
      <description><![CDATA[

<p><a href="https://aneventapart.com/event/spring-summit-2021">An Event Apart Spring Summit</a> is happening right now. I opened the show yesterday with a talk called <a href="https://aneventapart.com/event/spring-summit-2021#s26902"><cite>The State Of The Web</cite></a>:</p>

<blockquote>
  <p>The World Wide Web has come a long way in its three decades of existence. There’s so much we can do now with HTML, CSS, and JavaScript: animation, layout, powerful APIs… we can even make websites that work offline! And yet the web isn’t exactly looking rosy right now. The problems we face aren’t technical in nature. We’re facing a crisis of expectations: we’ve convinced people that the web is slow, buggy, and inaccessible. But it doesn’t have to be this way. There is no fate but what we make. In this perspective-setting talk, we’ll go on a journey to the past, present, and future of web design and development. You’ll laugh, you’ll cry, and by the end, you’ll be ready to make the web better.</p>
</blockquote>

<p>I wrote about <a href="https://adactio.com/journal/17902">preparing this talk</a> and you can see <a href="https://kinopio.club/the-state-of-the-web-RNnhkYT4CBLlR17tDJR7N">the outline on Kinopio</a>. I thought it turned out well, but I never actually <em>know</em> until people see it. So I’m very gratified and relieved that it went down very well indeed. Phew!</p>

<p>Eric and the gang at An Event Apart asked for <a href="https://aneventapart.com/news/post/resources-from-spring-summit-2021">a round-up of links</a> related to this talk and I was more than happy to oblige. I’ve separated them into some of the same categories that the talk covers.</p>

<p>I know that these look like a completely disconnected grab-bag of concepts—you’d have to see the talk to get the connections. But even without context, these are some rabbit holes you can dive down…</p>

<h3>Apollo 8</h3>

<ul>
<li><a href="https://vimeo.com/296530275"><cite>Earthrise</cite></a> by Emmanuel Vaughan-Lee on Vimeo, 2018.</li>
<li><a href="https://www.youtube.com/watch?v=xwOvBv8RLmo"><cite>Earthrise</cite></a> by Amanda Gorman on YouTube, 2018.</li>
<li><a href="https://www.nationalgeographic.com/magazine/article/astronauts-space-earth-perspective"><cite>They Saw Earth From Space. Here’s How It Changed Them</cite></a> by Nadia Drake in National Geographic, 2018.</li>
<li><a href="https://medium.com/the-long-now-foundation/earth-and-civilization-in-the-macroscope-82243cad20bd"><cite>Seeing the Whole Earth from Space Changed Everything</cite></a> by Ahmed Kabil for <a href="https://longnow.org/">The Long Now Foundation</a>, 2018.</li>
</ul>

<h3>Hypertext</h3>

<ul>
<li><a href="https://www.theatlantic.com/magazine/archive/1945/07/as-we-may-think/303881/"><cite>As We May Think</cite></a> by Vannevar Bush in The Atlantic Monthly, 1945.</li>
<li><a href="https://www.dougengelbart.org/content/view/374/464/">The Demo</a> by Douglas Engelbart, 1968.</li>
<li><a href="https://www.w3.org/History/1989/proposal.html"><cite>Information Management: A Proposal</cite></a> by Tim Berners-Lee, 1989.</li>
</ul>

<h3>The World Wide Web</h3>

<ul>
<li><a href="http://1997.webhistory.org/www.lists/www-talk.1993q1/0182.html"><cite>proposed new tag: IMG</cite></a> by Marc Andreessen to www-talk, 1993.</li>
<li><a href="https://remysharp.com/2010/10/08/what-is-a-polyfill"><cite>What is a Polyfill?</cite></a> by Remy Sharp, 2010.</li>
<li><a href="https://www.rachelandrew.co.uk/archives/2012/03/21/stop-solving-problems-you-dont-yet-have/"><cite>Stop solving problems you don’t yet have</cite></a> by Rachel Andrew, 2012.</li>
<li><a href="https://lists.w3.org/Archives/Public/www-style/2015Jan/0078.html"><cite>Re: More granularity for font-weight?</cite></a> by Håkon Wium Lie to www-style, 2015.</li>
<li><a href="https://adactio.com/journal/17658"><cite>Clean advertising</cite></a> on adactio.com, 2020.</li>
<li><a href="https://aneventapart.com/extras/spring2021/AEA%202021%20predictions.pdf"><cite>2021 Predictions for UX and Front-End Experts</cite></a> (PDF) by Ire Aderinokun et al. for An Event Apart, 2021.</li>
</ul>

<h3>NASA</h3>

<ul>
<li><a href="https://www.intercommedia.org/poppy-northcutt/"><cite>Poppy Northcutt: The Woman Who Took Us to the Stars</cite></a> by Apriya Rai, 2020.</li>
<li><a href="https://www.nasa.gov/content/katherine-johnson-biography">Katherine Johnson Biography</a> by Margot Lee Shetterly, 2020.</li>
<li><a href="https://www.theguardian.com/technology/2019/jul/13/margaret-hamilton-computer-scientist-interview-software-apollo-missions-1969-moon-landing-nasa-women">Margaret Hamilton interview</a> by Zoë Corbyn in The Guardian, 2019.</li>
</ul>

<p><a href="https://adactio.com/notes/17965">
<img class="u-photo" style="width: 100%" loading="lazy" src="https://adactio.com/images/uploaded/17965/small.jpg" srcset="https://adactio.com/images/uploaded/17965/small.jpg 320w, https://adactio.com/images/uploaded/17965/medium.jpg 480w, https://adactio.com/images/uploaded/17965/large.jpg 800w" sizes="(min-width: 65em) 55vw, 90vw" alt="This (somewhat epic) slidedeck is done.">
</a></p>


            ]]></description>
      <pubDate>Tue, 20 Apr 2021 10:21:21 +0000</pubDate>
      <link>https://adactio.com/journal/18038</link>
      <dc:creator>Adactio: Journal</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/3047611177</guid>
    </item>
    <item>
      <title><![CDATA[Dark mode in 5 minutes, with inverted lightness variables]]></title>
      <description><![CDATA[<p>By now, you probably know that you can use custom properties for individual color components, to avoid repeating the same color coordinates multiple times throughout your theme. You may even know that you can use the same variable for multiple components, e.g. HSL hue and lightness:</p>
<pre><code class="language-css">:root {
	--primary-hs: 250 30%;
}

h1 {
	color: hsl(var(--primary-hs) 30%);
}

article {
	background: hsl(var(--primary-hs) 90%);
}

article h2 {
	background: hsl(var(--primary-hs) 40%);
	color: white;
}
</code></pre>
<p>Here is a <a href="https://codepen.io/leaverou/pen/QWdjpEL">very simple page designed with this technque</a>:</p>
<iframe id="cp_embed_QWdjpEL" src="https://codepen.io/anon/embed/QWdjpEL?height=500&amp;theme-id=1&amp;slug-hash=QWdjpEL&amp;default-tab=result" height="500" scrolling="no" frameborder="0" allowfullscreen="" allowpaymentrequest="" name="CodePen Embed QWdjpEL" title="CodePen Embed QWdjpEL" class="cp_embed_iframe" style="width:100%;overflow:hidden">CodePen Embed Fallback</iframe>
<p>Unlike preprocessor variables, you could even locally override the variable, <a href="https://codepen.io/leaverou/pen/rNjOypm">to have blocks with a different accent color</a>:</p>
<pre><code>:root {
	--primary-hs: 250 30%;
	--secondary-hs: 190 40%;
}

article {
	background: hsl(var(--primary-hs) 90%);
}

article.alt {
	--primary-hs: var(--secondary-hs);
}
</code></pre>
<iframe id="cp_embed_rNjOypm" src="https://codepen.io/anon/embed/rNjOypm?height=500&amp;theme-id=1&amp;slug-hash=rNjOypm&amp;default-tab=result" height="500" scrolling="no" frameborder="0" allowfullscreen="" allowpaymentrequest="" name="CodePen Embed rNjOypm" title="CodePen Embed rNjOypm" class="cp_embed_iframe" style="width:100%;overflow:hidden">CodePen Embed Fallback</iframe>
<p>This is all fine and dandy, until dark mode comes into play. The idea of using custom properties to make it easier to adapt a theme to dark mode is not new. However, <a href="https://alxgbsn.co.uk/2019/02/08/blog-theming-css-variables/">in</a> <a href="https://css-tricks.com/a-complete-guide-to-dark-mode-on-the-web/">every</a> <a href="https://dev.to/ananyaneogi/create-a-dark-light-mode-switch-with-css-variables-34l8">article</a> <a href="https://css-irl.info/quick-and-easy-dark-mode-with-css-custom-properties/">I</a> <a href="https://piccalil.li/tutorial/create-a-user-controlled-dark-or-light-mode">have</a> <a href="https://www.digitalocean.com/community/tutorials/css-theming-custom-properties">seen</a>, the strategy suggested is to create a bunch of custom properties, one for each color, and override them in a media query.</p>
<p>This is a fine approach, and you’ll likely want to do that for at least part of your colors eventually. However, even in the most disciplined of designs, not every color is a CSS variable. You often have colors declared inline, especially grays (e.g. the footer color in our example). This means that adding a dark mode is taxing enough that you may put it off for later, especially on side projects.</p>
<p>The trick I’m going to show you will make anyone who knows enough about color cringe (sorry Chris!) but it does help you create a dark mode that <em>works</em> in minutes. It won’t be great, and you should eventually tweak it to create a proper dark mode (also <a href="https://css-tricks.com/a-complete-guide-to-dark-mode-on-the-web/">dark mode is not just about swapping colors</a>) but it’s better than nothing and can serve as a base.
The basic idea is to use custom properties for the <em>lightness</em> of colors instead of the entire color. Then, in dark mode, you override these variables with <code>100% - lightness</code>. This generally produces light colors for dark colors, medium colors for medium colors, and dark colors for light colors, and still allows you to define colors inline, instead of forcing you to use a variable for every single color. This is what the code would look like for our example:</p>
<pre><code>root {
	--primary-hs: 250 30%;
	--secondary-hs: 190 40%;

	--l-0: 0%;
	--l-30: 30%;
	--l-40: 40%;
	--l-50: 50%;
	--l-90: 90%;
	--l-100: 100%;
}

@media (prefers-color-scheme: dark) {
	:root {
		--l-0: 100%;
		--l-30: 70%;
		--l-40: 60%;
		--l-90: 10%;
		--l-100: 0%;
	}
}


body {
	background: hsl(0 0% var(--l-100));
	color: hsl(0 0% var(--l-0));
}

h1 {
	color: hsl(var(--primary-hs) var(--l-30));
}

article {
	background: hsl(var(--primary-hs) var(--l-90));
}

article h2 {
	background: hsl(var(--primary-hs) 40%);
	color: white;
}

footer {
	color: hsl(0 0% var(--l-40));
}
</code></pre>
<iframe id="cp_embed_eYgJyav" src="https://codepen.io/anon/embed/eYgJyav?height=500&amp;theme-id=1&amp;slug-hash=eYgJyav&amp;default-tab=result" height="500" scrolling="no" frameborder="0" allowfullscreen="" allowpaymentrequest="" name="CodePen Embed eYgJyav" title="CodePen Embed eYgJyav" class="cp_embed_iframe" style="width:100%;overflow:hidden">CodePen Embed Fallback</iframe>
<p>The result looks like this in light &amp; dark mode:</p>
<figure>
	<img src="https://lea.verou.me/2021/03/inverted-lightness-variables/images/hsl-normal.png" alt="">
	<img src="https://lea.verou.me/2021/03/inverted-lightness-variables/images/hsl-dm.png" alt="">
	<figcaption>
	The light mode we designed and the auto-generated dark mode, side by side
	</figcaption>
</figure>
<p>Note that here we indiscriminately replaced all lightnesses with lightness variables. In reality, we don’t need to be quite as sweeping. For example, the article titles would actually look better and would have better contrast if we just kept them the same:</p>
<figure>
	<img src="https://lea.verou.me/2021/03/inverted-lightness-variables/images/hsl-dm.png" alt="">
	<img src="https://lea.verou.me/2021/03/inverted-lightness-variables/images/hsl-dm-exception.png" alt="">
	<figcaption>
<p>Comparison of dark mode with every lightness becoming a variable versus a more refined approach, where we make exceptions as needed (in this case the background and text colors for <code>article &gt; h2</code>).
</p></figcaption><p></p>
</figure>
<p>These are decisions that are easy to make while you go through your CSS replacing lightness percentages with variables and previewing the result.</p>
<h2 id="the-problem-with-hsl" tabindex="-1"><a class="header-anchor" href="https://lea.verou.me/2021/03/inverted-lightness-variables/#the-problem-with-hsl">The problem with HSL</a></h2>
<p>But <em>why</em> were the article headers easier to read with their original colors than with inverted lightness? The root cause is that HSL lightness does not actually correspond to what humans perceive as lightness, and the same lightness difference can produce vastly different perceptual differences.</p>
<p>That is the big problem with this approach: it assumes that HSL lightness actually means something, but <a href="https://lea.verou.me/2020/04/lch-colors-in-css-what-why-and-how/#3-lch-lightness-actually-means-something">as we’ve discussed before</a>, it does not. Yellow and blue have the same HSL lightness (50%) for crying out loud! Also, you will notice that your dark colors have smaller differences between them than your light colors, because <a href="https://lea.verou.me/2020/04/lch-colors-in-css-what-why-and-how/#2-lch-and-lab-is-perceptually-uniform">HSL is not perceptually uniform</a>.</p>
<p>Does that mean the technique is not useful for anything other than a placeholder while we develop our <em>real</em> dark mode, if that?</p>
<p>Well, things are not <em>quite</em> as grim.</p>
<p>Soon enough, we will get <a href="https://lea.verou.me/2020/04/lch-colors-in-css-what-why-and-how/">LCH colors</a> in the browser. The first browser implementation <a href="https://webkit.org/blog/11548/release-notes-for-safari-technology-preview-120/#post-11548:~:text=Added%20support%20for%20lab()%2C%20lch()%2C%20and%20color(lab%20...)%20colors">just recently shipped in Safari</a> and there is activity in that space among the other browser vendors too.</p>
<p>LCH is a much better color space for this technique, because its lightness actually means something, not just across different lightnesses of the same color, but across different hues and chromas.</p>
<p>This next example needs Safari TP 120+ . Compare these two gradients, the top one showing various HSL colors all with lightness 50%, and the bottom various LCH colors, all with lightness 50%. You can even adjust the slider and try different lightnesses:</p>
<iframe id="cp_embed_xxgOZQR" src="https://codepen.io/anon/embed/xxgOZQR?height=400&amp;theme-id=1&amp;slug-hash=xxgOZQR&amp;default-tab=result" height="400" scrolling="no" frameborder="0" allowfullscreen="" allowpaymentrequest="" name="CodePen Embed xxgOZQR" title="CodePen Embed xxgOZQR" class="cp_embed_iframe" style="width:100%;overflow:hidden">CodePen Embed Fallback</iframe>
<p>Here is a screenshot for those of you who don’t have access to Safari TP 120+:</p>
<p><img src="https://lea.verou.me/2021/03/inverted-lightness-variables/images/image.png" alt=""></p>
<p>Notice that in HSL, some colors (like yellow and cyan) are much lighter than others. In LCH, all colors at the same lightness are, well, the same lightness.</p>
<p>Keep in mind that LCH chroma doesn’t really correspond to HSL lightness, so even though we’ve set it to the same number, it doesn’t correspond to the same thing.</p>
<p>So, how would this technique work with LCH colors? Let’s try it out!</p>
<p>I used <a href="https://css.land/lch/">this tool</a> to convert the existing HSL colors to LCH, then tweaked the values manually a bit as the initially converted colors didn’t look nice across all LCH lightnesses (note that HSL colors with the same hue and saturation may have different hue and chromas in LCH. The opposite would defeat the point!). This is what this technique looks like with LCH colors instead (you will need Safari TP 120 or later to view this):</p>
<iframe id="cp_embed_df41d39c06f1b477bd00d57ce9c853ee" src="https://codepen.io/anon/embed/df41d39c06f1b477bd00d57ce9c853ee?height=500&amp;theme-id=1&amp;slug-hash=df41d39c06f1b477bd00d57ce9c853ee&amp;default-tab=result" height="500" scrolling="no" frameborder="0" allowfullscreen="" allowpaymentrequest="" name="CodePen Embed df41d39c06f1b477bd00d57ce9c853ee" title="CodePen Embed df41d39c06f1b477bd00d57ce9c853ee" class="cp_embed_iframe" style="width:100%;overflow:hidden">CodePen Embed Fallback</iframe>
<p>And here is a screenshot:</p>
<figure>
	<img src="https://lea.verou.me/2021/03/inverted-lightness-variables/images/lch-normal.png" alt="">
	<img src="https://lea.verou.me/2021/03/inverted-lightness-variables/images/lch-dm.png" alt="">
	<figcaption>
	Light mode and auto-generated dark mode via inverted lightness variables in LCH.
	</figcaption>
</figure>
<p>Not only does dark mode look a lot better, but even in light mode, our two alternate colors actually look more uniform since they have the same LCH lightness.</p>
<p>Here is a comparison of the two dark modes:</p>
<figure>
	<img src="https://lea.verou.me/2021/03/inverted-lightness-variables/images/hsl-dm.png" alt="">
	<img src="https://lea.verou.me/2021/03/inverted-lightness-variables/images/lch-dm.png" alt="">
	<figcaption>
	Light mode and auto-generated dark mode via inverted lightness variables in LCH.
	</figcaption>
</figure>
<p>Comparison of the two auto-generated dark modes, via HSL lightness on the left and LCH lightness on the right.</p>
<p>Here you can see an animated comparison of them over each other:</p>
<figure class="image-comparison">
	<img src="https://lea.verou.me/2021/03/inverted-lightness-variables/images/hsl-dm.png" alt="">
	<img src="https://lea.verou.me/2021/03/inverted-lightness-variables/images/lch-dm.png" alt="">
</figure>
<p>Note that in reality, until LCH colors are reliably supported everywhere you’d need to provide a fallback via <code>@supports</code>, but for brevity, I did not include one in this demo.</p>
<h2 id="automating-generation-of-lightness-variables" tabindex="-1"><a class="header-anchor" href="https://lea.verou.me/2021/03/inverted-lightness-variables/#automating-generation-of-lightness-variables">Automating generation of lightness variables</a></h2>
<p>If you are using a preprocessor that supports loops, such as Sass, you can automate the generation of these variables, and make them even more granular, e.g. every 5%:</p>
<pre><code>:root {
    @for $i from 0 through 20 {
        --l-#{$i * 5}: #{$i * 5}%;
    }
}

@media (prefers-color-scheme: dark) {
    :root {
        @for $i from 0 through 20 {
            --l-#{$i * 5}: #{100 - $i * 5}%;
        }
    }
}
</code></pre>
<h2 id="can-we-make-lightness-variables-more-dry%3F" tabindex="-1"><a class="header-anchor" href="https://lea.verou.me/2021/03/inverted-lightness-variables/#can-we-make-lightness-variables-more-dry%3F">Can we make lightness variables more DRY?</a></h2>
<p>Some of you may have disliked the repetition of values: we need to declare e.g. <code>--l-40</code> as 40%, then set it to 60% in dark mode. Can’t we derive it somehow, by subtracting the value we already have from 100%?</p>
<p>Those with experience in programming may try something like this:</p>
<pre><code>--l-40: calc(100% - var(--l-40));
</code></pre>
<p>However, this will not work. CSS is not an imperative language. It does not have steps of calculation, where variables have different values before and after each step. There is no such concept of time, all declarations that are currently applied, need to be true at once. It’s more similar to the reactive evaluation of spreadsheet formulas than to computation in JS and other popular programming languages (there are general purpose <a href="https://en.wikipedia.org/wiki/Reactive_programming">reactive programming</a> languages, but they are less well known). Therefore, declarations like the one above are considered cycles: since <code>--l-40</code> cannot refer to itself, this is an error, and <a href="https://drafts.csswg.org/css-variables/#cycles"><code>--l-40</code> would be set to its initial value</a> as an error recovery mechanism (since CSS cannot throw errors).</p>
<p>So, is there a way to avoid declaring lightness variables twice, once for light mode and once for dark mode?</p>
<p>There <em>is</em>, but I wouldn’t recommend it. It makes the code more convoluted to read and comprehend, for little benefit. But for the sake of intellectual amusement, I’m going to describe it here.</p>
<p>Instead of setting <code>--l-40</code> to 40%, we are going to set it in terms of its <em>difference from 50%</em>, i.e. <code>-10%</code>. Then, <code>calc(50% + var(--l-40))</code> gives us 40% and <code>calc(50% - var(--l-40))</code> gives us 60%, the two values we need. We can therefore declare one variable that is <code>-1</code> in dark mode and <code>1</code> in light mode, and just multiply with that.</p>
<p>Here is a subset of what our code would be like with this:</p>
<pre><code>:root {
	--dm: 1;

	/* Example declaration: */
	--l-40: -10%;
}

@media (prefers-color-scheme: dark) {
	:root {
		--dm: -1;
	}
}

/* Example usage: */

footer {
	color: hsl(0 0% calc(50% + var(--dm) * var(--l-40));
	/* Ewww! */
}
</code></pre>
<p>And hopefully now you can see why I wouldn’t recommend this: it makes <strong>usage</strong> much more complicated, to DRY up a few declarations that would only be specified once. It’s this kind of obsessive adherence to DRY that <a href="https://lea.verou.me/2020/09/developer-priorities-throughout-their-career/">programmers eventually realize is counterproductive</a>.</p>
<hr>
<p><em>Liked this article? Sign up for my <a href="https://smashingconf.com/online-workshops/workshops/lea-verou">Smashing Workshop on Dynamic CSS</a> for more content like this!</em></p>
]]></description>
      <pubDate>Tue, 30 Mar 2021 17:40:36 +0000</pubDate>
      <link>https://lea.verou.me/2021/03/inverted-lightness-variables/</link>
      <dc:creator>Lea Verou’s blog</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/2999760433</guid>
    </item>
    <item>
      <title><![CDATA[🧢 Stefan's Web Weekly #10]]></title>
      <description><![CDATA[<h2>
  <a href="https://dev.to/stefanjudis/stefan-s-web-weekly-10-16kd#welcome-to-web-weekly-10" class="anchor">
  </a>
  Welcome to Web Weekly #10
</h2>

<p>To start this week's edition, I want to ask you: <strong>what great resources, articles or videos did you discover recently</strong>? I'd love to include a "{YOUR_NAME} recommends" section in this newsletter. Please share resources with me by replying to this email (or <a href="https://mailto:stefanjudis@gmail.com">clicking this link when you're reading the newsletter online</a>).</p>

<p>This week's Web Weekly includes CSS tricks such as repeating gradients and the <code>:is</code> pseudo-class, a fascinating maker story, facts about the scary insecure web ecosystem, and, as always, GitHub repositories, new Tiny Helpers and some music.</p>

<p>Ready? Steady? Go!</p>

<h2>
  <a href="https://dev.to/stefanjudis/stefan-s-web-weekly-10-16kd#the-raw-is-endraw-pseudoclass-in-css" class="anchor">
  </a>
  The <code>:is</code> pseudo-class in CSS
</h2>

<p><a href="https://images.ctfassets.net/f20lfrunubsq/4Yk5201JVKb7roeR4d8Liv/12fd7ff35e76426636d028a950d12e79/Screenshot_2021-03-14_at_22.42.25.png" class="article-body-image-wrapper"><img src="https://images.ctfassets.net/f20lfrunubsq/4Yk5201JVKb7roeR4d8Liv/12fd7ff35e76426636d028a950d12e79/Screenshot_2021-03-14_at_22.42.25.png" alt="Kevin Powell describing CSS :is"></a></p>

<p>I discovered Kevin Powell's YouTube channel, and he's such an excellent teacher. If you're wondering what the <code>:is</code> pseudo-class is about, this video is golden.</p>

<p>👉 <a class="btn btn__small" href="https://www.youtube.com/watch?v=McC4QkCvbaY">Learn more about :is</a></p>

<h2>
  <a href="https://dev.to/stefanjudis/stefan-s-web-weekly-10-16kd#objective-search-engine-results" class="anchor">
  </a>
  "Objective" search engine results
</h2>

<p><a href="https://images.ctfassets.net/f20lfrunubsq/Etx1uUfj8u0mfPKnJfikW/e228bc6eac389237d2a4cbaa0bdc68e7/Screenshot_2021-03-14_at_23.08.37.png" class="article-body-image-wrapper"><img src="https://images.ctfassets.net/f20lfrunubsq/Etx1uUfj8u0mfPKnJfikW/e228bc6eac389237d2a4cbaa0bdc68e7/Screenshot_2021-03-14_at_23.08.37.png" alt="Search results in google and duckduckgo showing women and landscapes for the term beautiful"></a></p>

<p>How different could various search engine results be for general terms such as "beautiful". It turns out, very different! David Merian shared the results of Google and DuckDuckGo. This example shows the tech giants' control over the content we all consume. It's scary!</p>

<p>👉 <a class="btn btn__small" href="https://twitter.com/Recruit_and_U/status/1369379792538238981?s=20">Check the tweet</a></p>

<h2>
  <a href="https://dev.to/stefanjudis/stefan-s-web-weekly-10-16kd#the-insecure-system-of-programming-dependencies" class="anchor">
  </a>
  The insecure system of programming dependencies
</h2>

<p><a href="https://images.ctfassets.net/f20lfrunubsq/3P8VkU8umz2htaqS3afywo/167ef2cdd6e4b0fc297173e795b04d07/Screenshot_2021-03-08_at_10.48.11.png" class="article-body-image-wrapper"><img src="https://images.ctfassets.net/f20lfrunubsq/3P8VkU8umz2htaqS3afywo/167ef2cdd6e4b0fc297173e795b04d07/Screenshot_2021-03-08_at_10.48.11.png" alt="The code was meant for internal PayPal use, and, in its package.json file, appeared to contain a mix of public and private dependencies — public packages from npm, as well as non-public package names, most likely hosted internally by PayPal. These names did not exist on the public npm registry at the time."></a></p>

<p>This post is wild! Alex Birsan shared how he made it to run code in the infrastructure of companies such as Apple, Netflix and PayPal. All that was possible thanks to the insecure way we install software dependencies.</p>

<p>👉 <a class="btn btn__small" href="https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610">Read this scary story</a></p>

<h2>
  <a href="https://dev.to/stefanjudis/stefan-s-web-weekly-10-16kd#makers-gonna-make" class="anchor">
  </a>
  Makers gonna make...
</h2>

<p><a href="https://images.ctfassets.net/f20lfrunubsq/MOAxEsjEfo4yobXLYeZbv/88e7c04e676eaf459432c169181d33c0/Screenshot_2021-03-14_at_23.14.14.png" class="article-body-image-wrapper"><img src="https://images.ctfassets.net/f20lfrunubsq/MOAxEsjEfo4yobXLYeZbv/88e7c04e676eaf459432c169181d33c0/Screenshot_2021-03-14_at_23.14.14.png" alt="💡.kz, 👑.kz, 🌈.kz, 😎.kz. Buy, buy, buy, buy.  It was slightly painful watching my bank account going down, and the number of emoji domains go up.  80 emojis in, forking over money for a goat emoji domain name, you seriously start to question what you're doing.  $1200 later, 150 emoji domains were mine."></a></p>

<p>I love this story. Ben Stokes found out about emoji URLs, dug into the technical details, had an idea and went on to build a quick product. </p>

<p>👉 <a class="btn btn__small" href="https://tinyprojects.dev/projects/mailoji">Learn more about the emoji product</a></p>

<h2>
  <a href="https://dev.to/stefanjudis/stefan-s-web-weekly-10-16kd#the-unhealthy-hustle-culture" class="anchor">
  </a>
  The unhealthy hustle culture
</h2>

<p><a href="https://images.ctfassets.net/f20lfrunubsq/3VEh36b2cbOlwlWMWzJXhB/8f9c0e0f0cb90dcd73df8b7c0441b924/Screenshot_2021-03-14_at_23.01.10.png" class="article-body-image-wrapper"><img src="https://images.ctfassets.net/f20lfrunubsq/3VEh36b2cbOlwlWMWzJXhB/8f9c0e0f0cb90dcd73df8b7c0441b924/Screenshot_2021-03-14_at_23.01.10.png" alt="I can’t be productive, and I can’t fully relax, and I can’t possibly be alone in this."></a></p>

<p>Speaking about maker culture... Many people have side hustles these days. Heck, I'm writing a newsletter every Sunday evening. 🙈 Molly Conway questions if that's all worth it. </p>

<p>👉 <a class="btn btn__small" href="https://repeller.com/trap-of-turning-hobbies-into-hustles/">Reconsider your side projects</a></p>

<h2>
  <a href="https://dev.to/stefanjudis/stefan-s-web-weekly-10-16kd#the-user-experience-of-disabled-ui-elements" class="anchor">
  </a>
  The user experience of disabled UI elements
</h2>

<p><a href="https://images.ctfassets.net/f20lfrunubsq/6nG1B5JXvnMUGFvJm7jQA5/7ea50d89cbdcc7320d7617213af507f4/Screenshot_2021-03-14_at_22.55.49.png" class="article-body-image-wrapper"><img src="https://images.ctfassets.net/f20lfrunubsq/6nG1B5JXvnMUGFvJm7jQA5/7ea50d89cbdcc7320d7617213af507f4/Screenshot_2021-03-14_at_22.55.49.png" alt="Do/Dont example of disabled UI elements"></a></p>

<p>Since reading <a href="https://axesslab.com/disabled-buttons-suck/">Disabled buttons suck</a>, I rethink putting <code>disabled</code> attributes on buttons. Justin Win shares best practices and alternatives to disabled UI elements that provide a better user experience.</p>

<p>👉 <a class="btn btn__small" href="https://stories.justinewin.com/disabled-buttons-dont-have-to-suck-10da0bb6d37e">Rethink your UI</a></p>

<h2>
  <a href="https://dev.to/stefanjudis/stefan-s-web-weekly-10-16kd#css-functions-to-repeat-gradients" class="anchor">
  </a>
  CSS functions to repeat gradients
</h2>

<p><a href="https://images.ctfassets.net/f20lfrunubsq/2ydfRQaPwP2lZoVaSa51Y4/ee843e87e90364dcf6f972113b14e08e/Screenshot_2021-03-14_at_22.50.29.png" class="article-body-image-wrapper"><img src="https://images.ctfassets.net/f20lfrunubsq/2ydfRQaPwP2lZoVaSa51Y4/ee843e87e90364dcf6f972113b14e08e/Screenshot_2021-03-14_at_22.50.29.png" alt="CSS repeat gradient function explanation"></a></p>

<p>This week I learned that CSS defines functions to repeat gradients. I honestly wonder why I haven't seen these functions before. 😲</p>

<p>👉 <a class="btn btn__small" href="https://www.stefanjudis.com/today-i-learned/css-defines-functions-to-repeat-gradients/">Repeat your CSS gradients</a></p>

<h2>
  <a href="https://dev.to/stefanjudis/stefan-s-web-weekly-10-16kd#how-to-succeed-as-a-writer" class="anchor">
  </a>
  How to succeed as a writer
</h2>

<p><a href="https://images.ctfassets.net/f20lfrunubsq/1Y8hLbKSAfpYsSqDhld3HY/d927be1b67a62fe797e7a93a46a1b347/Screenshot_2021-03-14_at_22.57.00.png" class="article-body-image-wrapper"><img src="https://images.ctfassets.net/f20lfrunubsq/1Y8hLbKSAfpYsSqDhld3HY/d927be1b67a62fe797e7a93a46a1b347/Screenshot_2021-03-14_at_22.57.00.png" alt="You’re not alone.  Every writer doubts their ability to succeed — even the successful ones. "></a></p>

<p>Josh Spector wrote a wonderful motivational piece on writing and blogging. If you have doubts about publishing things online, this post is for you!</p>

<p>👉 <a class="btn btn__small" href="https://joshspector.com/succeed-as-a-writer/">Become a successful writer</a></p>

<h2>
  <a href="https://dev.to/stefanjudis/stefan-s-web-weekly-10-16kd#make-alt-text-required-when-tweeting-images" class="anchor">
  </a>
  Make alt text required when tweeting images
</h2>

<p><a href="https://images.ctfassets.net/f20lfrunubsq/7o5BsOvC4quOhYkLcO6PBA/5f2d28373ae7694030d9f8e24fd4338a/Screenshot_2021-03-14_at_23.20.58.png" class="article-body-image-wrapper"><img src="https://images.ctfassets.net/f20lfrunubsq/7o5BsOvC4quOhYkLcO6PBA/5f2d28373ae7694030d9f8e24fd4338a/Screenshot_2021-03-14_at_23.20.58.png" alt="Screenshot of twitter UI including a red &quot;Add alt text&quot; button"></a></p>

<p>Since reading <a href="https://meyerweb.com/eric/thoughts/2021/01/01/highlighting-accessible-twitter-content/">Eric Meyer's post that explains how to change Twitter to show images without alt text in grayscale</a>, it's scary to see how many images are inaccessible. I came across a Chrome/Firefox extension that enforces alt text when tweeting and installed it right away.</p>

<p>👉 <a class="btn btn__small" href="https://twitter.com/henrikbengtsson/status/1362462144449503232">Require image alt text to tweet</a></p>

<h2>
  <a href="https://dev.to/stefanjudis/stefan-s-web-weekly-10-16kd#sidebyside-cli-package-diffs" class="anchor">
  </a>
  side-by-side CLI package diffs
</h2>

<p><a href="https://images.ctfassets.net/f20lfrunubsq/3OOSOhbqxgz6OcLH7rzwA9/3fd785db0169d609d9bcc31fef6395b5/Screenshot_2021-03-13_at_20.31.18.png" class="article-body-image-wrapper"><img src="https://images.ctfassets.net/f20lfrunubsq/3OOSOhbqxgz6OcLH7rzwA9/3fd785db0169d609d9bcc31fef6395b5/Screenshot_2021-03-13_at_20.31.18.png" alt="npm side by side diff in the terminal"></a></p>

<p>The npm CLI tool recently got a valuable addition – <code>diff</code>. I updated one of my blog posts to reflect these changes. Read the post to find out how to show npm package diffs side-by-side right in your terminal.</p>

<p>👉 <a class="btn btn__small" href="https://www.stefanjudis.com/snippets/how-to-create-a-diff-of-npm-package-releases-on-the-command-line/">Start diffing your dependencies</a></p>

<h2>
  <a href="https://dev.to/stefanjudis/stefan-s-web-weekly-10-16kd#the-secret-of-convincing-presentations" class="anchor">
  </a>
  The secret of convincing presentations
</h2>

<p><a href="https://images.ctfassets.net/f20lfrunubsq/G6WAZdYDgGmWG2XEB088k/6af733f54b1404d6a99b7d9db9c64962/Screenshot_2021-03-14_at_22.47.10.png" class="article-body-image-wrapper"><img src="https://images.ctfassets.net/f20lfrunubsq/G6WAZdYDgGmWG2XEB088k/6af733f54b1404d6a99b7d9db9c64962/Screenshot_2021-03-14_at_22.47.10.png" alt="A good litmus test for images on slides: can you add a meaningful caption to the image - i.e., is there a point to the image? If you can’t write a caption for the image, you likely don’t need it there."></a></p>

<p>Public speaking (and slide design especially) is an art. When you get the people's attention for some time, it's on you to get the most out of their time. Tom Critchlow's post "Good Slides Reduce Complexity" includes valuable advice!</p>

<p>👉 <a class="btn btn__small" href="https://seomba.substack.com/p/good-slides-reduce-complexity">Improve your presentations</a></p>

<h2>
  <a href="https://dev.to/stefanjudis/stefan-s-web-weekly-10-16kd#new-tiny-helpers" class="anchor">
  </a>
  New tiny helpers
</h2>

<p><a href="https://images.ctfassets.net/f20lfrunubsq/5OK3XrfTa1mV20Uyl1Hc8j/f31f06508d7ddf6a88c6993ef6f67e5b/Screenshot_2021-03-14_at_23.42.51.png" class="article-body-image-wrapper"><img src="https://images.ctfassets.net/f20lfrunubsq/5OK3XrfTa1mV20Uyl1Hc8j/f31f06508d7ddf6a88c6993ef6f67e5b/Screenshot_2021-03-14_at_23.42.51.png" alt="Screenshots of unicode range interchange, myScale and ikon"></a></p>

<ul>
<li>
<a href="https://www.zachleat.com/unicode-range-interchange/">Unicode Range Interchange</a> – Do math on unicode-range values for web fonts.</li>
<li>
<a href="https://webkul.github.io/myscale/">myScale</a> – A quick SVG Icon Resizer.</li>
<li>
<a href="https://ikon.oliverturner.cloud/">ikon</a> – Build downloadable custom sprite sheets from dragged-and-dropped directories </li>
</ul>

<h2>
  <a href="https://dev.to/stefanjudis/stefan-s-web-weekly-10-16kd#three-useful-projects-to-have-a-look-at" class="anchor">
  </a>
  Three useful projects to have a look at
</h2>

<ul>
<li>
<a href="https://github.com/zachleat/glyphhanger">zachleat/glyphhanger</a> – Your web font utility belt.</li>
<li>
<a href="https://github.com/artperrin/image2csv">artperrin/image2csv</a> – Convert tables stored as images to an usable .csv file </li>
<li>
<a href="https://github.com/5t3ph/11ty-web-component-generator">5t3ph/11ty-web-component-generator</a> –  Use the power of 11ty to generate web components (custom elements).</li>
</ul>

<h2>
  <a href="https://dev.to/stefanjudis/stefan-s-web-weekly-10-16kd#a-quote-to-think-about" class="anchor">
  </a>
  A quote to think about
</h2>

<p><a href="https://remysharp.com/links/2021-02-11-b3204be1">Remy Sharp shared quick thoughts on paid online products</a>. I pay for a handful of tools I love using and 100% with the following statement.</p>

<blockquote>
<p>Free is great, but longevity is better and always worth paying for.</p>
</blockquote>

<h2>
  <a href="https://dev.to/stefanjudis/stefan-s-web-weekly-10-16kd#a-song-that-makes-you-stop-coding" class="anchor">
  </a>
  A song that makes you stop coding
</h2>

<p><a href="https://images.ctfassets.net/f20lfrunubsq/16YaOtp3kl6TSG43e5u7G8/4858449951944234dd328dbf770262ab/Screenshot_2021-03-14_at_23.46.53.png" class="article-body-image-wrapper"><img src="https://images.ctfassets.net/f20lfrunubsq/16YaOtp3kl6TSG43e5u7G8/4858449951944234dd328dbf770262ab/Screenshot_2021-03-14_at_23.46.53.png" alt="Cover: Patrick Wolf – Time of my life"></a></p>

<p>This week's song is one of my absolute favourite lifetime tracks. Patrick Wolf's "Time of my life" includes a piano, lots of strings, and it becomes so beautiful powerful to the end. I'll never get tired of this song!</p>

<p>👉 <a class="btn btn__small" href="https://www.youtube.com/watch?v=mn0vieqyu7E">Listen to Patrick Wolf</a></p>




<p>And that's a wrap for the tenth Web Weekly! 🎉 (oh wow... time flies)</p>

<p>Writing this newsletter takes me three hours every Sunday. If you enjoyed this edition, <a href="https://twitter.com/intent/tweet?text=I%20like%20@stefanjudis%20weekly%20newsletter&amp;url=https://www.stefanjudis.com/blog/web-weekly-10/">a quick share means the world to me</a> and <a href="https://www.stefanjudis.com/newsletter/">you can subscribe on my site</a>, too. ♥️</p>

<p><strong>Stay safe, and I'll talk to you next week!</strong> 🎉 👋</p>

<p>PS. I heard the cool kids use RSS. You can find <a href="https://www.stefanjudis.com/feeds/">multiple feeds on my site</a>.</p>

]]></description>
      <pubDate>Mon, 15 Mar 2021 10:03:42 +0000</pubDate>
      <link>https://dev.to/stefanjudis/stefan-s-web-weekly-10-16kd</link>
      <dc:creator>DEV Community</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/2963236661</guid>
    </item>
    <item>
      <title><![CDATA[March]]></title>
      <description><![CDATA[

<p>March 2020 was the month when the coronavirus really hit the fan for much of Europe and North America.</p>

<p>It’s now March 2021. People are understandably thinking about this time last year. <a href="http://tantek.com/2021/064/b1/one-year-since-homebrew-website-club">Tantek wrote about this anniversary</a>:</p>

<blockquote>
  <p>We reached our disembarkation stop and stepped off. I put my mask away. We hugged and said our goodbyes. Didn’t think it would be the last time I’d ride MUNI light rail. Or hug a friend without a second thought.</p>
</blockquote>

<p>I recently added <a href="https://adactio.com/archive/onthisday">an “on this day” page</a> to my site. Now that page is starting to surface events from <a href="https://adactio.com/archive/2020/03/">this time last year</a>.</p>

<p>Today, for example, is the one year anniversary of the last talk I gave in a physical space. Myself and <a href="https://remysharp.com/">Remy</a> <a href="https://adactio.com/notes/16517">travelled to Nottingham</a> to give our talk, <a href="https://adactio.com/articles/15975"><cite>How We Built The World Wide Web In Five Days</cite></a>.</p>

<p>The next morning, before travelling back to Brighton (where we’ve been ever since), we had breakfast together in <a href="https://adactio.com/notes/16522">a nice café</a>.</p>

<p><a href="https://adactio.com/notes/16521">I wrote</a>:</p>

<blockquote>
  <p>Eating toast with <a href="https://twitter.com/Rem">@Rem</a>.</p>
</blockquote>

<p>Usually when I post <a href="https://adactio.com/notes/toast">toast updates</a>, it’s a deliberate attempt to be banal. It harks back to the early criticism of blogging as just being people sharing what they’re having for lunch.</p>

<p>But now I look back at <a href="https://adactio.com/notes/16521">that little update</a> and it seems like a momentous event worth shouting from the rooftops. Breaking bread with a good friend? What I wouldn’t give to do that again!</p>

<p>I can’t wait until I can be together with my friends again, doing utterly ordinary things together. To “<a href="https://allpoetry.com/Canal-Bank-Walk">wallow in the habitual, the banal</a>” as the poet Patrick Kavanagh put it.</p>

<p>I miss hanging out with Tantek. I miss hanging out with Remy. I miss hanging out.</p>

<p>But I’m looking forward to being in a very different situation in March 2022, when I can look back at <em>this</em> time as belonging to a different era.</p>

<p>Between now and then, there’ll be a gradual, bumpy, asynchronous reintroduction of the everyday social pleasures. I won’t take them for granted. I’ll be posting about toast and other everyday occurrences “<a href="https://allpoetry.com/poem/8507389-Advent-by-Patrick-Kavanagh">wherever life pours ordinary plenty</a>.”</p>


            ]]></description>
      <pubDate>Tue, 09 Mar 2021 20:09:04 +0000</pubDate>
      <link>https://adactio.com/journal/17907</link>
      <dc:creator>Adactio: Journal</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/2950124244</guid>
    </item>
    <item>
      <title><![CDATA[Catching up on my bookmarks]]></title>
      <description><![CDATA[<p>The thing about loss is that it just doesn't seem to end. It gets easier though. One day you wake you and you're feeling fine but one insignificant action somehow opens the gates for the sadness to creep in. And then that's it. The floodgates open and the tears come out.</p>
<p>If I thought the last months of 2020 were somewhat hard, January really proved me wrong. I do regret that I neglected my monthly bookmarks post. I've been wondering if I should start sharing the bookmarks individually like some folks do so that it doesn't pile up. I will think about it.</p>
<p>I'm sure I accidentally missed some bookmarks - a consequence of delaying sharing them. I hope that I can catch up on my missed bookmarks in my next post. It is also likely that I accidentally missed some posts from friends. Being online hasn't been a priority for me.</p>
<p>Take care friends.</p>
<h2>Bookmarks related to tech or web development</h2>
<ul>
<li><a href="https://11ty.rocks/">11ty Rocks</a> by Stephanie Eckles.</li>
<li><a href="https://www.studio24.net/blog/accessibility-of-content-management-systems-whats-stopping-us/">Accessibility of Content Management Systems – what’s stopping us?</a> by Marie Manandise.</li>
<li><a href="https://www.wired.co.uk/article/stalkerware-spyware-monitoring-apps-uk">Inside the fight to rid the world of abusive stalkerware </a>by Helena Pozniak.</li>
<li><a href="https://shinesolutions.com/2018/01/08/falsehoods-programmers-believe-about-names-with-examples/">Falsehoods Programmers Believe About Names – With Examples</a> by Tony Rogers.</li>
<li><a href="https://css-tricks.com/gifs-and-prefers-reduced-motion/">GIFS and prefers-reduced-motion</a> by Chris Coyier.</li>
<li><a href="https://css-tricks.com/parsing-markdown-into-an-automated-table-of-contents/">Parsing Markdown into an Automated Table of Contents</a> by Lisi Linhart.</li>
<li><a href="http://a11yengineer.com/">Accessibility Acceptance Criteria</a>.</li>
<li><a href="https://dev.to/kimmaida/7-tips-for-career-advancement-and-personal-fulfillment-5e02">7 Tips for Career Advancement and Personal Fulfillment</a> by Kim Maida.</li>
<li><a href="https://www.washingtonpost.com/technology/2020/11/19/can-not-quit-facebook/">Why it’s easy to hate Facebook but hard to leave</a> by Heather Kelly.</li>
<li><a href="https://chrisburnell.com/article/time-to-cache-up/">Time to Cache Up</a> by Chris Burnell.</li>
<li><a href="https://plaiceholder.co/">Plaiceholder</a> by Joe Bell.</li>
<li><a href="https://css-tricks.com/a-dynamically-sized-sticky-sidebar-with-html-and-css/">A Dynamically-Sized Sticky Sidebar with HTML and CSS</a> by Ryan Mulligan.</li>
<li><a href="https://webfoundation.org/2020/11/the-impact-of-online-gender-based-violence-on-women-in-public-life/">The impact of online gender-based violence on women in public life</a> by Web Foundation.</li>
<li><a href="https://www.smashingmagazine.com/2020/11/weaving-web-accessibility-usability/">Weaving Web Accessibility With Usability</a> by Uri Paz.</li>
<li><a href="https://thoughtbot.com/blog/so-you-wanna-create-an-eco-friendly-website">So you wanna create an eco-friendly website</a> by Eric Bailey.</li>
<li><a href="https://visitmy.website/2020/12/05/bookmarks-3/">Boomarks #3</a> by Steve Messer.</li>
<li><a href="https://joelhooks.com/on-writing-more">Stop Giving af and Start Writing More</a> by Joel Hooks.</li>
<li><a href="https://www.joshwcomeau.com/css/rules-of-margin-collapse/">The Rules of Margin Collapse</a> by Joshua Comeau.</li>
<li><a href="https://almanac.httparchive.org/en/2020/accessibility">Web Alamanc - Accessibility</a> by Olu Niyi-Awosusi and Alex Tait.</li>
<li><a href="https://webdevlaw.uk/2020/12/09/facebook-derangement-syndrome/">Facebook Derangement Syndrome</a> by Heather Burns.</li>
<li><a href="https://kittygiraudel.com/2020/12/10/accessible-icon-links/">Accessible icon links</a> by Kitty Giraudel.</li>
<li><a href="https://yqnn.github.io/svg-path-editor/">SVG Path Editor</a></li>
<li><a href="https://www.technologyreview.com/2020/12/04/1013068/algorithms-create-a-poverty-trap-lawyers-fight-back/">The coming war on the hidden algorithms that trap people in poverty</a> by Karen Hao.</li>
<li><a href="https://henry.codes/writing/spotify-now-playing/">How To Use The Spotify API and Netlify Functions To Build A “Now Playing” Widget</a> by Henry Desroches.</li>
<li><a href="https://thoughtbot.com/blog/alt-vs-figcaption">Alt vs Figcaption</a> by Elaina Natario.</li>
<li><a href="https://css-tricks.com/not-much/">Not Much</a> by Ire Aderinokun.</li>
<li><a href="https://www.theatlantic.com/technology/archive/2020/12/facebook-doomsday-machine/617384/">Facebook Is a Doomsday Machine</a> by Adrienne LaFrance.</li>
<li><a href="https://umaar.com/dev-tips/242-considerate-javascript/">Conditional JavaScript, only download when it is appropriate to do so</a> by Umar.</li>
<li><a href="https://ably.com/blog/airtable-database-realtime-messages">Using Airtable as a database to store realtime messages</a> by Srushtika Neelakantam.</li>
<li><a href="https://remysharp.com/2020/12/17/webbish">Webbish</a> by Remy Sharp.</li>
<li><a href="https://medium.com/bumble-tech/interface-localisation-adapting-text-fields-for-rtl-languages-67a386006a17">Interface localisation: adapting text fields for RTL languages</a> by Mitya Kuznetsov.</li>
<li><a href="https://www.smashingmagazine.com/search-engine-optimization-checklist/">Search Engine Optimization Checklist (PDF)</a> by Frederick O’Brien.</li>
<li><a href="https://tomcritchlow.com/2018/02/23/small-b-blogging/">Small b blogging</a> by Tom Critchlow.</li>
<li><a href="https://colly.com/articles/this-used-to-be-our-playground">This used to be our playground</a> by Simon Collison.</li>
<li><a href="https://blog.tito.io/posts/designing-with-empathy/">Designing with Empathy: Don’t</a> by Doc Parsons.</li>
<li><a href="https://dev.to/marcysutton/content-visibility-and-accessible-semantics-2994">Content-visibility and Accessible Semantics</a> by Marcy Sutton.</li>
<li><a href="https://amberwilson.co.uk/blog/are-your-anchor-links-accessible/">Are your anchor links accessible?</a> by Amber Wilson.</li>
<li><a href="https://themarkup.org/2020-in-review/2020/12/15/algorithms-bias-racism-surveillance">Algorithms Behaving Badly: 2020 Edition</a> by The Markup Staff.</li>
<li><a href="https://www.nj.com/middlesex/2020/12/he-spent-10-days-in-jail-after-facial-recognition-software-led-to-the-arrest-of-the-wrong-man-lawsuit-says.html">He spent 10 days in jail after facial recognition software led to the arrest of the wrong man, lawsuit </a>says by Anthony G. Attrino.</li>
<li><a href="https://www.vice.com/en/article/zme97a/inside-the-strange-world-of-youtube-thumbnails">Inside the Strange World of YouTube Thumbnails</a> by Louise Matsakis.</li>
<li><a href="https://eleventy-parcel.netlify.app/">Eleventy-Parcel</a> by Michelle Barker.</li>
<li><a href="https://github.com/5t3ph/eleventy-plugin-template">Eleventy Plugin Template</a> by Stephanie Eckles.</li>
<li><a href="https://css-tricks.com/give-your-eleventy-site-superpowers-with-environment-variables/">Give your Eleventy Site Superpowers with Environment Variables</a> by Andy Bell.</li>
<li><a href="https://tink.uk/thoughts-on-screen-readers-and-image-recognition/">Thoughts on screen readers and image recognition</a> by Léonie Watson.</li>
<li><a href="https://yuanchuan.dev/how-to-make-seamless-patterns">How To Make Seamless Patterns</a> by Yuan Chuan.</li>
<li><a href="https://hiddedevries.nl/en/blog/2021-01-04-how-i-turned-my-goodreads-data-into-a-self-hosted-website-with-eleventy">How I turned my Goodreads data into a self-hosted website with Eleventy</a> by Hidde de Vries.</li>
<li><a href="https://sia.codes/posts/architecting-data-in-eleventy/">Architecting data in Eleventy</a> by Sia Karamalegos.</li>
<li><a href="https://ishadeed.com/article/building-real-life-components/">The Art of Building Real-life Components</a> by Ahmad Shadeed.</li>
<li><a href="https://beesbuzz.biz/blog/2316-Distributed-toxicity-and-the-IndieWeb">Distributed toxicity and the IndieWeb</a> by Fluffy.</li>
<li><a href="https://defaced.dev/tools/simple-social-image-resizer/">Simple Social Image Resizer</a> by Chris Johnson.</li>
<li><a href="https://www.smashingmagazine.com/2021/01/front-end-performance-2021-free-pdf-checklist/">Front-End Performance Checklist 2021</a> by Vitaly Friedman.</li>
<li><a href="https://codersblock.com/blog/the-surprising-things-that-css-can-animate/">The Surprising Things That CSS Can Animate</a> by Will Boyd.</li>
<li><a href="https://sarahmhigley.com/writing/grids-part2/">Grids Part 2: Semantics</a> by Sarah Higley.</li>
<li><a href="https://svgcrop.com/">SVG Crop</a> by Steve Dennett.</li>
<li><a href="https://www.technologyreview.com/2021/01/29/1017065/ai-image-generation-is-racist-sexist/">An AI saw a cropped photo of AOC. It autocompleted her wearing a bikini</a> by Karen Hao.</li>
<li><a href="https://webdevlaw.uk/2021/01/30/why-generation-x-will-save-the-web/">Why Generation X will save the web</a> by Heather Burns</li>
<li><a href="https://adactio.com/journal/17794">Authentication</a> by Jeremy Keith.</li>
<li><a href="https://uxdesign.cc/uniwidth-typefaces-for-interface-design-b6e8078dc0f7">Uniwidth typefaces for interface design</a> by Lisa Staudinger.</li>
<li><a href="https://dev.to/georgedoescode/create-a-generative-landing-page-webgl-powered-background-animation-3nl0">Create a generative landing page &amp; WebGL powered background animation</a> by George Francis.</li>
<li><a href="https://taeluralexis.com/2021/02/08/command-line-basics-a-short-sweet-introduction/">Command Line Basics: A Short &amp; Sweet Introduction</a> by Tae'lur Alexis.</li>
<li><a href="https://exposing.ai/">Exposing.ai</a> by by Adam Harvey and Jules LaPlace.</li>
<li><a href="https://www.aboutmonica.com/blog/adding-instagram-timeline-to-next-js-site">How to Add Instagram Timeline To a NextJS Site</a> by Monica Powell.</li>
<li><a href="https://ericwbailey.design/writing/accessibility-auditing-and-ego/">Accessibility auditing and ego</a> by Eric W Bailey.</li>
<li><a href="https://css-irl.info/finding-an-elements-nearest-relative-positioned-ancestor/">Finding an Element’s Nearest Relative Positioned Ancestor</a> by Michelle Barker.</li>
<li><a href="https://benmyers.dev/blog/skip-links/">Implement a Skip Link for Navigation-Heavy Sites</a> by Ben Myers.</li>
<li><a href="https://adrianroselli.com/2020/02/link-targets-and-3-2-5.html">Link Targets and 3.2.5</a> by Adrian Roselli.</li>
<li><a href="https://piccalil.li/tutorial/improve-the-readability-of-the-content-on-your-website">Improve the readability of the content on your website</a> by Andy Bell.</li>
<li><a href="https://www.smashingmagazine.com/2021/02/responsive-image-effects-css-gradients-aspect-ratio/">Create Responsive Image Effects With CSS Gradients And aspect-ratio</a> by Stephanie Eckles.</li>
</ul>
<h2>Other bookmarks</h2>
<ul>
<li><a href="https://www.thetricontinental.org/studies-4-coronashock-and-patriarchy/">CoronaShock and Patriarchy</a>.</li>
<li><a href="https://www.vox.com/2020/11/12/21562278/jails-prisons-texas-covid-19-coronavirus-crime-prisoners-death">80 percent of those who died of Covid-19 in Texas county jails were never convicted of a crime</a> by Jerusalem Demsas.</li>
<li><a href="https://medium.com/@damonreece/the-uncanny-valley-of-culture-9d035a3c1776">The Uncanny Valley of Culture</a> by Damon.</li>
<li><a href="https://www.theguardian.com/world/2020/nov/26/matt-hancock-former-neighbour-won-covid-test-kit-contract-after-whatsapp-message">Hancock's former neighbour won Covid test kit work after WhatsApp message</a> by Felicity Lawrence.</li>
<li><a href="https://thecorrespondent.com/820/the-time-has-come-to-take-the-self-out-of-self-care/108559145640-42103323">The time has come to take the self out of self-care</a> by Tanmoy Goswami.</li>
<li><a href="https://visitmy.website/2020/12/12/reading-list-picks-of-2020/">Reading list picks of 2020</a> by Steve Messer.</li>
<li><a href="https://lyz.substack.com/p/the-real-reason-local-newspapers">The Real Reason Local Newspapers are Dying</a> by Lyz.</li>
<li><a href="https://www.glaad.org/amp/beginners-guide-being-ally-to-trans-people">A beginner's guide to being an ally to trans people</a> by Ted Ravago.</li>
<li><a href="https://www.bbc.co.uk/news/world-asia-55301200">The family with no fingerprints</a> by Mir Sabbir.</li>
<li><a href="https://twitter.com/Rainmaker1973/status/1340643235983740929">Trail cam footage of opossum and a skunk.</a></li>
<li><a href="https://www.spacetobefree.co.uk/thoughts/newyear">Figuring Out What You Need To Flourish In The New Year</a> by Nina Dearden.</li>
<li><a href="https://tatianamac.com/posts/mistakes/">Compassionate action over empathy</a> by Tatiana Mac.</li>
<li><a href="https://twitter.com/johnharris1969/status/1346545808515223556">Lockdown ramifications</a>.</li>
<li><a href="https://hbr.org/2020/12/why-you-need-to-stop-using-these-words-and-phrases">Why You Need to Stop Using These Words and Phrases</a> by Rakshitha Arni Ravishankar.</li>
<li><a href="https://www.dw.com/en/in-germany-your-ex-must-destroy-nude-photos-on-request/a-18934921">In Germany, your ex must destroy nude photos on request</a> by Ben Knight.</li>
<li><a href="https://www.curbed.com/2021/01/vessel-hudson-yards-suicide-problem.html">I Knew the Vessel Was Going to Have a Suicide Problem Years Before It Was Built</a> by Audrey Wachs.</li>
<li><a href="https://www.theguardian.com/inequality/2017/nov/08/us-vs-them-the-sinister-techniques-of-othering-and-how-to-avoid-them">Us vs them: the sinister techniques of ‘Othering’ – and how to avoid them</a> by John A Powell.</li>
<li><a href="https://www.thecut.com/2020/07/ana-de-armas-infamous-twitter-stan-account-speaks.html">Twitter’s Most Infamous Stan Account Speaks</a> by Sangeeta Singh-Kurtz.</li>
<li><a href="https://www.theguardian.com/technology/2021/jan/20/far-right-extremists-take-over-uk-land-sales-facebook-page">Far-right extremists take over UK land sales Facebook page</a> by Alex Hern.</li>
<li><a href="https://chias.blog/2021/in-defense-of-disorder-on-career-creativity-and-professionalism/">In defense of disorder: on career, creativity, and professionalism</a> by Chiara Amisola.</li>
<li><a href="https://francesmx.medium.com/how-i-recovered-from-imposter-syndrome-after-changing-career-to-software-engineering-a4edbf609d44">How I recovered from imposter syndrome after changing career to software engineering</a> by Frances Maxwell.</li>
<li><a href="https://www.propublica.org/article/meet-the-customer-service-reps-for-disney-and-airbnb-who-have-to-pay-to-talk-to-you?utm_medium=social&amp;utm_source=twitter">Meet the Customer Service Reps for Disney and Airbnb Who Have to Pay to Talk to You</a> by Ken Armstrong, Justin Elliott and Ariana Tobin.</li>
<li><a href="https://www.huffingtonpost.co.uk/entry/hoarding-second-generation-families_uk_5f85647ac5b6e6d033a75528">Hoarding Is All Too Familiar To Second Generation Brits. Here's Why</a> by Deborah Yewande Bankole.</li>
<li><a href="https://conversationalist.org/2021/02/19/content-moderation-wont-stop-the-spread-of-disinformation-heres-why/">Content moderation won’t stop the spread of disinformation. Here’s why</a> by Jillian C. York</li>
<li><a href="https://www.nytimes.com/2021/02/23/opinion/britney-spears-mara-wilson-hollywood.html">The Lies Hollywood Tells About Little Girls</a> by Mara Wilson.</li>
</ul>
]]></description>
      <pubDate>Sat, 06 Mar 2021 13:00:00 +0000</pubDate>
      <link>https://ohhelloana.blog/catching-up-on-my-bookmarks/</link>
      <dc:creator>Ana Rodrigues</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/2941232731</guid>
    </item>
    <item>
      <title><![CDATA[Reading List 272]]></title>
      <description><![CDATA[<ul>
<li><a href="https://developers.google.com/web/android/trusted-web-activity">Trusted Web Activity</a> – “a new way to open your web-app content such as your Progressive Web App (PWA) from your Android app”. Basically, get your PWA in the App Store, create a feedback channel via ratings and reviews, use Play Billing.</li>
<li><a href="https://f-word.dev/episodes/9/">The F-Word episode 9</a> – Vadders and I discuss Safari extensions, cascading layers of CSS, what’s new in WCAG 3</li>
<li><a href="https://codepen.io/MoritzGiessmann/pen/PobErJB">&lt;details&gt; and &lt;summary&gt; with animated arrow (no JS)</a> by Moritz Gießmann, faking the arrow with borders so no extra content is inserted that may confuse an assitive technology user. Brilliant!</li>
<li><a href="https://dev.to/karmasakshi/make-your-pwas-look-handsome-on-ios-1o08">Make Your PWAs Look Handsome on iOS</a> (I haven’t verified this)</li>
<li><a href="https://www.applevis.com/blog/apple-executives-bonuses-be-tied-their-performance-respect-accessibility-and-companys-other">Apple Executives’ Bonuses to Be Tied to Their Performance With Respect to Accessibility and the Company’s Other Core Values</a></li>
<li><a href="https://www.smashingmagazine.com/2021/02/material-design-text-fields/">Material Design Text Fields Are Badly Designed</a> by Adam Silver</li>
<li><a href="https://mobilityarena.com/ios-apps-are-larger-than-android-apps/">Did you know: iOS apps are insanely larger than Android apps</a> – “compared to Android apps, iOS apps are huge. Much bigger. The big question is, Why are iOS apps bigger than Android apps? We answer the question.”</li>
<li><a href="https://yakim.nl/articles/voiceover-testing/">How to start testing screen reader support using VoiceOver</a></li>
<li><a href="https://tabula.technology/">Tabula</a> is a tool for liberating data tables locked inside PDF files. “Now you can work with your data as text file or a spreadsheet rather than a PDF!”</li>
<li><a href="https://arstechnica.com/tech-policy/2021/02/citibank-just-got-a-500-million-lesson-in-the-importance-of-ui-design/">Citibank just got a $500 million lesson in the importance of UI design</a> – “Citibank was trying to make $7.8M in interest payments. It sent $900M instead.”</li>
<li><a href="https://www.techdirt.com/articles/20210217/22383446265/bizarre-reaction-to-facebooks-decision-to-get-out-news-business-australia.shtml">The Bizarre Reaction To Facebook’s Decision To Get Out Of The News Business In Australia</a> – “First is the link tax. This is fundamentally against the principles of an open internet… a bunch of lazy newspaper execs who failed to adapt and to figure out better internet business models not only want the traffic, they also want to get paid for it.”</li>
<li><a href="https://www.bbc.co.uk/news/technology-56071437">Spy pixels in emails have become endemic</a> – “Hey’s review indicated that two-thirds of emails sent to its users’ personal accounts contained a “spy pixel”, even after excluding for spam.”</li>
<li><a href="https://mobiledevmemo.com/allow-this-app-to-personalize-advertising-for-you/">“Allow this app to personalize advertising for you?”</a> – “Apple defines privacy in a way that benefits its own commercial interests and harms the commercial interests of its competitors. Apple has wrapped its arms around the open internet with a privacy bear hug that is designed to entrench and enrich its own closed ecosystem.”</li>
<li><a href="https://www.theregister.com/2021/02/18/cambodia_national_internet_gateway/">Cambodia to force all internet traffic through national ‘Internet Gateway’</a> – “De facto one-party state decrees censorship scheme that sounds a lot like China’s Great Firewall”</li>
<li><a href="https://remysharp.com/2021/02/11/the-web-didnt-change-you-did">The web didn’t change; you did</a> by Remy Sharp</li>
</ul>
]]></description>
      <pubDate>Fri, 26 Feb 2021 15:22:39 +0000</pubDate>
      <link>https://www.brucelawson.co.uk/2021/reading-list-272/</link>
      <dc:creator>Bruce Lawson&#39;s  personal site</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/2925537069</guid>
    </item>
    <item>
      <title><![CDATA[Collective #649]]></title>
      <description><![CDATA[<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://www.wildsouls.gr/en"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_WOTW.jpg" alt="" class="wp-image-53470"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://www.wildsouls.gr/en">Inspirational Website of the Week: Wild Souls</a></h2>
<p class="ct-coll-p">A beautiful font pairing and saturated colors make this design really inviting. The result of a fantastic collaboration between <a href="https://www.bighorrorathens.com/">Big Horror</a> and <a href="https://www.bighorrorathens.com/">No Matter</a>.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://www.wildsouls.gr/en">Get inspired</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" href="https://www.elegantthemes.com/affiliates/idevaffiliate.php?id=17972_5_1_19" rel="nofollow sponsored noopener noreferrer" target="_blank"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/01/C643_Divi.jpg" alt="Collective 643 item image" class="wp-image-52735"></a><p></p>
<div class="ct-coll-sponsorship">Our Sponsor</div>
<h2><a href="https://www.elegantthemes.com/affiliates/idevaffiliate.php?id=17972_5_1_19" style="display: block; padding: 1rem 0 0; text-decoration: none;" rel="nofollow sponsored noopener noreferrer" target="_blank">Instant websites for your clients with Divi Layout Packs</a></h2>
<p class="ct-coll-p">With the Divi Layout Packs you’ll get world-class designs ready to be used for your client projects.</p>
<p>        <a class="ct-coll-link" href="https://www.elegantthemes.com/affiliates/idevaffiliate.php?id=17972_5_1_19" rel="nofollow sponsored noopener noreferrer" target="_blank">Check it out</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://www.awwwards.com/page-transitions-creative-examples-resources-and-some-tips.html"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_transition.jpg" alt="" class="wp-image-53472"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://www.awwwards.com/page-transitions-creative-examples-resources-and-some-tips.html">Page Transitions: Creative Examples, Resources and some Tips</a></h2>
<p class="ct-coll-p">Dive into the world of transitions and get inspired by wonderful examples and creative ideas.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://www.awwwards.com/page-transitions-creative-examples-resources-and-some-tips.html">Check it out</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://penpot.app/"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_Penpot.jpg" alt="" class="wp-image-53464"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://penpot.app/">Penpot</a></h2>
<p class="ct-coll-p">Penpot is the first Open Source design and prototyping platform meant for cross-domain teams.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://penpot.app/">Check it out</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://nolanlawson.com/2021/02/13/managing-focus-in-the-shadow-dom/"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_shadowdom.jpg" alt="" class="wp-image-53460"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://nolanlawson.com/2021/02/13/managing-focus-in-the-shadow-dom/">Managing focus in the shadow DOM</a></h2>
<p class="ct-coll-p">Nolan Lawson describes what JavaScript libraries for focus management would need to do to support shadow DOM.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://nolanlawson.com/2021/02/13/managing-focus-in-the-shadow-dom/">Read it</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://smolcss.dev/"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_smol.jpg" alt="" class="wp-image-53465"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://smolcss.dev/">SmolCSS</a></h2>
<p class="ct-coll-p">Minimal snippets for modern CSS layouts and components, created by Stephanie Eckles of ModernCSS.dev.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://smolcss.dev/">Check it out</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://www.remotion.dev/"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_remotion.jpg" alt="" class="wp-image-53459"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://www.remotion.dev/">Remotion</a></h2>
<p class="ct-coll-p">Create MP4 motion graphics in React. Leverage CSS, SVG, WebGL and more technologies to render videos programmatically with this tool.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://www.remotion.dev/">Check it out</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://ishadeed.com/article/understanding-z-index/"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_zindexsystem.jpg" alt="" class="wp-image-53458"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://ishadeed.com/article/understanding-z-index/">Understanding Z-Index in CSS</a></h2>
<p class="ct-coll-p">A visual guide on how z-index and stacking contexts work in CSS.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://ishadeed.com/article/understanding-z-index/">Read it</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://css-auditors.com/reports/premier-league-2021-02/"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_sizecss.jpg" alt="" class="wp-image-53468" srcset="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_sizecss.jpg 350w, http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_sizecss-266x300.jpg 266w" sizes="(max-width: 350px) 100vw, 350px"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://css-auditors.com/reports/premier-league-2021-02/">The CSS File Size and Count Report for Premier League sites</a></h2>
<p class="ct-coll-p">An interesting file size report of CSS used on Premier League sites. Silvestar Bistrovi?.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://css-auditors.com/reports/premier-league-2021-02/">Check it out</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://github.com/conwnet/github1s"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_github.jpg" alt="" class="wp-image-53449"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://github.com/conwnet/github1s">github1s</a></h2>
<p class="ct-coll-p">One second to read GitHub code with VS Code. Just add 1s after github and press Enter in the browser address bar for any repository you want to read.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://github.com/conwnet/github1s">Check it out</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://web.dev/building-a-tabs-component/"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_tabs.jpg" alt="" class="wp-image-53454"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://web.dev/building-a-tabs-component/">Building a Tabs component</a></h2>
<p class="ct-coll-p">A foundational overview of how to build a tabs component similar to those found in iOS and Android apps.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://web.dev/building-a-tabs-component/">Read it</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://dev.to/jonkantner/canvas-snow-in-a-tweet-2433"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_snow.jpg" alt="" class="wp-image-53452"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://dev.to/jonkantner/canvas-snow-in-a-tweet-2433">Fitting Canvas Snow In a Tweet</a></h2>
<p class="ct-coll-p">Jon Kantner shows how to code up a really nice snow effect with minimal code.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://dev.to/jonkantner/canvas-snow-in-a-tweet-2433">Read it</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://blog.bitsrc.io/programmatically-generate-images-with-css-painting-api-3b1a860dae3b"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_paintingapi.jpg" alt="" class="wp-image-53466"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://blog.bitsrc.io/programmatically-generate-images-with-css-painting-api-3b1a860dae3b">Programmatically Generate Images with CSS Painting API</a></h2>
<p class="ct-coll-p">Viduni Wickramarachchi’s tutorial about the CSS Paining API and how to use it to generate a geometric image programmatically.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://blog.bitsrc.io/programmatically-generate-images-with-css-painting-api-3b1a860dae3b">Read it</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://remysharp.com/2021/02/11/the-web-didnt-change-you-did"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_webhasntchanged.jpg" alt="" class="wp-image-53463"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://remysharp.com/2021/02/11/the-web-didnt-change-you-did">The web didn’t change; you did</a></h2>
<p class="ct-coll-p">A very interesting article by Remy Sharp where he explains why “the problem with developing front end projects isn’t that it’s harder or more complicated, it’s that you made it harder and more complicated”.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://remysharp.com/2021/02/11/the-web-didnt-change-you-did">Read it</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://codepen.io/YusukeNakaya/pen/dyOWmNx"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_cssparticles.jpg" alt="" class="wp-image-53451"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://codepen.io/YusukeNakaya/pen/dyOWmNx">Only CSS: Placer Gold Rush</a></h2>
<p class="ct-coll-p">A beautiful CSS demo made by Yusuke Nakaya.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://codepen.io/YusukeNakaya/pen/dyOWmNx">Check it out</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://v8.dev/blog/adaptor-frame"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_fasterjs.jpg" alt="" class="wp-image-53461"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://v8.dev/blog/adaptor-frame">Faster JavaScript calls</a></h2>
<p class="ct-coll-p">Victor Gomes explains how the simple idea helped improve performance of JavaScript calls.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://v8.dev/blog/adaptor-frame">Read it</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://davorsuljic.github.io/css-border-font.html"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_fontcss.jpg" alt="" class="wp-image-53450"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://davorsuljic.github.io/css-border-font.html">CSS Border Font</a></h2>
<p class="ct-coll-p">A supercool CSS based font made by Davor Suljic using borders.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://davorsuljic.github.io/css-border-font.html">Check it out</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://jobs.smashingmagazine.com/2021/02/css-z-index-large-projects/"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_zindexguide.jpg" alt="" class="wp-image-53457"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://jobs.smashingmagazine.com/2021/02/css-z-index-large-projects/">Managing CSS Z-Index In Large Projects</a></h2>
<p class="ct-coll-p">Steven Frieson shares an easy-to-implement mini-framework based on existing conventions for better managing z-index in larger projects.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://jobs.smashingmagazine.com/2021/02/css-z-index-large-projects/">Read it</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://css-tricks.com/css-switch-case-conditions/"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_conditional.jpg" alt="" class="wp-image-53455" srcset="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_conditional.jpg 350w, http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_conditional-322x300.jpg 322w" sizes="(max-width: 350px) 100vw, 350px"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://css-tricks.com/css-switch-case-conditions/">CSS Switch-Case Conditions</a></h2>
<p class="ct-coll-p">Yair Even Or explains how to emulate switch-case conditions in CSS.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://css-tricks.com/css-switch-case-conditions/">Read it</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://dmitripavlutin.com/enhance-fetch-with-decorator-pattern/"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_fetcher.jpg" alt="" class="wp-image-53469"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://dmitripavlutin.com/enhance-fetch-with-decorator-pattern/">How to Greatly Enhance fetch() with the Decorator Pattern</a></h2>
<p class="ct-coll-p">Dmitri Pavlutin writes about how to use the decorator pattern to enhance the possibilities and flexibly of the fetch() API.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://dmitripavlutin.com/enhance-fetch-with-decorator-pattern/">Read it</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://css-tricks.com/is-css-float-deprecated/"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_float.jpg" alt="" class="wp-image-53471"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://css-tricks.com/is-css-float-deprecated/">Is CSS float deprecated?</a></h2>
<p class="ct-coll-p">Robin Rendle explains why we can pack away <code>float</code> and only use it for making text flow around images.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://css-tricks.com/is-css-float-deprecated/">Read it</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://freebiesbug.com/figma-freebies/dialy-ui-kit/"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_dialy.jpg" alt="" class="wp-image-53462"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://freebiesbug.com/figma-freebies/dialy-ui-kit/">Dialy: Open source UI Kit for Figma</a></h2>
<p class="ct-coll-p">Dialy UI Kit is a free, open source User Interface Kit for Figma, designed and released by Aayush Gupta.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://freebiesbug.com/figma-freebies/dialy-ui-kit/">Check it out</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://bradfrost.com/blog/post/front-of-the-front-end-and-back-of-the-front-end-web-development/"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_frontofthefront.jpg" alt="" class="wp-image-53456"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://bradfrost.com/blog/post/front-of-the-front-end-and-back-of-the-front-end-web-development/">Front-of-the-front-end and back-of-the-front-end web development</a></h2>
<p class="ct-coll-p">Brad Frost writes about the much-needed distinction between the types of web development that need to occur in order to build successful web things.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://bradfrost.com/blog/post/front-of-the-front-end-and-back-of-the-front-end-web-development/">Read it</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://web.dev/devices-introduction/"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_accesshardware.jpg" alt="" class="wp-image-53467"></a><p></p>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://web.dev/devices-introduction/">Accessing hardware devices on the web</a></h2>
<p class="ct-coll-p">François Beaufort explains how to pick the appropriate API to communicate with a hardware device of your choice.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://web.dev/devices-introduction/">Read it</a><br>
</p></article>
</div>
<div class="ct-coll-item">
<hr class="ct-coll-emailsep" style="border: 0; margin: 40px auto;">
<article>
        <a class="ct-coll-thumb" target="_blank" rel="noopener noreferrer" href="https://tympanus.net/codrops/2021/02/17/ideas-for-css-button-hover-animations/"><img src="http://i7x7p5b7.stackpathcdn.com/codrops/wp-content/uploads/2021/02/C649_buttons.jpg" alt="" class="wp-image-53453"></a><p></p>
<div class="ct-coll-sponsorship">From Our Blog</div>
<h2><a target="_blank" rel="noopener noreferrer" style="display: block; padding: 1rem 0 0; text-decoration: none;" href="https://tympanus.net/codrops/2021/02/17/ideas-for-css-button-hover-animations/">Ideas for CSS Button Hover Animations</a></h2>
<p class="ct-coll-p">Some inspiration for button hover animations using CSS only.</p>
<p>        <a class="ct-coll-link" target="_blank" rel="noopener noreferrer" href="https://tympanus.net/codrops/2021/02/17/ideas-for-css-button-hover-animations/">Check it out</a><br>
</p></article>
</div>
<p>The post <a rel="nofollow" href="https://tympanus.net/codrops/collective/collective-649/">Collective #649</a> appeared first on <a rel="nofollow" href="https://tympanus.net/codrops">Codrops</a>.</p>
<img src="http://feeds.feedburner.com/~r/tympanus/~4/H68nr62k0g4" height="1" width="1" alt="">]]></description>
      <pubDate>Thu, 18 Feb 2021 13:35:56 +0000</pubDate>
      <link>https://tympanus.net/codrops/collective/collective-649/</link>
      <dc:creator>Codrops</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/2907836259</guid>
    </item>
    <item>
      <title><![CDATA[The web didn’t change; you did]]></title>
      <description><![CDATA[
<p>I love this piece from Remy Sharp where he argues that the web didn’t get more complicated over the last 20 years, despite what we might think:</p>



<blockquote class="wp-block-quote"><p>Web development did not change. Web development grew. There are more options now, not different options.</p><p>Browsers have become&nbsp;<em>more</em>&nbsp;capable and still work with web pages built over&nbsp;<a href="http://info.cern.ch/">20 years ago</a>.</p><p>[…] The web really didn’t change. It really didn’t become complex. The web development process is not one single path. There is simply more choice and more options.</p></blockquote>



<p>Remy argues that the web is only really as complex as we make it and, when we choose an enormous framework for a small problem, it’s us that’s choosing the complexity. We really don’t have to build a website with the latest and greatest tools if we’re familiar with the old stuff and there’s no shame in using <a href="https://css-tricks.com/is-css-float-deprecated/">float over flexbox</a>, if that works for you.</p>



<hr class="wp-block-separator">



<p>There’s a lot of ego in web design, and there’s a lot of folks out there bashing others for using the “incorrect” tools. But here’s the secret when it comes to making website: there are no perfect tools, and there’s no perfect way to build a website. That sucks, but it’s also <em>exciting</em> because we get to figure it all out; nothing is set in stone.</p>



<p>For example: I use Sass all the time for side projects and I know for a fact that a lotta folks would scoff at that. There’s <a href="https://emotion.sh/docs/introduction">emotion</a> and <a href="https://tachyons.io/">Tachyons</a>! There’s plain CSS! There’s <a href="https://postcss.org/">PostCSS</a>! But hey: I like Sass for a few things. I like the power it gives me and I like that I’m familiar with it. That doesn’t stop me from reaching for emotion in my day job or experimenting with something new when it comes along. </p>



<p>But old tech isn’t bad just because it’s old. And new tech isn’t good just because it’s new. You can see that sentiment playing out in the comment thread of Chris’ <a href="https://css-tricks.com/front-end-dissatisfaction-and-backing-off/#comments">“Front-End Dissatisfaction (and Backing Off)”</a> post.</p>
<p><a href="https://remysharp.com/2021/02/11/the-web-didnt-change-you-did" title="Direct link to featured article">Direct Link to Article</a> — <a href="https://css-tricks.com/the-web-didnt-change-you-did/">Permalink</a></p><hr>
<p>The post <a rel="nofollow" href="https://css-tricks.com/the-web-didnt-change-you-did/">The web didn’t change; you did</a> appeared first on <a rel="nofollow" href="https://css-tricks.com">CSS-Tricks</a>.</p>
<p>You can support CSS-Tricks by being an <a href="https://css-tricks.com/product/mvp-supporter/">MVP Supporter</a>.</p>
]]></description>
      <pubDate>Tue, 16 Feb 2021 16:01:06 +0000</pubDate>
      <link>https://remysharp.com/2021/02/11/the-web-didnt-change-you-did</link>
      <dc:creator>CSS-Tricks</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/2903446728</guid>
    </item>
    <item>
      <title><![CDATA[Front-End Dissatisfaction (and Backing Off)]]></title>
      <description><![CDATA[
<p>Asko Nõmm <a href="https://www.askonomm.com/blog/i-dont-want-to-do-frontend-anymore">reached a breaking point</a> with front end:</p>



<blockquote class="wp-block-quote is-style-default"><p>I want to have a personal life and not have to spend my nights reading up on some new flavour of *.js in fear that if I don’t I would soon be made irrelevant. I don’t want to learn nor use a million different tools. I don’t want to know a bit about everything and a lot about nothing.</p><p>Thus, I don’t want to do front-end development anymore. The joy is gone.</p></blockquote>



<span id="more-334411"></span>



<p>They literally spun up this blog to say that, but money-where-mouth-is: </p>



<blockquote class="wp-block-quote is-style-default"><p>I’ve given in my resignation at my current place of employment and will be seeking an exclusively back-end role for my next adventure</p></blockquote>



<p>I have some doubts that back end is 100% better in regards to technology churn, but fair enough, I don’t hear about it as much. Front-end dissatisfaction is awfully high. I don’t go <em>a day</em> without hearing someone complain broadly about the state of front end.</p>



<p>Remy Sharp addressed this in <a href="https://remysharp.com/2021/02/11/the-web-didnt-change-you-did"><em>The web didn’t change; you did</em></a>:</p>



<blockquote class="wp-block-quote is-style-default"><p>If you didn’t gather off the bat from the title, the problem with developing front end projects isn’t that it’s harder or more complicated, it’s that&nbsp;<em>you</em>&nbsp;made it harder and more complicated.</p></blockquote>



<p>Minor pushback there: a lot of people don’t get any choice in the technologies they are tasked with. </p>



<p>Remy’s point is that literally any simplicity that you hold nostalgia for on the web is <em>still there</em> and there is nothing stopping you from using it. Other than, ya know, if your client or boss prevents that. </p>



<p>Mark (last name appears intentionally not-on-the-internet) <a href="https://atthis.link/blog/2021/html.html">says</a> that just HTML is a perfectly fine building tool:</p>



<blockquote class="wp-block-quote is-style-default"><p>Despite increasing leniency on frameworks being the&nbsp;<em>only</em>&nbsp;way to build for the web, hand-written HTML never disappeared and I feel is still a perfectly suitable way to build a personal website.</p></blockquote>



<p>Remember Steren Giannini&nbsp;said recently <a href="https://blog.steren.fr/2020/my-stack-will-outlive-yours/">they build websites</a> with HTML alone and zero build process. And Terence Eden praised HTML for its <a href="https://shkspr.mobi/blog/2021/01/the-unreasonable-effectiveness-of-simple-html/">unreasonable effectiveness</a>:</p>



<blockquote class="wp-block-quote is-style-default"><p>Are you developing public services? Or a system that people might access when they’re in desperate need of help? Plain HTML works. A small bit of simple CSS will make look decent. JavaScript is probably unnecessary – but can be used to progressively enhance stuff. Add alt text to images so people paying per MB can understand what the images are for (and, you know, accessibility).</p></blockquote>



<p>It’s nice to think that you can build an important website, avoid any sort of wild complexity, and have it do its job without any harm, with HTML. </p>



<p>Personally, I don’t harbor any ill will toward the front-end ecosystem at the moment. I’m aware that I can step backward from complexity if I have to, and that I can lean into complexity when it buys me things (speed, features, DX, etc) and know what it costs me (and users) and why. </p>
<hr>
<p>The post <a rel="nofollow" href="https://css-tricks.com/front-end-dissatisfaction-and-backing-off/">Front-End Dissatisfaction (and Backing Off)</a> appeared first on <a rel="nofollow" href="https://css-tricks.com">CSS-Tricks</a>.</p>
<p>You can support CSS-Tricks by being an <a href="https://css-tricks.com/product/mvp-supporter/">MVP Supporter</a>.</p>
]]></description>
      <pubDate>Sat, 13 Feb 2021 18:21:18 +0000</pubDate>
      <link>https://css-tricks.com/front-end-dissatisfaction-and-backing-off/</link>
      <dc:creator>CSS-Tricks</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/2898482207</guid>
    </item>
    <item>
      <title><![CDATA[Polyfills - What are they ?]]></title>
      <description><![CDATA[<p>The web is full of weird terminology, that can be especially daunting for newcomers. The idea behind this blog post and ( hopefully 🤞 ) upcoming blog posts is to demistify "fancy" terms. In this article we will discuss polyfills.<br>
<br><br>
<br></p>
<h1>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#in-plain-english" class="anchor">
  </a>
  In plain english
</h1>

<p><br><br>
Polyfills are <strong>pieces of code</strong> that aim to make new features available on browsers ( or JS environments in general ) that don't or won't support said features. Two things to keep in mind:</p>

<ul>
<li>Not all features are polyfillable ( new syntactic features cannot be polyfilled e.g. <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax">spread syntax(...)</a>.</li>
<li>A polyfill only runs, when the feature is missing. Otherwise it should use the native implementation.</li>
</ul>


<h1>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#a-brief-history" class="anchor">
  </a>
  A brief history...
</h1>

<p><br><br>
The word polyfill was initially introduced [ coined and popularized] by <a href="https://remysharp.com/2010/10/08/what-is-a-polyfill/">Remy Sharp</a> in 2009. The word itself originates from the name Polyfilla, a british product used to fill cracks and holes in walls.</p>

<blockquote>
<p>Polyfilla is a UK product known as Spackling Paste in the US. With that in mind: think of the browsers as a wall with cracks in it. These polyfills help smooth out the cracks and give us a nice smooth wall of browsers to work with.</p>

<p>-- <em>Remy Sharp</em></p>
</blockquote>

<p>Enough history. I said brief, didn't I !<br>
<br><br>
<br></p>
<h1>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#polyfills-vs-transpilers" class="anchor">
  </a>
  Polyfills vs Transpilers
</h1>

<p><br><br>
Before digging any deeper, let's try to make the difference between the terms <strong><em>Polyfill</em></strong> and  <strong><em>Transpiler</em></strong> clear.</p>

<p>Remember how I said there is no way to polyfill new js syntax. Well a transpiler ( transformer + compiler ) does just that. </p>

<p>It transforms new syntax into equivalent old syntax that is supported by old browsers. So unlike a polyfill, the code you write is transpiled into alternate code, that would eventually run in the browser.</p>

<p>Keep in mind that a transpiler like babel will use, depending on your target browsers, underneath the hood polyfills to support new features. </p>

<p>If you are still unsure about the difference, here is an <a href="https://stackoverflow.com/a/48149493">SO</a> response that goes into a bit more detail.</p>
<h1>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#lets-write-our-own-polyfill" class="anchor">
  </a>
  Let's write our own polyfill
</h1>

<p>All right, let's dig in. As I mentioned before a polyfill is just a piece of code, that aims to make some functionality available across all browsers. Usually a good polyfill will check if the target feature already is supported in the browser. If so do nothing da! Otherwise use the available APIs to mimic the behavior of this new feature.</p>
<h2>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#js-raw-elementclosestselectorlist-endraw-" class="anchor">
  </a>
  JS : <code>Element.closest(selectorList)</code>
</h2>

<p>According to <a href="">MDN</a>: </p>

<blockquote>
<p>The <strong><code>closest()</code></strong> method traverses the <code>Element</code> and its parents (heading toward the document root) until it finds a node that matches the provided selector string. Will return itself or the matching ancestor. If no such element exists, it returns <code>null</code>.</p>
</blockquote>

<p>So basically given an HTML Element the <strong><code>closest()</code></strong> method returns the closest element in the elements tree that matches at least one of the selectors in the selectorList.</p>

<p>Assume we have the following HTML DOM:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight html"><code>...
<span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"level-1"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"level-2"</span><span class="nt">&gt;</span>
        <span class="nt">&lt;p</span> <span class="na">class=</span><span class="s">"level-3"</span><span class="nt">&gt;</span> Polyfills are awesome 🎉 <span class="nt">&lt;/p&gt;</span>
    <span class="nt">&lt;/div&gt;</span>
<span class="nt">&lt;/div&gt;</span>
...
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>





<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">const</span> <span class="nx">paragraph</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="dl">'</span><span class="s1">p</span><span class="dl">'</span><span class="p">);</span>
<span class="nx">paragraph</span><span class="p">.</span><span class="nx">closest</span><span class="p">(</span><span class="dl">'</span><span class="s1">.level-1</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// Returns &lt;div class="level-1"&gt;...&lt;/div&gt;</span>
<span class="nx">paragraph</span><span class="p">.</span><span class="nx">closest</span><span class="p">(</span><span class="dl">'</span><span class="s1">.level-1, .level-2</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// Returns &lt;div class="level-2"&gt;...&lt;/div&gt;</span>
<span class="nx">paragraph</span><span class="p">.</span><span class="nx">closest</span><span class="p">(</span><span class="dl">'</span><span class="s1">.level-3</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// Returns paragrah itself</span>
<span class="nx">paragraph</span><span class="p">.</span><span class="nx">closest</span><span class="p">(</span><span class="dl">'</span><span class="s1">.level-bla</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// Returns null</span>
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>



<p>All right ! Now that we know how this function works , we can start implementing.<br>
<br><br>
👋 <strong>Beginner's Tip</strong>: This is a good time to open <a href="https://codepen.io/pen/">codepen</a> and start experimenting.<br>
<br><br>
Let's think about the problem for a second (or more). We need:</p>

<ol>
<li>A way to traverse the DOM upwards.</li>
<li>To check if element matches the selectorList.</li>
</ol>

<p>Now, let's talk solutions:</p>

<ol>
<li>A way to traverse the DOM upwards *=&gt; use a while loop and the <a href=""><code>.parentElement</code></a> prop.</li>
<li>To check if element matches the selectorList <em>=&gt; use the <a href=""><code>.matches()</code></a> method</em>.
</li>
</ol>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">const</span> <span class="nx">closest</span> <span class="o">=</span> <span class="p">(</span><span class="nx">element</span><span class="p">,</span> <span class="nx">selectorList</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="k">while</span><span class="p">(</span><span class="nx">element</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="nx">element</span><span class="p">.</span><span class="nx">matches</span><span class="p">(</span><span class="nx">selectorList</span><span class="p">))</span> <span class="p">{</span>
        <span class="nx">element</span> <span class="o">=</span> <span class="nx">element</span><span class="p">.</span><span class="nx">parentElement</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="nx">element</span><span class="p">;</span>
<span class="p">};</span>
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>


<p>So in the snippet above, we are defining a function that takes two arguments: <code>element</code> and <code>selectorList</code>. Then we are looping until one of two things happen: </p>

<ul>
<li>
<code>element</code> is null, and therefore we have reached the root element.</li>
<li>
<code>element.matches(selectorList)</code> returns true, and therefore we found the closest element that matches our <code>selectorList</code>.</li>
</ul>

<p>We can check that this beahves the same way on our previous test set.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="p">...</span>
<span class="kd">const</span> <span class="nx">paragraph</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="dl">'</span><span class="s1">p</span><span class="dl">'</span><span class="p">);</span>
<span class="nx">closest</span><span class="p">(</span><span class="nx">paragraph</span><span class="p">,</span> <span class="dl">'</span><span class="s1">.level-1</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// Returns &lt;div class="level-1"&gt;...&lt;/div&gt;</span>
<span class="nx">closest</span><span class="p">(</span><span class="nx">paragraph</span><span class="p">,</span><span class="dl">'</span><span class="s1">.level-1, .level-2</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// Returns &lt;div class="level-2"&gt;...&lt;/div&gt;</span>
<span class="nx">closest</span><span class="p">(</span><span class="nx">paragraph</span><span class="p">,</span><span class="dl">'</span><span class="s1">.level-3</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// Returns paragrah itself</span>
<span class="nx">closest</span><span class="p">(</span><span class="nx">paragraph</span><span class="p">,</span><span class="dl">'</span><span class="s1">.level-bla</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// Returns null</span>
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>



<p>The last step is to add the function to the Element's <a href="https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object_prototypes"><code>prototype</code></a>, so that it's available to all instances of the <code>Element</code> object:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="nx">Element</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">closest</span> <span class="o">=</span> <span class="p">(</span><span class="nx">selectorList</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="kd">let</span> <span class="nx">element</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
    <span class="k">while</span><span class="p">(</span><span class="nx">element</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="nx">element</span><span class="p">.</span><span class="nx">matches</span><span class="p">(</span><span class="nx">selectorList</span><span class="p">))</span> <span class="p">{</span>
        <span class="nx">element</span> <span class="o">=</span> <span class="nx">element</span><span class="p">.</span><span class="nx">parentElement</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="nx">element</span><span class="p">;</span>
<span class="p">};</span>
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>



<p>One last detail, is that we would rather prefer if our polyfill somehow adds this function to the prototype only if the browser doesn't support it. In other words, we would rather use the browser's native implementation if it's available. A simple if will do !<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nx">Element</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">closest</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">Element</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">closest</span> <span class="o">=</span> <span class="p">(</span><span class="nx">selectorList</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
        <span class="kd">let</span> <span class="nx">element</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
        <span class="k">while</span><span class="p">(</span><span class="nx">element</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="nx">element</span><span class="p">.</span><span class="nx">matches</span><span class="p">(</span><span class="nx">selectorList</span><span class="p">))</span> <span class="p">{</span>
            <span class="nx">element</span> <span class="o">=</span> <span class="nx">element</span><span class="p">.</span><span class="nx">parentElement</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="nx">element</span><span class="p">;</span>
    <span class="p">};</span>
<span class="p">}</span>
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>



<p><br><br>
✨ <strong>NOTE:</strong> This is by no means a production-ready polyfill. For simplicity I assumed a lot of things. A production-ready polyfill would also account for the fact that <code>.matches()</code> may not exist and also check different browser vendor prefixes. A more complete version can be found <a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill">here</a><br>
<br></p>
<h2>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#css-raw-blank-endraw-" class="anchor">
  </a>
  CSS: <code>:blank</code>
</h2>

<p>As of the time of writing the <code>:blank</code> pseudo-class has very <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:blank">low</a> support . In this section we will try to write a rough polyfill (not complete by any means) just to demonstrate the idea of polyfilling CSS functionality.</p>

<p>Again I will quote the MDN definition ( as one normally does ! ) : </p>

<blockquote>
<p>The :blank CSS pseudo-class selects empty user input elements (e.g. <code>&lt;input&gt;</code> or <code>&lt;textarea&gt;</code>).</p>
</blockquote>

<p>So using the <code>:blank</code> pseudo-class will look something like this<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight css"><code><span class="nt">input</span><span class="nd">:blank</span><span class="p">{</span>
  <span class="nl">background</span><span class="p">:</span> <span class="no">red</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">textarea</span><span class="nd">:blank</span><span class="p">{</span>
  <span class="nl">color</span><span class="p">:</span> <span class="no">green</span><span class="p">;</span>
<span class="p">}</span>

</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>



<p><br><br>
✨ <strong>NOTE1:</strong> Since this is a syntactic proprety of CSS using <code>textarea:blank</code> will be ruled out as an invalid selector by the CSS Parser. So instead we will use <code>textarea[blank]</code>. Just keep in mind that in the rest of this post I will use <code>:blank</code> and <code>[blank]</code> interchangeably.<br>
<br><br>
✨ <strong>NOTE2:</strong> This is actually what <a href="https://github.com/csstools/css-blank-pseudo/blob/HEAD/README-POSTCSS.md">PostCSS</a> does underneath the hood. It replaces all occurences of <code>:blank</code> with <code>[blank]</code>.</p>

<p><br><br>
Let's think about how we can achieve this. We need :<br>
<strong>1.</strong> Some way to access our stylesheet(s).<br>
<strong>2.</strong> Detect selectors of the form <code>selector[blank]</code>.<br>
<strong>3.</strong> Bind our the blank pseudo-class to the selected elements.<br>
<strong>4.</strong> Update styles when value of input is changed.</p>

<p><br><br>
👋 <strong>Beginner's Tip</strong>: This is a good time to open <a href="https://codepen.io/pen/">codepen</a> and start experimenting. <br>
</p>

<p>These are our requirements. Let's talk about how we can tackle each and everyone:</p>

<p><strong>1.</strong> Some way to access our stylesheet <strong>=&gt; <a href="https://developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model"><code>CCSOM</code></a></strong><br>
<strong>2.</strong> Detect <code>:blank</code> function <strong>=&gt; use a regex</strong><br>
<strong>3.</strong> Bind our the blank pseudo-class to the selected elements <strong>=&gt; Add an attribute to the selected inputs</strong><br>
<strong>4.</strong> Update the value of the state of the input when the the value is changed via JS <strong>=&gt; listen for the <a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/input_event"><code>input event</code></a></strong></p>
<h3>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#1-access-our-stylesheets" class="anchor">
  </a>
  1. Access our stylesheets
</h3>

<p>First we need to access our CSS Stylesheets. We do so by using CCSOM, specifically by accessing the <code>styleSheets</code> prop on the document.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">for</span><span class="p">(</span><span class="kd">let</span>  <span class="nx">styleSheet</span>  <span class="k">of</span>  <span class="nb">document</span><span class="p">.</span><span class="nx">styleSheets</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">for</span><span class="p">(</span><span class="kd">let</span>  <span class="nx">cssRule</span>  <span class="k">of</span>  <span class="nx">styleSheet</span><span class="p">.</span><span class="nx">cssRules</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">cssRule</span><span class="p">.</span><span class="nx">cssText</span><span class="p">);</span> <span class="c1">// Prints each css rule in our stylesheets</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>



<p>More on <a href="https://developer.mozilla.org/en-US/docs/Web/API/CSSRule"><code>CSSRule</code></a></p>

<h3>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#2-locate-selectors-with-raw-blank-endraw-pseudoclass" class="anchor">
  </a>
  2. Locate selectors with <code>:blank</code> pseudo-class
</h3>

<p>Now that we have access to all the CSS rules we can check if any of them have the <code>:blank</code> pseudo-class.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">const</span> <span class="nx">blankRegex</span> <span class="o">=</span> <span class="sr">/</span><span class="se">(</span><span class="sr">.*</span><span class="se">)\[</span><span class="sr">blank</span><span class="se">\]</span><span class="sr">/</span><span class="p">;</span>
<span class="k">for</span><span class="p">(</span><span class="kd">let</span>  <span class="nx">styleSheet</span>  <span class="k">of</span>  <span class="nb">document</span><span class="p">.</span><span class="nx">styleSheets</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">for</span><span class="p">(</span><span class="kd">let</span>  <span class="nx">cssRule</span>  <span class="k">of</span>  <span class="nx">styleSheet</span><span class="p">.</span><span class="nx">cssRules</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">match</span> <span class="o">=</span> <span class="nx">cssRule</span><span class="p">.</span><span class="nx">selectorText</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">blankRegex</span><span class="p">);</span>
    <span class="k">if</span><span class="p">(</span><span class="nx">match</span><span class="p">)</span> <span class="p">{</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">match</span><span class="p">[</span><span class="mi">1</span><span class="p">]);}</span> <span class="c1">// Prints matched selector name i.e input, textarea without the [blank]</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>



<p><br><br>
🛑 Refactor detoure<br>
Let's try to refactor our code so that it doesn't get messy.<br>
Let's start by defining a function that's responsible for returning an array of selectors.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">const</span> <span class="nx">extractBlankSelectors</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
      <span class="kd">const</span> <span class="nx">blankRegex</span> <span class="o">=</span> <span class="sr">/</span><span class="se">(</span><span class="sr">.*</span><span class="se">)\[</span><span class="sr">blank</span><span class="se">\]</span><span class="sr">/</span><span class="p">;</span>
      <span class="c1">// Returns an array of of all CSSRules</span>
      <span class="kd">const</span> <span class="nx">cssRules</span> <span class="o">=</span> 
        <span class="p">[...</span><span class="nb">document</span><span class="p">.</span><span class="nx">styleSheets</span><span class="p">]</span>
          <span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">styleSheet</span> <span class="o">=&gt;</span> <span class="p">[...</span><span class="nx">styleSheet</span><span class="p">.</span><span class="nx">cssRules</span><span class="p">])</span>
          <span class="p">.</span><span class="nx">flat</span><span class="p">();</span>

      <span class="c1">// Returns an array with our desired selectors</span>
      <span class="kd">const</span> <span class="nx">blankSelectors</span> <span class="o">=</span> 
        <span class="nx">cssRules</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">cssRule</span> <span class="o">=&gt;</span> <span class="nx">cssRule</span><span class="p">.</span><span class="nx">selectorText</span><span class="p">)</span>
                <span class="p">.</span><span class="nx">reduce</span><span class="p">((</span><span class="nx">acc</span><span class="p">,</span> <span class="nx">curr</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">acc</span><span class="p">.</span><span class="nx">concat</span><span class="p">(</span><span class="nx">curr</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="dl">"</span><span class="s2">,</span><span class="dl">"</span><span class="p">)),</span> <span class="p">[])</span>
                <span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">selectorText</span> <span class="o">=&gt;</span> <span class="nx">selectorText</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">blankRegex</span><span class="p">)</span> <span class="p">?</span> <span class="nx">selectorText</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">blankRegex</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> <span class="p">:</span> <span class="kc">null</span><span class="p">)</span>
                <span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="nx">selector</span> <span class="o">=&gt;</span> <span class="o">!!</span><span class="nx">selector</span><span class="p">);</span>

      <span class="k">return</span> <span class="nx">blankSelectors</span><span class="p">;</span>
    <span class="p">};</span>
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>



<p>Here I used a functional approach instead of using for loops as before, but you can achieve the same with the nested for loops. If this looks weird or confusing to you here a nice <a href="https://opensource.com/article/17/6/functional-javascript">article</a> talking about this. Also feel free to ask in the comments section.</p>

<p>🛑Refactor detour end<br>
<br></p>
<h3>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#34-bind-our-the-blank-pseudoclass-to-the-selected-elements-and-watch-for-change-" class="anchor">
  </a>
  3,4. Bind our the blank pseudo-class to the selected elements and watch for change !
</h3>

<p>Now that we have access to the the desired selectors via <code>extractBlankSelectors</code> we can easily select and add attributes to our target elements.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="p">....</span>
    <span class="kd">const</span> <span class="nx">bindBlankElements</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
      <span class="c1">// Select all elements from DOM that match our SelectorList</span>
      <span class="kd">const</span> <span class="nx">elements</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelectorAll</span><span class="p">(</span><span class="nx">extractBlankSelectors</span><span class="p">().</span><span class="nx">join</span><span class="p">(</span><span class="dl">'</span><span class="s1">,</span><span class="dl">'</span><span class="p">));</span>
      <span class="nx">elements</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="nx">element</span> <span class="o">=&gt;</span> <span class="p">{</span>
        <span class="c1">// Add blank attribute if value is empty</span>
        <span class="k">if</span><span class="p">(</span><span class="nx">element</span><span class="p">.</span><span class="nx">value</span> <span class="o">===</span> <span class="dl">''</span><span class="p">)</span> <span class="p">{</span>
          <span class="nx">element</span><span class="p">.</span><span class="nx">setAttribute</span><span class="p">(</span><span class="dl">'</span><span class="s1">blank</span><span class="dl">'</span><span class="p">,</span> <span class="dl">''</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="c1">// Attach an input event listener</span>
        <span class="nx">element</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">input</span><span class="dl">'</span><span class="p">,</span> <span class="p">(</span><span class="nx">ev</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
          <span class="nx">element</span><span class="p">.</span><span class="nx">value</span> <span class="o">===</span> <span class="dl">''</span> <span class="p">?</span> <span class="nx">element</span><span class="p">.</span><span class="nx">setAttribute</span><span class="p">(</span><span class="dl">'</span><span class="s1">blank</span><span class="dl">'</span><span class="p">,</span> <span class="dl">''</span><span class="p">)</span> <span class="p">:</span> <span class="nx">element</span><span class="p">.</span><span class="nx">removeAttribute</span><span class="p">(</span><span class="dl">'</span><span class="s1">blank</span><span class="dl">'</span><span class="p">,</span> <span class="dl">''</span><span class="p">);</span>
        <span class="p">});</span>
      <span class="p">});</span>
    <span class="p">};</span>
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>



<p>Initially we select all the elements returned from <code>extractBlankSelectors</code>. Then for each one of them:</p>

<ul>
<li>Add blank attribute if the value is empty.</li>
<li>Attach an input event listener.
On eah input the callback checks wether the input value is empty or not and applies the <code>blank</code> attribute accordingly.</li>
</ul>

<p>Here is a codepen to try it out live: </p>

<p><iframe height="600" src="https://codepen.io/issammani/embed/yLVVWvK?height=600&amp;default-tab=result&amp;embed-version=2">
</iframe>
</p>

<p>Et voilà ! We are all done ! </p>

<h2>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#conclusion" class="anchor">
  </a>
  Conclusion
</h2>

<p>As you can see polyfills are a super important concept, that helped the web move forward and developers use new features without the fear of breaking compatibility. If you enjoyed reading this like, share and/or leave a comment. Feedback is always welcome !</p>

<p>Live long and prosper 🖖</p>

<h2>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#useful-links" class="anchor">
  </a>
  Useful links
</h2>

<ul>
<li><a href="https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills">A List of cross browser polyfills</a></li>
<li><a href="https://remysharp.com/2010/10/08/what-is-a-polyfill/">Remy Sharp's original post about polyfills</a></li>
<li><a href="">A third link</a></li>
</ul>

]]></description>
      <pubDate>Fri, 12 Feb 2021 13:35:10 +0000</pubDate>
      <link>https://dev.to/issammani/polyfills-what-are-they-2ha5</link>
      <dc:creator>DEV Community</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/2896354209</guid>
    </item>
    <item>
      <title><![CDATA[Polyfills - What are they ?]]></title>
      <description><![CDATA[<p>The web is full of weird terminology, that can be especially daunting for newcomers. The idea behind this blog post and ( hopefully 🤞 ) upcoming blog posts is to demistify "fancy" terms. In this article we will discuss polyfills.<br>
<br><br>
<br></p>
<h1>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#in-plain-english" class="anchor">
  </a>
  In plain english
</h1>

<p><br><br>
Polyfills are <strong>pieces of code</strong> that aim to make new features available on browsers ( or JS environments in general ) that don't or won't support said features. Two things to keep in mind:</p>

<ul>
<li>Not all features are polyfillable ( new syntactic features cannot be polyfilled e.g. <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax">spread syntax(...)</a>.</li>
<li>A polyfill only runs, when the feature is missing. Otherwise it should use the native implementation.</li>
</ul>


<h1>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#a-brief-history" class="anchor">
  </a>
  A brief history...
</h1>

<p><br><br>
The word polyfill was initially introduced [ coined and popularized] by <a href="https://remysharp.com/2010/10/08/what-is-a-polyfill/">Remy Sharp</a> in 2009. The word itself originates from the name Polyfilla, a british product used to fill cracks and holes in walls.</p>

<blockquote>
<p>Polyfilla is a UK product known as Spackling Paste in the US. With that in mind: think of the browsers as a wall with cracks in it. These polyfills help smooth out the cracks and give us a nice smooth wall of browsers to work with.</p>

<p>-- <em>Remy Sharp</em></p>
</blockquote>

<p>Enough history. I said brief, didn't I !<br>
<br><br>
<br></p>
<h1>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#polyfills-vs-transpilers" class="anchor">
  </a>
  Polyfills vs Transpilers
</h1>

<p><br><br>
Before digging any deeper, let's try to make the difference between the terms <strong><em>Polyfill</em></strong> and  <strong><em>Transpiler</em></strong> clear.</p>

<p>Remember how I said there is no way to polyfill new js syntax. Well a transpiler ( transformer + compiler ) does just that. </p>

<p>It transforms new syntax into equivalent old syntax that is supported by old browsers. So unlike a polyfill, the code you write is transpiled into alternate code, that would eventually run in the browser.</p>

<p>Keep in mind that a transpiler like babel will use, depending on your target browsers, underneath the hood polyfills to support new features. </p>

<p>If you are still unsure about the difference, here is an <a href="https://stackoverflow.com/a/48149493">SO</a> response that goes into a bit more detail.</p>
<h1>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#lets-write-our-own-polyfill" class="anchor">
  </a>
  Let's write our own polyfill
</h1>

<p>All right, let's dig in. As I mentioned before a polyfill is just a piece of code, that aims to make some functionality available across all browsers. Usually a good polyfill will check if the target feature already is supported in the browser. If so do nothing da! Otherwise use the available APIs to mimic the behavior of this new feature.</p>
<h2>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#js-raw-elementclosestselectorlist-endraw-" class="anchor">
  </a>
  JS : <code>Element.closest(selectorList)</code>
</h2>

<p>According to <a href="">MDN</a>: </p>

<blockquote>
<p>The <strong><code>closest()</code></strong> method traverses the <code>Element</code> and its parents (heading toward the document root) until it finds a node that matches the provided selector string. Will return itself or the matching ancestor. If no such element exists, it returns <code>null</code>.</p>
</blockquote>

<p>So basically given an HTML Element the <strong><code>closest()</code></strong> method returns the closest element in the elements tree that matches at least one of the selectors in the selectorList.</p>

<p>Assume we have the following HTML DOM:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight html"><code>...
<span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"level-1"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"level-2"</span><span class="nt">&gt;</span>
        <span class="nt">&lt;p</span> <span class="na">class=</span><span class="s">"level-3"</span><span class="nt">&gt;</span> Polyfills are awesome 🎉 <span class="nt">&lt;/p&gt;</span>
    <span class="nt">&lt;/div&gt;</span>
<span class="nt">&lt;/div&gt;</span>
...
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>





<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">const</span> <span class="nx">paragraph</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="dl">'</span><span class="s1">p</span><span class="dl">'</span><span class="p">);</span>
<span class="nx">paragraph</span><span class="p">.</span><span class="nx">closest</span><span class="p">(</span><span class="dl">'</span><span class="s1">.level-1</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// Returns &lt;div class="level-1"&gt;...&lt;/div&gt;</span>
<span class="nx">paragraph</span><span class="p">.</span><span class="nx">closest</span><span class="p">(</span><span class="dl">'</span><span class="s1">.level-1, .level-2</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// Returns &lt;div class="level-2"&gt;...&lt;/div&gt;</span>
<span class="nx">paragraph</span><span class="p">.</span><span class="nx">closest</span><span class="p">(</span><span class="dl">'</span><span class="s1">.level-3</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// Returns paragrah itself</span>
<span class="nx">paragraph</span><span class="p">.</span><span class="nx">closest</span><span class="p">(</span><span class="dl">'</span><span class="s1">.level-bla</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// Returns null</span>
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>



<p>All right ! Now that we know how this function works , we can start implementing.<br>
<br><br>
👋 <strong>Beginner's Tip</strong>: This is a good time to open <a href="https://codepen.io/pen/">codepen</a> and start experimenting.<br>
<br><br>
Let's think about the problem for a second (or more). We need:</p>

<ol>
<li>A way to traverse the DOM upwards.</li>
<li>To check if element matches the selectorList.</li>
</ol>

<p>Now, let's talk solutions:</p>

<ol>
<li>A way to traverse the DOM upwards *=&gt; use a while loop and the <a href=""><code>.parentElement</code></a> prop.</li>
<li>To check if element matches the selectorList <em>=&gt; use the <a href=""><code>.matches()</code></a> method</em>.
</li>
</ol>
<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">const</span> <span class="nx">closest</span> <span class="o">=</span> <span class="p">(</span><span class="nx">element</span><span class="p">,</span> <span class="nx">selectorList</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="k">while</span><span class="p">(</span><span class="nx">element</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="nx">element</span><span class="p">.</span><span class="nx">matches</span><span class="p">(</span><span class="nx">selectorList</span><span class="p">))</span> <span class="p">{</span>
        <span class="nx">element</span> <span class="o">=</span> <span class="nx">element</span><span class="p">.</span><span class="nx">parentElement</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="nx">element</span><span class="p">;</span>
<span class="p">};</span>
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>


<p>So in the snippet above, we are defining a function that takes two arguments: <code>element</code> and <code>selectorList</code>. Then we are looping until one of two things happen: </p>

<ul>
<li>
<code>element</code> is null, and therefore we have reached the root element.</li>
<li>
<code>element.matches(selectorList)</code> returns true, and therefore we found the closest element that matches our <code>selectorList</code>.</li>
</ul>

<p>We can check that this beahves the same way on our previous test set.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="p">...</span>
<span class="kd">const</span> <span class="nx">paragraph</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="dl">'</span><span class="s1">p</span><span class="dl">'</span><span class="p">);</span>
<span class="nx">closest</span><span class="p">(</span><span class="nx">paragraph</span><span class="p">,</span> <span class="dl">'</span><span class="s1">.level-1</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// Returns &lt;div class="level-1"&gt;...&lt;/div&gt;</span>
<span class="nx">closest</span><span class="p">(</span><span class="nx">paragraph</span><span class="p">,</span><span class="dl">'</span><span class="s1">.level-1, .level-2</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// Returns &lt;div class="level-2"&gt;...&lt;/div&gt;</span>
<span class="nx">closest</span><span class="p">(</span><span class="nx">paragraph</span><span class="p">,</span><span class="dl">'</span><span class="s1">.level-3</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// Returns paragrah itself</span>
<span class="nx">closest</span><span class="p">(</span><span class="nx">paragraph</span><span class="p">,</span><span class="dl">'</span><span class="s1">.level-bla</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// Returns null</span>
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>



<p>The last step is to add the function to the Element's <a href="https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object_prototypes"><code>prototype</code></a>, so that it's available to all instances of the <code>Element</code> object:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="nx">Element</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">closest</span> <span class="o">=</span> <span class="p">(</span><span class="nx">selectorList</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="kd">let</span> <span class="nx">element</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
    <span class="k">while</span><span class="p">(</span><span class="nx">element</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="nx">element</span><span class="p">.</span><span class="nx">matches</span><span class="p">(</span><span class="nx">selectorList</span><span class="p">))</span> <span class="p">{</span>
        <span class="nx">element</span> <span class="o">=</span> <span class="nx">element</span><span class="p">.</span><span class="nx">parentElement</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="nx">element</span><span class="p">;</span>
<span class="p">};</span>
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>



<p>One last detail, is that we would rather prefer if our polyfill somehow adds this function to the prototype only if the browser doesn't support it. In other words, we would rather use the browser's native implementation if it's available. A simple if will do !<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nx">Element</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">closest</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">Element</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">closest</span> <span class="o">=</span> <span class="p">(</span><span class="nx">selectorList</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
        <span class="kd">let</span> <span class="nx">element</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
        <span class="k">while</span><span class="p">(</span><span class="nx">element</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="nx">element</span><span class="p">.</span><span class="nx">matches</span><span class="p">(</span><span class="nx">selectorList</span><span class="p">))</span> <span class="p">{</span>
            <span class="nx">element</span> <span class="o">=</span> <span class="nx">element</span><span class="p">.</span><span class="nx">parentElement</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="nx">element</span><span class="p">;</span>
    <span class="p">};</span>
<span class="p">}</span>
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>



<p><br><br>
✨ <strong>NOTE:</strong> This is by no means a production-ready polyfill. For simplicity I assumed a lot of things. A production-ready polyfill would also account for the fact that <code>.matches()</code> may not exist and also check different browser vendor prefixes. A more complete version can be found <a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill">here</a><br>
<br></p>
<h2>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#css-raw-blank-endraw-" class="anchor">
  </a>
  CSS: <code>:blank</code>
</h2>

<p>As of the time of writing the <code>:blank</code> pseudo-class has very <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:blank">low</a> support . In this section we will try to write a rough polyfill (not complete by any means) just to demonstrate the idea of polyfilling CSS functionality.</p>

<p>Again I will quote the MDN definition ( as one normally does ! ) : </p>

<blockquote>
<p>The :blank CSS pseudo-class selects empty user input elements (e.g. <code>&lt;input&gt;</code> or <code>&lt;textarea&gt;</code>).</p>
</blockquote>

<p>So using the <code>:blank</code> pseudo-class will look something like this<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight css"><code><span class="nt">input</span><span class="nd">:blank</span><span class="p">{</span>
  <span class="nl">background</span><span class="p">:</span> <span class="no">red</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">textarea</span><span class="nd">:blank</span><span class="p">{</span>
  <span class="nl">color</span><span class="p">:</span> <span class="no">green</span><span class="p">;</span>
<span class="p">}</span>

</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>



<p><br><br>
✨ <strong>NOTE1:</strong> Since this is a syntactic proprety of CSS using <code>textarea:blank</code> will be ruled out as an invalid selector by the CSS Parser. So instead we will use <code>textarea[blank]</code>. Just keep in mind that in the rest of this post I will use <code>:blank</code> and <code>[blank]</code> interchangeably.<br>
<br><br>
✨ <strong>NOTE2:</strong> This is actually what <a href="https://github.com/csstools/css-blank-pseudo/blob/HEAD/README-POSTCSS.md">PostCSS</a> does underneath the hood. It replaces all occurences of <code>:blank</code> with <code>[blank]</code>.</p>

<p><br><br>
Let's think about how we can achieve this. We need :<br>
<strong>1.</strong> Some way to access our stylesheet(s).<br>
<strong>2.</strong> Detect selectors of the form <code>selector[blank]</code>.<br>
<strong>3.</strong> Bind our the blank pseudo-class to the selected elements.<br>
<strong>4.</strong> Update styles when value of input is changed.</p>

<p><br><br>
👋 <strong>Beginner's Tip</strong>: This is a good time to open <a href="https://codepen.io/pen/">codepen</a> and start experimenting. <br>
</p>

<p>These are our requirements. Let's talk about how we can tackle each and everyone:</p>

<p><strong>1.</strong> Some way to access our stylesheet <strong>=&gt; <a href="https://developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model"><code>CCSOM</code></a></strong><br>
<strong>2.</strong> Detect <code>:blank</code> function <strong>=&gt; use a regex</strong><br>
<strong>3.</strong> Bind our the blank pseudo-class to the selected elements <strong>=&gt; Add an attribute to the selected inputs</strong><br>
<strong>4.</strong> Update the value of the state of the input when the the value is changed via JS <strong>=&gt; listen for the <a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/input_event"><code>input event</code></a></strong></p>
<h3>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#1-access-our-stylesheets" class="anchor">
  </a>
  1. Access our stylesheets
</h3>

<p>First we need to access our CSS Stylesheets. We do so by using CCSOM, specifically by accessing the <code>styleSheets</code> prop on the document.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">for</span><span class="p">(</span><span class="kd">let</span>  <span class="nx">styleSheet</span>  <span class="k">of</span>  <span class="nb">document</span><span class="p">.</span><span class="nx">styleSheets</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">for</span><span class="p">(</span><span class="kd">let</span>  <span class="nx">cssRule</span>  <span class="k">of</span>  <span class="nx">styleSheet</span><span class="p">.</span><span class="nx">cssRules</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">cssRule</span><span class="p">.</span><span class="nx">cssText</span><span class="p">);</span> <span class="c1">// Prints each css rule in our stylesheets</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>



<p>More on <a href="https://developer.mozilla.org/en-US/docs/Web/API/CSSRule"><code>CSSRule</code></a></p>

<h3>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#2-locate-selectors-with-raw-blank-endraw-pseudoclass" class="anchor">
  </a>
  2. Locate selectors with <code>:blank</code> pseudo-class
</h3>

<p>Now that we have access to all the CSS rules we can check if any of them have the <code>:blank</code> pseudo-class.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">const</span> <span class="nx">blankRegex</span> <span class="o">=</span> <span class="sr">/</span><span class="se">(</span><span class="sr">.*</span><span class="se">)\[</span><span class="sr">blank</span><span class="se">\]</span><span class="sr">/</span><span class="p">;</span>
<span class="k">for</span><span class="p">(</span><span class="kd">let</span>  <span class="nx">styleSheet</span>  <span class="k">of</span>  <span class="nb">document</span><span class="p">.</span><span class="nx">styleSheets</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">for</span><span class="p">(</span><span class="kd">let</span>  <span class="nx">cssRule</span>  <span class="k">of</span>  <span class="nx">styleSheet</span><span class="p">.</span><span class="nx">cssRules</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">match</span> <span class="o">=</span> <span class="nx">cssRule</span><span class="p">.</span><span class="nx">selectorText</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">blankRegex</span><span class="p">);</span>
    <span class="k">if</span><span class="p">(</span><span class="nx">match</span><span class="p">)</span> <span class="p">{</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">match</span><span class="p">[</span><span class="mi">1</span><span class="p">]);}</span> <span class="c1">// Prints matched selector name i.e input, textarea without the [blank]</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>



<p><br><br>
🛑 Refactor detoure<br>
Let's try to refactor our code so that it doesn't get messy.<br>
Let's start by defining a function that's responsible for returning an array of selectors.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">const</span> <span class="nx">extractBlankSelectors</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
      <span class="kd">const</span> <span class="nx">blankRegex</span> <span class="o">=</span> <span class="sr">/</span><span class="se">(</span><span class="sr">.*</span><span class="se">)\[</span><span class="sr">blank</span><span class="se">\]</span><span class="sr">/</span><span class="p">;</span>
      <span class="c1">// Returns an array of of all CSSRules</span>
      <span class="kd">const</span> <span class="nx">cssRules</span> <span class="o">=</span> 
        <span class="p">[...</span><span class="nb">document</span><span class="p">.</span><span class="nx">styleSheets</span><span class="p">]</span>
          <span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">styleSheet</span> <span class="o">=&gt;</span> <span class="p">[...</span><span class="nx">styleSheet</span><span class="p">.</span><span class="nx">cssRules</span><span class="p">])</span>
          <span class="p">.</span><span class="nx">flat</span><span class="p">();</span>

      <span class="c1">// Returns an array with our desired selectors</span>
      <span class="kd">const</span> <span class="nx">blankSelectors</span> <span class="o">=</span> 
        <span class="nx">cssRules</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">cssRule</span> <span class="o">=&gt;</span> <span class="nx">cssRule</span><span class="p">.</span><span class="nx">selectorText</span><span class="p">)</span>
                <span class="p">.</span><span class="nx">reduce</span><span class="p">((</span><span class="nx">acc</span><span class="p">,</span> <span class="nx">curr</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">acc</span><span class="p">.</span><span class="nx">concat</span><span class="p">(</span><span class="nx">curr</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="dl">"</span><span class="s2">,</span><span class="dl">"</span><span class="p">)),</span> <span class="p">[])</span>
                <span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">selectorText</span> <span class="o">=&gt;</span> <span class="nx">selectorText</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">blankRegex</span><span class="p">)</span> <span class="p">?</span> <span class="nx">selectorText</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="nx">blankRegex</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> <span class="p">:</span> <span class="kc">null</span><span class="p">)</span>
                <span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="nx">selector</span> <span class="o">=&gt;</span> <span class="o">!!</span><span class="nx">selector</span><span class="p">);</span>

      <span class="k">return</span> <span class="nx">blankSelectors</span><span class="p">;</span>
    <span class="p">};</span>
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>



<p>Here I used a functional approach instead of using for loops as before, but you can achieve the same with the nested for loops. If this looks weird or confusing to you here a nice <a href="https://opensource.com/article/17/6/functional-javascript">article</a> talking about this. Also feel free to ask in the comments section.</p>

<p>🛑Refactor detour end<br>
<br></p>
<h3>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#34-bind-our-the-blank-pseudoclass-to-the-selected-elements-and-watch-for-change-" class="anchor">
  </a>
  3,4. Bind our the blank pseudo-class to the selected elements and watch for change !
</h3>

<p>Now that we have access to the the desired selectors via <code>extractBlankSelectors</code> we can easily select and add attributes to our target elements.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="p">....</span>
    <span class="kd">const</span> <span class="nx">bindBlankElements</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
      <span class="c1">// Select all elements from DOM that match our SelectorList</span>
      <span class="kd">const</span> <span class="nx">elements</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelectorAll</span><span class="p">(</span><span class="nx">extractBlankSelectors</span><span class="p">().</span><span class="nx">join</span><span class="p">(</span><span class="dl">'</span><span class="s1">,</span><span class="dl">'</span><span class="p">));</span>
      <span class="nx">elements</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="nx">element</span> <span class="o">=&gt;</span> <span class="p">{</span>
        <span class="c1">// Add blank attribute if value is empty</span>
        <span class="k">if</span><span class="p">(</span><span class="nx">element</span><span class="p">.</span><span class="nx">value</span> <span class="o">===</span> <span class="dl">''</span><span class="p">)</span> <span class="p">{</span>
          <span class="nx">element</span><span class="p">.</span><span class="nx">setAttribute</span><span class="p">(</span><span class="dl">'</span><span class="s1">blank</span><span class="dl">'</span><span class="p">,</span> <span class="dl">''</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="c1">// Attach an input event listener</span>
        <span class="nx">element</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">input</span><span class="dl">'</span><span class="p">,</span> <span class="p">(</span><span class="nx">ev</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
          <span class="nx">element</span><span class="p">.</span><span class="nx">value</span> <span class="o">===</span> <span class="dl">''</span> <span class="p">?</span> <span class="nx">element</span><span class="p">.</span><span class="nx">setAttribute</span><span class="p">(</span><span class="dl">'</span><span class="s1">blank</span><span class="dl">'</span><span class="p">,</span> <span class="dl">''</span><span class="p">)</span> <span class="p">:</span> <span class="nx">element</span><span class="p">.</span><span class="nx">removeAttribute</span><span class="p">(</span><span class="dl">'</span><span class="s1">blank</span><span class="dl">'</span><span class="p">,</span> <span class="dl">''</span><span class="p">);</span>
        <span class="p">});</span>
      <span class="p">});</span>
    <span class="p">};</span>
</code></pre>
<div class="highlight__panel js-actions-panel">
<div class="highlight__panel-action js-fullscreen-code-action">
    Enter fullscreen mode
    


    Exit fullscreen mode
    


</div>
</div>
</div>



<p>Initially we select all the elements returned from <code>extractBlankSelectors</code>. Then for each one of them:</p>

<ul>
<li>Add blank attribute if the value is empty.</li>
<li>Attach an input event listener.
On eah input the callback checks wether the input value is empty or not and applies the <code>blank</code> attribute accordingly.</li>
</ul>

<p>Here is a codepen to try it out live: </p>

<p><iframe height="600" src="https://codepen.io/issammani/embed/yLVVWvK?height=600&amp;default-tab=result&amp;embed-version=2">
</iframe>
</p>

<p>Et voilà ! We are all done ! </p>

<h2>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#conclusion" class="anchor">
  </a>
  Conclusion
</h2>

<p>As you can see polyfills are a super important concept, that helped the web move forward and developers use new features without the fear of breaking compatibility. If you enjoyed reading this like, share and/or leave a comment. Feedback is always welcome !</p>

<p>Live long and prosper 🖖</p>

<h2>
  <a href="https://dev.to/issammani/polyfills-what-are-they-2ha5#useful-links" class="anchor">
  </a>
  Useful links
</h2>

<ul>
<li><a href="https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills">A List of cross browser polyfills</a></li>
<li><a href="https://remysharp.com/2010/10/08/what-is-a-polyfill/">Remy Sharp's original post about polyfills</a></li>
<li><a href="">A third link</a></li>
</ul>

]]></description>
      <pubDate>Fri, 12 Feb 2021 13:35:10 +0000</pubDate>
      <link>https://dev.to/issammani/polyfills-what-are-they-2ha5</link>
      <dc:creator>DEV Community</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/2896303875</guid>
    </item>
    <item>
      <title><![CDATA[The web didn’t change; you did]]></title>
      <description><![CDATA[

<blockquote>
  <p>The problem with developing front end projects isn’t that it’s harder or more complicated, it’s that you made it harder and more complicated.</p>
</blockquote>

<p>Yes! THIS!</p>

<blockquote>
  <p>Web development did not change. Web development grew. There are more options now, not different options.</p>
</blockquote>

<p>You choose complexity. You can also choose simplicity.</p>

<p><a href="https://adactio.com/links/17811">adactio.com/links/17811</a></p>

            ]]></description>
      <pubDate>Thu, 11 Feb 2021 15:00:15 +0000</pubDate>
      <link>https://remysharp.com/2021/02/11/the-web-didnt-change-you-did</link>
      <dc:creator>Adactio: Links</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/2894371080</guid>
    </item>
    <item>
      <title><![CDATA[Week Notes №3 ending 14 Jun 2019]]></title>
      <description><![CDATA[
			<h2 id="monday-june-10">Monday June 10 <a class="direct-link" href="https://www.zachleat.com/web/notes/week/2019/06/14/#monday-june-10">#</a></h2>
<ul>
<li><a href="https://twitter.com/rem/status/1138111172048248832">Remy Sharp reminded us that that Disqus’ JavaScript is a trojan horse for all kinds of tracking and fourth-party JavaScript</a>. Notably a lot of this is <a href="https://twitter.com/zachleat/status/1138127857119584256">blocked by default in Firefox (without an ad-blocker)</a>. Firefox’s site performance gets a huge head start on Chrome because of Mozilla’s excellent decision to block this extra junk.</li>
<li><a href="https://github.com/zloirock/core-js/issues/548"><code>core-js</code> decided to console log a message on postinstall to ask for project donations</a> and spurred a big discussion on best practices for open source sustainability. I empathize with what they’re trying to do but I think the execution was a bit off—I’ve seen this message in my console so many times that it’s feeling a bit like spam.</li>
<li>Ryan Frazier is using <a href="https://pianomanfrazier.com/post/lilypond-in-markdown/">Eleventy to render sheet music</a>! WHAT.</li>
<li>The <a href="https://changelog.com/jsparty/79">JS Party episode that I was on</a> was published.</li>
<li>I wrote a post about <a href="https://www.zachleat.com/web/facepile/">Facepile image performance and lazy loading webmention avatar images</a>.</li>
</ul>
<h2 id="tuesday-june-11">Tuesday June 11 <a class="direct-link" href="https://www.zachleat.com/web/notes/week/2019/06/14/#tuesday-june-11">#</a></h2>
<ul>
<li>I finally got a little bit of time to play with Nuxt. I’m becoming a big fan of Vue and it works great but goodness Nuxt loads a fair bit of JavaScript for the Hello World demo.</li>
<li>I switched my site to use <code>brotli</code> instead of <code>zopfli</code> compression. I’d take a wild guess that it’s about 10% better? Here’s <a href="https://github.com/zachleat/zachleat.com/commit/4e8f33e3ca55b16df5268721098224f1021b1bb3">how I did it</a>.</li>
<li>Update: Remy Sharp removed Disqus from his site and blogged about it in <a href="https://remysharp.com/2019/06/11/ejecting-disqus">Ejecting Disqus</a>. He replaced it with <a href="https://commento.io/">Commento</a>.</li>
</ul>
<h2 id="wednesday-june-12">Wednesday June 12 <a class="direct-link" href="https://www.zachleat.com/web/notes/week/2019/06/14/#wednesday-june-12">#</a></h2>
<ul>
<li>I found an XSS problem in my webmentions. I needed to adjust my use of sanitize-html in my build to make sure that it was escaping all of the webmention output. Max Boeck updated his <a href="https://github.com/maxboeck/eleventy-webmentions/"><code>eleventy-webmentions</code></a> project with this fix as well. <a href="https://twitter.com/zachleat/status/1138797014928568325"><em>(via Twitter)</em></a></li>
</ul>
<h2 id="thursday-june-13">Thursday June 13 <a class="direct-link" href="https://www.zachleat.com/web/notes/week/2019/06/14/#thursday-june-13">#</a></h2>
<ul>
<li>I did a <a href="https://www.smashingmagazine.com/smashing-tv/five-whys-of-web-font-loading-performance/">Smashing TV Webinar</a>. It was an updated version (a minor release) of a talk that I gave at <a href="https://www.zachleat.com/web/five-whys/">Performance.now()</a> last year. I published the <a href="https://www.zachleat.com/web/smashingtv/">new, updated slides</a>. The video is free to Smashing members!</li>
<li>We (Filament Group) launched <a href="https://www.filamentgroup.com/">a redesign of our web site</a>! <a href="https://twitter.com/scottjehl/status/1138899549840392197">Scott Jehl has more about it on Twitter</a>. (Still using Eleventy 😎)</li>
<li><a href="https://www.hawksworx.com/">Phil Hawksworth</a> did a big update to his very popular <a href="https://eleventyone.netlify.com/">Eleventy starter project, EleventyOne</a>. It’s great! <a href="https://twitter.com/philhawksworth/status/1139136281563283457"><em>(via Twitter)</em></a></li>
</ul>
<h2 id="friday-june-14">Friday June 14 <a class="direct-link" href="https://www.zachleat.com/web/notes/week/2019/06/14/#friday-june-14">#</a></h2>
<ul>
<li>I noticed that the much renowned photographer <a href="https://normanposselt.com/">Norman Posselt</a> published an <a href="https://www.instagram.com/p/ByPXtDWC4m1/">Instagram sneak preview of the portrait</a> he took of me directly after my talk at Beyond Tellerrand!</li>
<li>New awesome Eleventy site: <a href="https://every-layout.dev/">Every Layout: Relearn CSS Layout</a> from <a href="https://twitter.com/heydonworks">Heydon Pickering</a> and <a href="https://andy-bell.design/">Andy Bell</a>.</li>
<li>Another new awesome Eleventy site: <a href="https://ffconf.org/">ffconf.org</a>, a very popular long-running conference series organized by Left Logic. Thanks <a href="https://remysharp.com/">Remy Sharp</a>!</li>
</ul>

		]]></description>
      <pubDate>Fri, 14 Jun 2019 05:00:00 +0000</pubDate>
      <link>https://www.zachleat.com/web/notes/week/2019/06/14/</link>
      <dc:creator>Zach Leatherman</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/2851950393</guid>
    </item>
    <item>
      <title><![CDATA[Speaking online]]></title>
      <description><![CDATA[

<p>I really, really missed speaking at conferences in 2020. I managed to squeeze in just one meatspace presentation before everything shut down. That was in Nottingham, where myself and <a href="https://remysharp.com/">Remy</a> reprised our double-bill talk, <a href="https://adactio.com/articles/15975"><cite>How We Built The World Wide Web In Five Days</cite></a>.</p>

<p>That was pretty much all the travelling I did in 2020, apart from <a href="https://adactio.com/journal/16518">a joyous jaunt to Galway</a> to celebrate my birthday shortly before the Nottingham trip. It’s kind of hilarious to look at <a href="https://adactio.com/archive/2020/map">a map of the entirety of my travel in 2020</a> compared to previous years.</p>

<p>Mind you, one of my goals for 2020 was to reduce my carbon footprint. Mission well and truly accomplished there.</p>

<p>But even when travel was out of the question, conference speaking wasn’t entirely off the table. I gave a brand new talk at <a href="https://aneventapart.com/event/online-0820">An Event Apart Online Together: Front-End Focus</a> in August. It was called <cite>Design Principles For The Web</cite> and <a href="https://adactio.com/articles/17733">I’ve just published a transcript of the presentation</a>. I’m really pleased with how it turned out and I think it works okay as an article as well as a talk. <a href="https://adactio.com/articles/17733">Have a read</a> and see what you think (or you can <a href="http://adactio.s3.amazonaws.com/audio/articles/aea2020designprinciplesfortheweb.mp3">listen to the audio</a> if you prefer).</p>

<p>Giving a talk online is …weird. It’s very different from public speaking. The public is theoretically there but you feel like you’re just talking at your computer screen. If anything, it’s more like recording a podcast than giving a talk.</p>

<p>Luckily for me, <a href="https://podcast.clearleft.com/">I like recording podcasts</a>. So I’m going to be doing a new online talk this year. It will be at <a href="https://aneventapart.com/event/spring-summit-2021">An Event Apart’s Spring Summit</a> which runs from April 19th to 21st. <a href="https://store.aneventapart.com/register/2021/spring-summit">Tickets are available now</a>.</p>

<p>I have a pretty good idea what I’m going to talk about. Web stuff, obviously, but maybe a big picture overview this time: the past, present, and future of the web.</p>

<p>Time to <a href="https://adactio.com/journal/14363">prepare a conference talk</a>.</p>


            ]]></description>
      <pubDate>Mon, 04 Jan 2021 15:43:19 +0000</pubDate>
      <link>https://adactio.com/journal/17734</link>
      <dc:creator>Adactio: Journal</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/2817282941</guid>
    </item>
    <item>
      <title><![CDATA[Upgrades and polyfills]]></title>
      <description><![CDATA[

<p>I started getting some emails recently from people having issues using <a href="https://thesession.org/">The Session</a>. The issues sounded similar—an interactive component that wasn’t, well …interacting.</p>

<p>When I asked what device or browser they were using, the answer came back the same: Safari on iPad. But not a new iPad. These were older iPads running older operating systems.</p>

<p>Now, remember, even if I wanted to recommend that they use a different browser, <a href="https://adactio.com/journal/17428">that’s not an option</a>:</p>

<blockquote>
  <p>Safari is the only browser on iOS devices.</p>

  <p>I don’t mean it’s the only browser that <em>ships</em> with iOS devices. I mean it’s the only browser that can be installed on iOS devices.</p>

  <p>You can install something called Chrome. You can install something called Firefox. Those aren’t different web browsers. Under the hood they’re using Safari’s rendering engine. They have to.</p>
</blockquote>

<p>It gets worse. Not only is there no choice when it comes to rendering engines on iOS, but the rendering engine is also tied to the operating system.</p>

<p>If you’re on an old Apple laptop, you can at least install an up-to-date version of Firefox or Chrome. But you can’t install an up-to-date version of Safari. An up-to-date version of Safari requires an up-to-date version of the operating system.</p>

<p>It’s the same on iOS devices—you can’t install a newer version of Safari without installing a newer version of iOS. But unlike the laptop scenario, you can’t install <em>any</em> version of Firefox of Chrome.</p>

<p>It’s disgraceful.</p>

<p>It’s particularly frustrating when an older device <em>can’t</em> upgrade its operating system. Upgrades for Operating system generally have some hardware requirements. If your device doesn’t meet those requirements, you can’t upgrade your operating system. That wouldn’t matter so much except for the Safari issue. Without an upgraded operating system, your web browsing experience stagnates unnecessarily.</p>

<p><a href="https://en.wikipedia.org/wiki/For_Want_of_a_Nail">For want of a nail</a>…</p>

<ul>
<li>A website feature isn’t working so</li>
<li>you need to upgrade your browser which means</li>
<li>you need to upgrade your operating sytem but</li>
<li>you can’t upgrade your operating system so</li>
<li>you need to buy a new device.</li>
</ul>

<p><a href="https://developer.apple.com/app-store/review/guidelines/#2.5.6">Apple doesn’t allow other browsers to be installed on iOS devices</a> so people have to buy new devices if they want to use the web. Handy for Apple. Bad for users. Really bad for the planet.</p>

<p>It’s particularly galling when it comes to iPads. Those are exactly the kind of casual-use devices that shouldn’t need to be caught in the wasteful cycle of being used for a while before getting thrown away. I mean, I get why you might want to have a relatively modern phone—a device that’s constantly with you that you use all the time—but an iPad is the perfect device to just have lying around. You shouldn’t feel pressured to have the latest model <a href="https://www.lifewire.com/obsolete-ipad-4138570">if the older version still does the job</a>:</p>

<blockquote>
  <p>An older tablet makes a great tableside companion in your living room, an effective e-book reader, or a light-duty device for reading mail or checking your favorite websites. </p>
</blockquote>

<p>Hang on, though. There’s another angle to this. Why should a website demand an up-to-date browser? If the website has been built using the tried and tested approach of progressive enhancement, then everyone should be able to achieve their goals regardless of what browser or device or operating system they’re using.</p>

<p>On <a href="https://thesession.org/">The Session</a>, I’m using progressive enhancement and feature detection everywhere I can. If, for example, I’ve got some JavaScript that’s going to use <code>querySelectorAll</code> and <code>addEventListener</code>, I’ll first test that those methods are available.</p>

<pre><code>if (!document.querySelectorAll || !window.addEventListener) {
  // doesn't cut the mustard.
  return;
}
</code></pre>

<p>I try not to assume that anything is supported. So why was I getting emails from people with older iPads describing an interaction that wasn’t working? A JavaScript error was being thrown somewhere and—because of JavaScript’s brittle error-handling—that was causing all the subsequent JavaScript to fail.</p>

<p>I tracked the problem down to a function that was using some DOM methods—<code>matches</code> and <code>closest</code>—as well as the relatively recent JavaScript <code>forEach</code> method. But I had <a href="https://remysharp.com/2010/10/08/what-is-a-polyfill/">polyfills</a> in place for all of those. Here’s <a href="https://github.com/jonathantneal/closest/blob/master/src/index.js">the polyfill I’m using for <code>matches</code> and <code>closest</code></a>. And here’s <a href="https://gist.github.com/hufyhang/c303ce1b80c7b6f8a73e">the polyfill I’m using for <code>forEach</code></a>.</p>

<p>Then I spotted the problem. I was using <code>forEach</code> to loop through the results of  <code>querySelectorAll</code>. But the polyfill works on <em>arrays</em>. Technically, the output of <code>querySelectorAll</code> isn’t an array. It looks like an array, it quacks like an array, but it’s actually a node list.</p>

<p>So I added <a href="https://vanillajstoolkit.com/polyfills/nodelistforeach/">this polyfill from Chris Ferdinandi</a>.</p>

<p>That did the trick. I checked with the people with those older iPads and everything is now working just fine.</p>

<p>For the record, <a href="https://gist.github.com/adactio/e2bcd49379d4385e577924ec3339aeb1">here’s the small collection of polyfills I’m using</a>. Polyfills are supposed to be temporary. At some stage, as everyone upgrades their browsers, I should be able to remove them. But as long as some people are stuck with using an older browser, I have to keep those polyfills around.</p>

<p>I wish that Apple would allow other rendering engines to be installed on iOS devices. But if that’s a hell-freezing-over prospect, I wish that Safari updates weren’t tied to operating system updates.</p>

<p>Apple may argue that their browser rendering engine and their operating system are deeply intertwingled. That line of defence worked out great for Microsoft in the ‘90s.</p>


            ]]></description>
      <pubDate>Wed, 11 Nov 2020 12:44:56 +0000</pubDate>
      <link>https://adactio.com/journal/17605</link>
      <dc:creator>Adactio: Journal</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/2722363419</guid>
    </item>
    <item>
      <title><![CDATA[How To Drive Traffic To Your Website - Side Project Edition]]></title>
      <description><![CDATA[<p>You've been working on your side project for nearly 6 months now, launch date's today. You're super excited to show the world what you've been working on, you hit the launch button and...no traffic or users at all.</p>

<p>It's a common problem. Us IndieHackers <em>know</em> where to advertise our products, but not all of us know <em>how</em> to post our products. I've split up this blog post to two <strong>categories</strong>: </p>

<p>👉 How to get a huge traffic boost for a short period of time with little to no work.<br>
 👉 How to get steady traffic by using long-term strategies. </p>

<h1>
  <a href="https://dev.to/moeminm/how-to-drive-traffic-to-your-website-side-project-edition-451g#huge-traffic-boosts" class="anchor">
  </a>
  Huge Traffic Boosts
</h1>

<p>This is a great way to not only gain traffic, but also to validate your idea (if you haven't already). There are hundreds of directories all over the internet that you can post your side project to and in return get huge traffic boosts. Let me go over where to post your side projects, the pros and cons of posting on said websites, and <em>how</em> to post on said websites.</p>

<h3>
  <a href="https://dev.to/moeminm/how-to-drive-traffic-to-your-website-side-project-edition-451g#where-to-post-your-side-projects" class="anchor">
  </a>
  Where To Post Your Side Projects
</h3>

<ul>
<li><a href="https://www.reddit.com/">Reddit</a></li>
<li><a href="https://news.ycombinator.com/">HackerNews</a></li>
<li><a href="https://www.producthunt.com/">ProductHunt</a></li>
<li><a href="https://betalist.com/">Betalist</a></li>
<li><a href="https://betapage.co/">Betapage</a></li>
<li>
<a href="https://www.sideprojectors.com/">Sideprojectors</a>, yes, you can showcase your projects on Sideprojectors.</li>
<li><a href="https://launched.io/SubmitStartup">Launched</a></li>
<li><a href="https://www.saashub.com/">SaaSHub</a></li>
</ul>

<p>There are hundreds more websites you can submit your side projects to, but let's keep it simple for the sake of keeping this blog post short and sweet.</p>

<h3>
  <a href="https://dev.to/moeminm/how-to-drive-traffic-to-your-website-side-project-edition-451g#pros-and-cons-of-posting-on-directories" class="anchor">
  </a>
  Pros and Cons of Posting On Directories
</h3>

<p><strong>Pros:</strong></p>

<ul>
<li>Free huge traffic boost and all that comes with it. Be it sales, newsletter subscriptions, etc.</li>
</ul>

<p><strong>Cons:</strong></p>

<ul>
<li>Short term traffic. You could very well succeed on Reddit, HackerNews, and ProductHunt and you'd be set for a good week or so, but it'll be drought season afterwards.</li>
<li>Wrong audience. You're not necessarily targeting the 'optimal' audience by posting your side project on all these websites. </li>
</ul>

<p>Should you do it? Short answer, yes. Long answer, yes. Despite the low quality of traffic, you'll still be seeing a good portion of your target audience on these platforms. You're not really paying to submit on these platforms, so do it, if it works, good on you. If not, you should have a backup plan (second category in this blog post). </p>

<h3>
  <a href="https://dev.to/moeminm/how-to-drive-traffic-to-your-website-side-project-edition-451g#how-to-post-on-these-platforms" class="anchor">
  </a>
  How To Post On These Platforms
</h3>

<p>I've been waiting for this section. Let's assume you're releasing a website performance monitoring tool called Monitr. Things you should not do:</p>

<p>❌ Do not post your URL on all platforms meaninglessly. </p>

<p>Yup, that's it. So how do you share your product? Well, on websites such as ProductHunt, BetaPage and so on, there really isn't much you can do other than post the URL, but on community-based websites such as IndieHackers, Reddit, and HackerNews, there's so much room for creativity.</p>

<p>i.e. A post about website performance and its role in improve organic traffic with a link at the end of the article. More often than not, well thought out articles will rise to the top and your link will gain exposure. If not, you've added value to the community and you aren't really spamming your link. The mods will not be on your back.</p>

<p>Repurpose the content, you've written the blog post, will you go post that 1000+ article on Facebook/Twitter? No, try to make a simple graphic that will hook people and add your website's link within that graphic and the first comment. People on Facebook generally have low attention spans, so if you don't really grab their attention in the first few seconds they see your post, they're gone. </p>

<p>The point of this sub-section is to tell you to <em>learn</em> the platform before mindlessly spamming your links. </p>

<h1>
  <a href="https://dev.to/moeminm/how-to-drive-traffic-to-your-website-side-project-edition-451g#steady-traffic-using-longterm-strategies" class="anchor">
  </a>
  Steady Traffic Using Long-Term Strategies
</h1>

<p>My #1 lesson learned from my side projects which you can read all about <a href="https://blog.moeminmamdouh.com/how-i-failed-2-side-projects-in-under-a-year-and-lessons-learned">here</a>. What do I mean by long-term strategies? SEO. </p>

<p>SEO is a waiting game. You post your content, and you wait to rank on Google, but you don't just go posting about <em>anything</em>, you need to be smart about what you're writing about.</p>

<h3>
  <a href="https://dev.to/moeminm/how-to-drive-traffic-to-your-website-side-project-edition-451g#pick-high-volume-low-competition-keywords" class="anchor">
  </a>
  Pick high volume, low competition keywords.
</h3>

<p>For example, my last article <a href="https://blog.moeminmamdouh.com/20-free-design-resources-for-developers">20+ Free Design Resources for Developers</a> targeted the keywords 'free design resources'. According to Google Keywords, it receives 1k-10k search queries per month and has low competition, and well, it was a great pick. I'm currently the 10th result on Google for that keyword.</p>

<h3>
  <a href="https://dev.to/moeminm/how-to-drive-traffic-to-your-website-side-project-edition-451g#write-valuable-posts" class="anchor">
  </a>
  Write valuable posts
</h3>

<p>If you provide value, you will get noticed. I went ahead and posted my free design resources article on IndieHackers, dev.to, and HN just for the fun of it. I get around ~250 visitors from posting on there. Great, I head to bed, wake up and check my notifications only to find this:</p>

<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZFNRIGhm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1604472876194/lKGEdkJFO.png" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZFNRIGhm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1604472876194/lKGEdkJFO.png" alt="Mask Group 1.png"></a></p>

<p>So what's so surprising? Well, the traffic sources. I only posted on 3 websites. But I open up the acquisition tab and to my surprise, my 2nd most traffic source is from a website that featured my article that I didn't even know about.</p>

<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t4PYY4Ul--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1604473073706/DsH_DxO5S.png" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t4PYY4Ul--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1604473073706/DsH_DxO5S.png" alt="Mask Group 4.png"></a></p>

<p><strong>174 visitors came from traffic sources I did not submit my article to.</strong> The article was picked because it received attention on the 3 websites I posted to. Here are the stats for the article on IndieHackers and dev.to</p>

<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PXv2fZa2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1604473233181/1Q82l3LSp.png" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PXv2fZa2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1604473233181/1Q82l3LSp.png" alt="Mask Group 1.png"></a></p>

<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6K90Xkjs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1604473303797/YWjWoKvz2.png" class="article-body-image-wrapper"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6K90Xkjs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1604473303797/YWjWoKvz2.png" alt="Mask Group 2.png"></a></p>

<p>So I post the article hoping for some short term traffic, but what I didn't know is that it brought longer short term traffic. But wait, wasn't this a short term strategy? Yes, but also no.</p>

<p>You're also building backlinks this way. When a high domain authory website such as daily.dev features your website and links back to your website, that is <strong>great</strong> news.</p>

<h3>
  <a href="https://dev.to/moeminm/how-to-drive-traffic-to-your-website-side-project-edition-451g#setup-search-console-and-keep-track-of-your-organic-traffic" class="anchor">
  </a>
  Setup Search Console and Keep Track Of Your Organic Traffic
</h3>

<p>Search Console takes longer times to crawl new websites so you may find the results to be a little off at the beginning, that's fine. Set it up anyway, it's a very helpful tool. You get to see what keywords you're gaining impressions for, how many clicks you're getting, and what keywords are getting those clicks.</p>

<p>SEO is a long and tiring game, but once you start seeing results it's a great feeling. You no longer have to worry about constantly trying to find sources of traffic, they just roll in. Let me know <strong>your</strong> traffic game in the comments below and I hope you enjoyed this article!</p>

]]></description>
      <pubDate>Wed, 04 Nov 2020 07:11:30 +0000</pubDate>
      <link>https://dev.to/moeminm/how-to-drive-traffic-to-your-website-side-project-edition-451g</link>
      <dc:creator>DEV Community</dc:creator>
      <guid isPermaLink="false">https://feedbin.me/entries/2709574554</guid>
    </item>
  </channel>
</rss>
