<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kieran Venison</title>
    <description>The latest articles on DEV Community by Kieran Venison (@kieranmv95).</description>
    <link>https://dev.to/kieranmv95</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F128649%2F92c7e82a-8f80-4fec-8bea-266bb4ce603f.png</url>
      <title>DEV Community: Kieran Venison</title>
      <link>https://dev.to/kieranmv95</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kieranmv95"/>
    <language>en</language>
    <item>
      <title>Who Remembers Having to Check if You Could Use a CSS Feature?</title>
      <dc:creator>Kieran Venison</dc:creator>
      <pubDate>Sun, 06 Jul 2025 23:15:00 +0000</pubDate>
      <link>https://dev.to/kieranmv95/who-remembers-having-to-check-if-you-could-use-a-css-feature-f05</link>
      <guid>https://dev.to/kieranmv95/who-remembers-having-to-check-if-you-could-use-a-css-feature-f05</guid>
      <description>&lt;p&gt;Ah, &lt;code&gt;caniuse.com&lt;/code&gt;. My old flame. My partner through the dark ages of Internet Explorer 11. The friend I visited before every bold declaration of &lt;code&gt;display: grid;&lt;/code&gt;. The loyal confidant who would gently whisper, &lt;em&gt;“Not yet, friend. Not in Safari.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But something strange happened recently.&lt;/p&gt;

&lt;p&gt;I was knee-deep in a new project, slinging Tailwind classes like a cowboy in a typographic shootout, when it hit me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I can't remember the last time I checked if I &lt;em&gt;could&lt;/em&gt; use a CSS feature.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tailwind had quietly stolen that part of my workflow. Stolen it and buried it six feet under a grave marked &lt;em&gt;"RIP Vendor Prefixes"&lt;/em&gt;. And honestly? I didn’t even send flowers.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Love Letter to &lt;code&gt;caniuse.com&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Remember the ritual?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You spot a fancy new CSS property on CSS-Tricks.&lt;/li&gt;
&lt;li&gt;Your brain lights up like a Christmas tree.&lt;/li&gt;
&lt;li&gt;You open a new tab with trembling fingers.&lt;/li&gt;
&lt;li&gt;You type: &lt;code&gt;caniuse.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;You pray.&lt;/li&gt;
&lt;li&gt;You weep.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I used to &lt;strong&gt;schedule my ambition around browser support&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
“Can I use &lt;code&gt;position: sticky&lt;/code&gt;?” Not unless you enjoy watching IE11 ruin your life and your layout.&lt;/p&gt;




&lt;h2&gt;
  
  
  Then Tailwind Came Along
&lt;/h2&gt;

&lt;p&gt;Now? I write &lt;code&gt;sticky top-0&lt;/code&gt; and just assume it’ll work.&lt;br&gt;&lt;br&gt;
Not because I’m cocky (okay, maybe a little), but because I trust that the Tailwind team has already done the legwork.&lt;/p&gt;

&lt;p&gt;Tailwind, PostCSS, Autoprefixer, and friends have become this benevolent cabal of CSS sorcerers that quietly smooth over the messy parts of the web.&lt;br&gt;&lt;br&gt;
They don’t ask for thanks. They just let you build things that don’t spontaneously combust in Edge.&lt;/p&gt;

&lt;p&gt;Honestly, I don’t even remember what browser version we’re supporting anymore.&lt;br&gt;&lt;br&gt;
That used to be printed on the wall. Now it’s more like a vague vibe.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;“Modern enough, probably.”&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Are We Getting Lazy?
&lt;/h2&gt;

&lt;p&gt;Maybe. But also, maybe we’ve earned it?&lt;/p&gt;

&lt;p&gt;After years of getting gaslit by &lt;code&gt;float&lt;/code&gt;, after wrestling with &lt;code&gt;flexbox&lt;/code&gt; bugs that only existed in Firefox 68, after prefixing everything like we were trying to cast CSS spells—&lt;strong&gt;we deserve this era of ignorant bliss.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Somewhere, someone is still checking &lt;code&gt;caniuse.com&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
Some poor soul trying to support a Smart TV browser in a prison system in rural Nebraska.&lt;br&gt;&lt;br&gt;
But not me. Not anymore.&lt;/p&gt;




&lt;h2&gt;
  
  
  In Summary
&lt;/h2&gt;

&lt;p&gt;Do I miss &lt;code&gt;caniuse.com&lt;/code&gt;?&lt;br&gt;&lt;br&gt;
A little. Like you miss an ex that taught you a lot but also made you question your sanity.&lt;/p&gt;

&lt;p&gt;But now? Now I just write &lt;code&gt;grid grid-cols-3 gap-6&lt;/code&gt; and move on with my life.&lt;br&gt;&lt;br&gt;
And that, my friends, is progress.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;PS:&lt;/strong&gt; If you still use &lt;code&gt;float&lt;/code&gt;, we need to talk.&lt;br&gt;&lt;br&gt;
And by "talk", I mean "stage an intervention".&lt;/p&gt;




</description>
      <category>css</category>
      <category>tailwindcss</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Deep Dive into CSS :has Selector</title>
      <dc:creator>Kieran Venison</dc:creator>
      <pubDate>Wed, 17 Jan 2024 09:25:50 +0000</pubDate>
      <link>https://dev.to/kieranmv95/deep-dive-into-css-has-selector-1joe</link>
      <guid>https://dev.to/kieranmv95/deep-dive-into-css-has-selector-1joe</guid>
      <description>&lt;p&gt;In the ever-evolving landscape of web development, CSS continues to offer powerful tools that significantly enhance the capability of web designers and developers. A prime example of this progress is the introduction of the &lt;code&gt;:has&lt;/code&gt; selector. Part of the CSS Selectors Level 4 specification, :has brings a new paradigm to CSS, allowing developers to select and style elements in a more contextual and conditional manner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Overview of :has
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;:has&lt;/code&gt; selector is a relational pseudo-class that matches elements based on the presence of specified descendants. Unlike traditional selectors, &lt;code&gt;:has&lt;/code&gt; looks ahead in the DOM structure, enabling parent selectors based on child or descendant elements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Syntax&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The syntax of the &lt;code&gt;:has&lt;/code&gt; selector is as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;element&lt;/span&gt;&lt;span class="nd"&gt;:has&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;selector&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;/* styles */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;selector&lt;/code&gt; inside &lt;code&gt;:has()&lt;/code&gt; can be a combination of any valid CSS selector, including class, ID, attribute, pseudo-class, and pseudo-element selectors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Cases and Examples
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Responsive Design&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#ccc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Adjust the layout of a card if it contains an image */&lt;/span&gt;
&lt;span class="nc"&gt;.card&lt;/span&gt;&lt;span class="nd"&gt;:has&lt;/span&gt;&lt;span class="o"&gt;(&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;img&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"path_to_image.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Image Description"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Card Title&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Some content here...&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Example without an image --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Another Card Title&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Some other content here...&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example demonstrates the ability of &lt;code&gt;:has&lt;/code&gt; to create more responsive and adaptive design, especially useful in scenarios like card layouts where the presence of an image can dictate the layout structure.&lt;/p&gt;

&lt;p&gt;Typicallky before &lt;code&gt;:has&lt;/code&gt; we would have to implement more selector rules and say something like &lt;code&gt;class="card card--two-column"&lt;/code&gt; but now instead of adapting out html markup and our css to cater for the varied content we only have to update our css and it can essentially ifgure out what the content is and apply the appropriate styling!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interactive Content&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.menu-item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Style a menu item differently if it contains a submenu */&lt;/span&gt;
&lt;span class="nc"&gt;.menu-item&lt;/span&gt;&lt;span class="nd"&gt;:has&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;.submenu&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;lightcoral&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.submenu&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;grey&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.menu-item&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="nc"&gt;.submenu&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"menu-item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Home&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"menu-item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;About&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"menu-item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Services
    &lt;span class="nt"&gt;&amp;lt;ul&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"submenu"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Web Design&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Web Development&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"menu-item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Contact&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;:has&lt;/code&gt; selector can significantly simplify the styling of complex navigation menus, particularly when dealing with nested or dynamic content.&lt;/p&gt;

&lt;p&gt;Similar to the previous example before &lt;code&gt;:has&lt;/code&gt; we would have to apply another modifier to menu-item to achieve this.&lt;/p&gt;

&lt;p&gt;I have faced issues in the past where I read files from the file system and dynamically generate the navigation. I have had to add logic to the top level &lt;code&gt;&amp;lt;li class="menu-item"&amp;gt;&lt;/code&gt; to check if it contains a nested &lt;code&gt;ul&lt;/code&gt; and then if it does apply another class making it &lt;code&gt;&amp;lt;li class="menu-item menu-item--with-children"&amp;gt;&lt;/code&gt;. Using this example you can skip writing all the logic to do this and save computing that value with javascript, a nice efficiency win, and a marked improvement on readability for your html markup!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Form Field Validation&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Highlight a field with invalid input */&lt;/span&gt;
&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nd"&gt;:invalid:has&lt;/span&gt;&lt;span class="o"&gt;(+&lt;/span&gt; &lt;span class="nc"&gt;.error-message&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter your email"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"error-message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Please enter a valid email address.&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The combination of &lt;code&gt;:has&lt;/code&gt; with other pseudo-classes like &lt;code&gt;:invalid&lt;/code&gt; can enhance form validation feedback, improving user experience.&lt;/p&gt;

&lt;p&gt;Typically, looking at react for this example we would have had to invalidate the field and conditionally apply a class to the input or wrap it in another dive and conditionall aplly a class to that. meaining more DOM soup, here we dont need any of that.&lt;/p&gt;

&lt;p&gt;The only dynamic thing now would be showing the error, and if that error is visible, we have a appripriately styled input.&lt;/p&gt;

&lt;h2&gt;
  
  
  Browser Compatibility and Modern Web Practices
&lt;/h2&gt;

&lt;p&gt;As of 2024, the &lt;code&gt;:has&lt;/code&gt; selector enjoys support across major modern browsers, including the latest versions of Chrome, Firefox, Safari, and Edge. The growing trend towards modern web practices and the phasing out of legacy browsers like Internet Explorer has paved the way for the adoption of advanced CSS features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Emphasising the Shift from Internet Explorer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With the end of Internet Explorer's lifecycle, web developers are no longer constrained by its limitations. This transition allows the full utilisation of modern CSS capabilities, such as the &lt;code&gt;:has&lt;/code&gt; selector, which are unsupported in Internet Explorer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Considerations
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Performance Implications&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While the &lt;code&gt;:has&lt;/code&gt; selector opens new avenues in CSS, it's essential to consider its impact on rendering performance. Since &lt;code&gt;:has&lt;/code&gt; is more complex than traditional selectors, it can introduce performance overhead, especially when used extensively or with complex descendant selectors. Developers should balance the use of &lt;code&gt;:has&lt;/code&gt; with performance best practices.&lt;/p&gt;

&lt;p&gt;But I'm going to take a stab in the dark here and say that this is more than likely going to be much quicker than writing javascript to achieve the same effect!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cascading and Specificity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;:has&lt;/code&gt; selector follows the standard rules of cascading and specificity in CSS. Its specificity is calculated based on the compound selectors within the &lt;code&gt;:has()&lt;/code&gt; function. Understanding this is crucial for avoiding unexpected styling conflicts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final caveat&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ALWAYS check your own browser stats! I have generalised a lot here about the support. Yes it may be fully supported in all modern browsers, but, is that what &lt;strong&gt;your&lt;/strong&gt; users use? before adopting anything make sure that it is supported by your predefined thresholds of support! check out &lt;a href="https://caniuse.com/css-has"&gt;Can I Use&lt;/a&gt; for more info on the support!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The CSS &lt;code&gt;:has&lt;/code&gt; selector marks a significant milestone in the evolution of CSS, offering developers more sophisticated tools for styling web pages. Its ability to select parent elements based on child conditions is a powerful addition to the CSS toolkit. With broad browser support and the shift away from legacy browsers, the &lt;code&gt;:has&lt;/code&gt; selector is poised to become a staple in modern web design. As with any advanced feature, it should be used judiciously, with a mindful approach to performance and specificity.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>programming</category>
    </item>
    <item>
      <title>Hackathon to Build a Game in 3 Hours</title>
      <dc:creator>Kieran Venison</dc:creator>
      <pubDate>Fri, 12 Jan 2024 08:49:12 +0000</pubDate>
      <link>https://dev.to/kieranmv95/hackathon-to-build-a-game-in-3-hours-38c5</link>
      <guid>https://dev.to/kieranmv95/hackathon-to-build-a-game-in-3-hours-38c5</guid>
      <description>&lt;p&gt;Hackathons are super fun. To date, I have done two other hackathons, the now-defunct Hack Manchester event. In which you had 24 hours non-stop to build something in a team of 6 to a theme provided by the sponsor. So when I was made aware that the company away day was going to be a hackathon, I was super excited. But it had some quirks I had never experienced before:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It was building a game - new territory for me&lt;/li&gt;
&lt;li&gt;It was built in React - &lt;strong&gt;Yes in react&lt;/strong&gt;, not in Unity or even using the Canvas &lt;em&gt;(I will expand on this shortly)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;I was the only developer on the team of 5&lt;/li&gt;
&lt;li&gt;I had never met any of the people and started at the company 5 days prior to the event&lt;/li&gt;
&lt;li&gt;We &lt;strong&gt;ONLY&lt;/strong&gt; had 3-4 hours of coding time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So how did it go, and what would I do differently?&lt;/p&gt;

&lt;h2&gt;
  
  
  Brief
&lt;/h2&gt;

&lt;p&gt;Before I continue, I will state that the challenge had a theme. The theme was around building a game for children currently in the healthcare system, something they can play to help reduce anxiety whilst in hospital or undergoing treatment of some kind because, as a TL:DR; there have been many studies showing that children who have an adverse event whilst in a hospital (such as being restrained to be sedated) have a noticeably longer recovery period. So the criteria were simple:&lt;/p&gt;

&lt;p&gt;It could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Be Educational&lt;/li&gt;
&lt;li&gt;Be Something to distract them from the situation they are in&lt;/li&gt;
&lt;li&gt;Target age brackets of 2-5, 5-13, 13+ or all of them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We also had to develop offline material to support the game because not everyone in the healthcare system has access to the technology required to play the games, so that was an additional piece of criteria we had to meet which also abided by the above principles: educate, distract, and fit one or more of the age brackets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Planning
&lt;/h2&gt;

&lt;p&gt;Once we had heard the brief, we had to plan.&lt;/p&gt;

&lt;p&gt;We had ample time to plan. During the day, we all brought board games and some console games. We sat around and switched around different stations playing a variety of games to try and trigger a thought process or ideas we could use with our mini-games.&lt;/p&gt;

&lt;p&gt;After playing some games, we split into our teams. The teams typically consisted of 5-6 people. As this was an entire company, it ended up making some interesting teams, so my team ended up looking like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Developer - myself&lt;/li&gt;
&lt;li&gt;Senior Designer&lt;/li&gt;
&lt;li&gt;Lead Talent Manager&lt;/li&gt;
&lt;li&gt;Senior Finance Manager&lt;/li&gt;
&lt;li&gt;NHS Healthcare Manager&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was by far the most peculiar team setup I had ever been a part of when doing a hackathon (typically it's primarily devs and maybe a test resource and a product person). But being a company event, we wanted the entire business to partake in this and experience what a hackathon is like and the kind of chaos and collaboration around it.&lt;/p&gt;

&lt;p&gt;The first thing we did in our team &lt;strong&gt;As individuals&lt;/strong&gt; was Crazy 8's. I will &lt;a href="https://www.iamnotmypixels.com/how-to-use-crazy-8s-to-generate-design-ideas/" rel="noopener noreferrer"&gt;link to an article to explain it more here&lt;/a&gt; but in short, we got a piece of A4 paper and folded it so we had 8 rectangle seams on the page. Then in each rectangle, we wrote a brief description for a unique mini-game. Once the time was up (around 10 minutes in total, so you have to be quick) we had a few minutes to skim over them and pick the one which we thought was the best.&lt;/p&gt;

&lt;p&gt;Once we had chosen one of our 8 short game descriptions, we flipped the sheet and spent a further 10 minutes sketching out the potential screens of that game to get a visual idea of how it would play and to demo back to our team.&lt;/p&gt;

&lt;p&gt;Once this final round of self-planning was done, we stuck our ideas to a team whiteboard, and each pitched our idea to the team.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deciding which project to run
&lt;/h2&gt;

&lt;p&gt;So as I mentioned at the start of the article, this is built in React. And the reason is that one of the Lead Engineers had a passion project that he had been working on at the time, A react-based game engine. The theory is that this game doesn't require the same large paradigm shift away from react technologies that front-end developers are used to using over to something like C# in Unity. And it was just something fun to try out. Why not! It's open source, so you can &lt;a href="https://overreactjs.github.io/docs/intro" rel="noopener noreferrer"&gt;have a nosey yourself!&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Being developed by a single person, who has kids and a full-time job means we are all using an alpha version of this and the docs are not completed fully and it's very much in its infancy, so we had to be careful how much of a game we decide we want to build, (at least if we want to present something)!&lt;/p&gt;

&lt;p&gt;So how did we decide? &lt;a href="https://en.wikipedia.org/wiki/Dot-voting#:~:text=In%20dot%2Dvoting%20participants%20vote,a%20form%20of%20cumulative%20voting." rel="noopener noreferrer"&gt;We dot voted&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2 votes each&lt;/li&gt;
&lt;li&gt;You cannot vote for your own game&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I can't lie here so I will say some of the ideas scared me; one of them was VR/AR related, which was super cool, but an engine built on react and in its infancy and being a sole developer meant none of my votes are going here; it's basically a shotgun to the face if I pick this.&lt;/p&gt;

&lt;p&gt;My Idea was a digital version of &lt;a href="https://en.wikipedia.org/wiki/Operation_(game)" rel="noopener noreferrer"&gt;Operation&lt;/a&gt;. A game in which you have to carefully remove pieces of the character's body without touching the side and making the nose glow red. But instead of just removing the piece, you had to traverse through a short maze to get to the operation table without touching the wall of the maze with your finger or the piece would fly back to the body. And in all honesty, while much simpler than the AR/VR one, it was still a big stretch in 3-4 hours. So I was kind of hoping people didn't like the sound of it.&lt;/p&gt;

&lt;p&gt;Two more games cropped up with a similar theme of designing a character/animal and getting accessories for them and then guiding them through a treatment, such as applying a plaster, or explaining to them what's in a medical room and these started being 2d, which was a sigh of relief and actually decent ideas as well.&lt;/p&gt;

&lt;p&gt;And last but not least, the idea we went with. A much simpler idea, a Where's Wally clone. The idea was simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A series of scenes each containing something/things you have to find&lt;/li&gt;
&lt;li&gt;you tap the item to find and it disappears&lt;/li&gt;
&lt;li&gt;Once you have tapped the item/or all the times in the scene the next scene appears&lt;/li&gt;
&lt;li&gt;you fly through the scenes as quickly as possible to achieve a high score&lt;/li&gt;
&lt;li&gt;if you miss the target you lose 10% of the points you have earned&lt;/li&gt;
&lt;li&gt;Your high score was a calculation based on the overall time taken, your points and accuracy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This game was simple, a flat 2d game with clickable objects a few unique screens which I could probably implement a generic way of adding more screens and then a simple end screen, time and score. A nice distracting game which can be for all the ages ranges if we change the complexity of the search!&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the game
&lt;/h2&gt;

&lt;p&gt;Time to sit down and crack on.&lt;/p&gt;

&lt;p&gt;I'm not going to share large snippets of code in this article because this is not a programming article as such, but I just want to share the ways in which I massively overcomplicated such a small project.&lt;/p&gt;

&lt;p&gt;The idea was simple. The designer sends me some screen mockups and says here is the hidden thing and then I (Using the overreact/js engine) draw a grid, I went for a 100 x 100 grid. I then find the cell of the grid where the hidden item is and make that cell an invisible target. So to do this I could simply have an array of screen objects each containing a URL to the image and the cell to which the hidden item is in like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;screens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./assets/screens/desert-1.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./assets/screens/desert-2.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;65&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./assets/screens/desert-3.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In a hackathon, you go into panic mode, you sit down and fire code at the wall, and it is ugly. It doesn't have to be the right solution, it just has to work, you're on limited time. so I implemented this, got the screens in, drew them to the page using the BitmapAsset component from the engine, hit a few blockers and bugs along the way then realized an issue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not all the hidden items align with our perfect 10x10 grid system.&lt;/strong&gt; In some places, they overlap, how do you map a circle to a square etc, etc. So I kept the existing code as was and extended it, in a super hacky way like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;screens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./assets/screens/desert-1.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./assets/screens/desert-2.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;66&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;67&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./assets/screens/desert-3.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;81&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;91&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above allowed me to say if they hit a cell and screen[x].cells.includes(cellHit) then they have found the hidden object! Move to the next screen.&lt;/p&gt;

&lt;p&gt;The cell concept kind of looked like this image where the active cells (which would obviously be invisible) are highlighted green:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.kieranvenison.co.uk%2Fblog%2Fwhereswally.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.kieranvenison.co.uk%2Fblog%2Fwhereswally.png" alt="wheres wally concept"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But by this point, I had loads of broken score and timer logic in so it was already a mess, so doing basic things became tricky on top of the mountain of, well... shit.&lt;/p&gt;

&lt;p&gt;But we ended up with 9 screens you could traverse through and click a range of cells to progress&lt;/p&gt;

&lt;p&gt;Time was running out. We did a few bits to prettify it, adding an end screen to display the score and a start screen with a background image and a start button. But time was running so slim that we "cheated" the start screen, We used a full-screen image of the UI and selected the start cells to overlay the start button.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If it looks stupid but it works, it ain't stupid"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So all finished just in time, the messiest code I have written in years, but you can play the game, traverse through the screens and... it's actually pretty fun.&lt;/p&gt;

&lt;p&gt;Given a couple more hours, and not having the sloppiest code known to man I wanted to implement things such as&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Saving high scores&lt;/li&gt;
&lt;li&gt;Randomising the screens&lt;/li&gt;
&lt;li&gt;Randomising the hidden item position&lt;/li&gt;
&lt;li&gt;Moving targets as a dexterity version&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But after all of this complexity in drawing a grid and making cell ranges, I realised something, at the very end that made me laugh.&lt;/p&gt;

&lt;p&gt;the simplicity of this game meant could build this in about 10 minutes if I had just made a drawable SVG to the screen and popped onClick on it! I did have access to the HTML DOM after all!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.kieranvenison.co.uk%2Fblog%2Fkanye-west-laugh.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.kieranvenison.co.uk%2Fblog%2Fkanye-west-laugh.gif" alt="kanye west angry laugh"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With that in mind, even though the time cap was only 3-4 hours it would have been wiser to spend 40 minutes of that time actually planning the build, I would have likely got to the same game in terms of end result and would likely have faced other issues from doing a different approach but I strongly think I would have come to a better structured approach which would be much more extensible and polished than this one.&lt;/p&gt;

&lt;h2&gt;
  
  
  It wasn't just a game
&lt;/h2&gt;

&lt;p&gt;At the same time, the game was going on I almost forgot the team was working on multiple things, the designer was constantly firing assets to me and we had a mini collab back and forth and as we developed the game and the rest of the team fired us ideas for the screen and worked on the offline assets for the game.&lt;/p&gt;

&lt;p&gt;The offline game was as simple a concept as the game itself. A series of handout sheets with items you could find on related to healthcare as an educational challenge and the concept of a mural-style wallpaper you could put in children's waiting areas with a variety of things they could look for to distract them from the situation they are in! an amazing, yet so simple concept. They even made a series of sketches and drawings and fastened them together and rolled it out during the demo back to the business to explain the concept which was super cool to see as I had been heads down in my bubble for the last 3 hours!&lt;/p&gt;

&lt;h2&gt;
  
  
  The end result
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A game that works 🤯&lt;/li&gt;
&lt;li&gt;A game that is vastly overcomplicated&lt;/li&gt;
&lt;li&gt;Spent some time using a fun engine!&lt;/li&gt;
&lt;li&gt;Got to experience a proper cross-functional hackathon team&lt;/li&gt;
&lt;li&gt;Had a laugh, at my own expense&lt;/li&gt;
&lt;li&gt;Got to see some viable projects that could benefit the initial brief&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>planning</category>
      <category>gamedev</category>
      <category>webdev</category>
      <category>hackathon</category>
    </item>
    <item>
      <title>Tailwind, My Altered Opinion</title>
      <dc:creator>Kieran Venison</dc:creator>
      <pubDate>Sun, 31 Dec 2023 22:10:26 +0000</pubDate>
      <link>https://dev.to/kieranmv95/tailwind-my-altered-opinion-1of3</link>
      <guid>https://dev.to/kieranmv95/tailwind-my-altered-opinion-1of3</guid>
      <description>&lt;p&gt;When Tailwind first emerged on the web development scene, I found myself firmly rooted in my comfort zone, relying on familiar practices and tools. As someone who wasn't an avid user of many frameworks, I typically stuck to a minimalistic approach, often implementing a reset like Meyerweb or resorting to the well-established Bootstrap when the need arose. Tailwind, with its extensive list of classes, initially struck me as overwhelming and cluttered—an apparent departure from the simplicity I had grown accustomed to. Perhaps it was a reluctance to embrace change or an attachment to my existing workflow that fueled my initial skepticism. However, as time passed, so did my perspective. Join me as I unravel the factors that prompted a shift in my opinions and ultimately led me to reconsider this dynamic framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  First Opinion
&lt;/h2&gt;

&lt;p&gt;When Tailwind first entered the web development scene, I found myself deeply entrenched in the practice of crafting everything from scratch. Bootstrap, at most, was a concession for minor components, particularly its grid system. Despite the availability of newer layout tools like Grid and Flex, I clung to Bootstrap's grid system, feeling a sense of control over my code. I was a practitioner of the BEM CSS methodology, believing in its ability to maintain cleanliness and organisation in my class names.&lt;/p&gt;

&lt;p&gt;However, the arrival of Tailwind felt like a bombardment of class names, an assault on the meticulous structure I had painstakingly built. The HTML files seemed to burst at the seams with a myriad of class names, a sight that was particularly disconcerting if you adhered to ESLint rules restricting line width to 120 characters or something similar. While I couldn't deny the visually stunning creations people achieved with Tailwind, I couldn't reconcile the idea of sacrificing the clarity of my HTML for such results. It felt as though the framework demanded a compromise that other tools didn't.&lt;/p&gt;

&lt;p&gt;In my initial encounter, I conducted only a cursory trial, swiftly dismissing Tailwind for both personal and project use. My dismissal extended to fervent discussions with friends and colleagues, showcasing a degree of inflexibility that, in hindsight, reflected my limited development experiences at the time. Back then, my approach was rooted in the belief that if I didn't fully understand something or the reasons behind its design, it couldn't possibly be beneficial. Little did I realise that this stance marked a significant rookie mistake—one that, over time, I would come to reassess and rectify. Ah, the sting of hindsight.&lt;/p&gt;

&lt;h2&gt;
  
  
  When did I start realising it might be the right technology?
&lt;/h2&gt;

&lt;p&gt;Admittedly, my initial resistance to Tailwind persisted for quite some time. I held onto my skepticism, unconvinced of its merits, and continued to voice my reservations against it. It wasn't until I noticed a growing trend—Tailwind becoming an integrated option in popular CLIs like Create React App (CRA) and NextJS, that I started to entertain the idea of giving it a second chance.&lt;/p&gt;

&lt;p&gt;Around this time, a significant shift had occurred in my approach. I had broken free from Bootstrap's influence, no longer relying on it for my grid systems. Instead, I invested time in comprehending the nuances of Flex and Grid, allowing me to craft elegant and minimal code for my layouts. It felt liberating, aligning with my vision of authoring all my code independently, free from frameworks or constraint, or so I thought.&lt;/p&gt;

&lt;p&gt;However, as I immersed myself in crafting everything from scratch, I couldn't ignore the shortcomings of my previous CSS approach. Each project I worked on exhibited common issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Boilerplate Overload&lt;/strong&gt;: A surplus of repetitive, boilerplate code that felt like unnecessary baggage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isolated Understanding&lt;/strong&gt;: Code that could only be truly deciphered by myself, creating hurdles for collaboration within a team.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inconsistent Standards&lt;/strong&gt;: Projects that failed to conform to what I considered my established (and undocumented) standards when another developer touched them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limited Contribution&lt;/strong&gt;: Maintenance and updates were solely my responsibility, lacking the collective vigilance of a team to ensure accessibility and identify potential bugs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These realisations prompted a reconsideration of my coding philosophy. Was complete autonomy truly the epitome of efficiency, or had I been overlooking the benefits of a more collaborative and standardised approach? The answers lay in exploring Tailwind with a renewed perspective.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Do I Use It Now, and How Has My Opinion Changed
&lt;/h2&gt;

&lt;p&gt;Over time, my perspective on Tailwind has undergone a significant transformation. While remnants of my initial reservations persist, I've embraced a hybrid approach, blending elements of the old and new. As evident on my personal website built with Next.js and Tailwind, I've managed to reduce my custom CSS to a mere 50 lines.&lt;/p&gt;

&lt;p&gt;Comparing it to the V1 of my personal site, which boasted over a thousand lines of CSS, the efficiency of Tailwind is evident. The framework selectively pulls only the required CSS, eliminating the need for unnecessary helper classes during build. The result is a visually enhanced site with a substantially smaller footprint, fostering a developer-friendly environment. Collaboration becomes seamless, as other developers can glean insights into my styling setup by referencing the Tailwind config and documentation.&lt;/p&gt;

&lt;p&gt;However, some aspects of my initial stance remain unaltered, notably my aversion to cluttered HTML with an abundance of class names. Despite the apparent visual chaos, I've come to appreciate the verbosity of Tailwind's approach, it may look overwhelming, but it provides immediate clarity on functionality. A compromise I've made is abstracting complex class combinations into CSS classes, employing the @apply keyword to maintain readability. This not only adheres to methodologies like BEM but also results in cleaner HTML structures.&lt;/p&gt;

&lt;p&gt;In essence, Tailwind has become an indispensable tool in my web development arsenal, not just for its efficiency but also for the adaptability it offers. The evolution of my opinion mirrors the dynamic nature of the web development landscape, emphasising the importance of embracing change and reevaluating assumptions for continual growth.&lt;/p&gt;

&lt;p&gt;Below is an example of employing the @apply lkeyword to abstract some of tailwinds larger class combinations into a css filer and removing it from your HTM/JSX&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Link&lt;/span&gt;
    &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`blog/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hover:underline grid border border-primary border-t-0 border-l-2 border-r-0 border-b-0 pl-4 md:border-none md:pl-0 md:block&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;span&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text-primary md:mr-2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;prettyDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;))}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/span&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`blog/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;span&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;link__date&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;prettyDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;))}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/span&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.link&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;@apply&lt;/span&gt; &lt;span class="py"&gt;hover&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;underline&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt; &lt;span class="n"&gt;border&lt;/span&gt; &lt;span class="n"&gt;border-primary&lt;/span&gt; &lt;span class="n"&gt;border-t-0&lt;/span&gt; &lt;span class="n"&gt;border-l-2&lt;/span&gt; &lt;span class="n"&gt;border-r-0&lt;/span&gt; &lt;span class="n"&gt;border-b-0&lt;/span&gt; &lt;span class="n"&gt;pl-4&lt;/span&gt; &lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;border-none&lt;/span&gt; &lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;pl-0&lt;/span&gt; &lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.link__date&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;@apply&lt;/span&gt; &lt;span class="err"&gt;text-primary&lt;/span&gt; &lt;span class="py"&gt;md&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;mr-2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In conclusion, my journey with Tailwind has seen a notable shift in perspective. Initially resistant to its extensive class naming, I reconsidered its value as major tools like CRA and Next.js integrated it. Breaking away from Bootstrap and crafting custom layouts allowed me to appreciate Tailwind's efficiency in minimising CSS. While still disliking cluttered HTML, I've embraced Tailwind's verbosity for its immediate clarity. Adopting a hybrid approach, I now use Tailwind for its adaptability, reducing custom CSS and fostering a more developer-friendly environment. The evolution of my opinion highlights the importance of embracing change in the ever-dynamic realm of web development.&lt;/p&gt;

</description>
      <category>tailwindcss</category>
      <category>webdev</category>
      <category>programming</category>
      <category>opinion</category>
    </item>
    <item>
      <title>Supercharge your morning routine</title>
      <dc:creator>Kieran Venison</dc:creator>
      <pubDate>Sat, 06 Feb 2021 05:50:14 +0000</pubDate>
      <link>https://dev.to/kieranmv95/supercharge-your-morning-routine-59kg</link>
      <guid>https://dev.to/kieranmv95/supercharge-your-morning-routine-59kg</guid>
      <description>&lt;h3&gt;
  
  
  Intro
&lt;/h3&gt;

&lt;p&gt;In the last 2 months I have started trying to grow on &lt;a href="https://twitter.com/kieranmv95" rel="noreferrer noopener"&gt;Twitter&lt;/a&gt;, created a &lt;a href="https://www.youtube.com/channel/UCxX-3WG1vKNVJjGi2mwRziQ" rel="noreferrer noopener"&gt;YouTube&lt;/a&gt; account and actively post videos. I started learning serverless framework, changed jobs, worked on my side projects and still have time to do the things I enjoy, but how have I done it? I supercharged my morning routine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Its not just the morning
&lt;/h2&gt;

&lt;p&gt;It's funny how I call this the morning routine when the evening routine plays such a critical part in the making the morning work.&lt;/p&gt;

&lt;p&gt;Before we can talk about the morning routine we need to talk about the evening routine and more importantly, sleep! I recently watched Matthew Walkers &lt;a href="https://www.masterclass.com/classes/matthew-walker-teaches-the-science-of-better-sleep" rel="noreferrer noopener"&gt;MasterClass on sleep&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this masterclass he covers the ins and outs of sleep and why it's so important and how to do it right. And I realised, like a lot of people, I had been neglecting my sleep by being very inconsistent. I used to wake for work at 6/6.30 and go to bed anywhere between 10 and 12. Then at weekends I would wake up at 9 and go to bed anywhere between 11 - 1am. A lot of people are the same, they have a schedule through the week then it goes out of the window at weekend.&lt;/p&gt;

&lt;p&gt;Weekend is when people "catch up" on their sleep debt (which actually isn't effective at all). I found that on Sunday evening going to sleep for work on Monday was always my worst nights sleep, I was much more restless than any other night of the week. And it was all to do with my sleep consistency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fixing my sleep
&lt;/h2&gt;

&lt;p&gt;Fixing sleep consistency. The first step towards powering up my morning routine was fixing my sleep consistency. To do this I now follow a strict evening plan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No caffeine after midday - Caffeine has a half life of approximately 8 hours, so if I have a cup of coffee at 4pm its like waking up at midnight to drink half a cup of coffee, When you think of it like this its pretty clear to imagine the impact it has on your sleep&lt;/li&gt;
&lt;li&gt;no screens after 9pm, stop that evil blue light keeping you up. Ideally this could be earlier but this seems to be working for now.&lt;/li&gt;
&lt;li&gt;In bed at 9.30pm and reading until a cutoff of 10, then its sleeping mask on, I find reading naturally helps me wind down.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Consistency is key
&lt;/h2&gt;

&lt;p&gt;The next bit is setting a consistent morning time. So I wake up at 5am every morning, it was very very hard at first. Naturally you may not be a morning person, so don't try and force yourself to do this if its not in your bodies best interest. just set a consistent time that suits you.&lt;/p&gt;

&lt;p&gt;The key thing here is consistency, bed at the same time, wake up at the same time. This means weekends too. I follow the same evening patterns and the same morning patterns as much as I possibly can.&lt;/p&gt;

&lt;h2&gt;
  
  
  The morning routine
&lt;/h2&gt;

&lt;p&gt;Now the bit that has made me so much more productive and given me time to do a lot more thing. Building your morning routine!&lt;/p&gt;

&lt;p&gt;I wake up, and just get up. It's hard sometimes and you want to hit snooze or lay just that extra minute.... resist. I leave my clothes by the side of the bed the evening before so I can step out of bed, grab my clothes go to the bathroom and get ready.&lt;/p&gt;

&lt;p&gt;Do things to make it easier for yourself, change your heating timing to come on before you wake up so you are not tempted to stay in bed whilst the house warms up!&lt;/p&gt;

&lt;p&gt;Once I'm dressed and ready to go I come downstairs have a quick glass of water then get the dog ready and go out for a walk. Before I had the the dog I would just go out for a walk anyway. This is amazing (especially at 5am). Its so quiet, just a nice peaceful walk to wake you up and make sure your active before you start your day, it really clears your mind. Usually this brings me to around 5.30/5.40 when I get back home.&lt;/p&gt;

&lt;p&gt;When I get back home I can spend some time planning out my day, but first I make a nice cup of coffee and a bit of breakfast. To plan my day I use &lt;a href="https://todoist.com/" rel="noreferrer noopener"&gt;todoist&lt;/a&gt;. And I wrap up my days plan in there. usually its a simple list with categories and subtasks&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.kieranvenison.co.uk%2Fstatic%2F6695e33ab8779a90694ce3548b3dc0a6%2F17d12%2Ftodoist.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.kieranvenison.co.uk%2Fstatic%2F6695e33ab8779a90694ce3548b3dc0a6%2F17d12%2Ftodoist.png" alt="todoist plan"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once that's done I will complete any of the tasks I can right away so I can forget about them for the rest of the day, such as taking the bins out and throwing some washing in, or writing  a script for a YouTube video. And then I do the rest through the day when I find the time.&lt;/p&gt;

&lt;p&gt;The good thing with planning things out before the clock has even hit 6am means that I never suffer that late rushed to work feeling where everything is chaos. Every day I sit down at my desk to start working I know what I need to get completed that day.&lt;/p&gt;

&lt;p&gt;Now you may spend the rest of your morning before shooting off to work executing the plan you have made above. I tend to create the plan, do a few tasks off it in the morning and then spend some time learning something.&lt;/p&gt;

&lt;p&gt;At this point you have had food and drink, had a walk and planned out your day, so by now, your wide awake. Good time to pick up some new skills, I usually spend 30ish minutes on &lt;a href="https://www.pluralsight.com/" rel="noreferrer noopener"&gt;PluralSight&lt;/a&gt; or &lt;a href="https://frontendmasters.com/" rel="noreferrer noopener"&gt;FrontendMasters&lt;/a&gt; just looking into some new tech. And its proven that if you nail down the consistent sleep stuff we talked about earlier, this stuff will stick in your memory much much better!&lt;/p&gt;

&lt;p&gt;And thats how I supercharged my morning routine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to bed at the same time&lt;/li&gt;
&lt;li&gt;Wake up at the same time&lt;/li&gt;
&lt;li&gt;get some fresh air&lt;/li&gt;
&lt;li&gt;have a coffee and some breakfast&lt;/li&gt;
&lt;li&gt;plan the day&lt;/li&gt;
&lt;li&gt;execute the plan&lt;/li&gt;
&lt;li&gt;learn something&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that, in a nutshell, is how I managed to create an active YouTube channel, learn new technologies and work on my side projects whilst changing jobs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about you?
&lt;/h2&gt;

&lt;p&gt;I would love to hear what you think of my advice! How do you supercharge your mornings?&lt;/p&gt;

&lt;p&gt;Check out this post on &lt;a href="https://www.kieranvenison.co.uk/blog/articles/2021/february/supercharge-your-morning-routine/" rel="noopener noreferrer"&gt;my website&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>routine</category>
      <category>habits</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
