<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>iamsteve • RSS feed</title>
    <link>https://iamsteve.me</link>
    <description>A blog by Steve McKinney about the design and build of websites. Bridging the gap between your design tool and code, with a focus on typography, CSS and visual craft.</description>
    <language>en-gb</language>
    <lastBuildDate>Fri, 10 Apr 2026 20:39:59 GMT</lastBuildDate>
    <atom:link href="https://iamsteve.me/feed.xml" rel="self" type="application/rss+xml"/>
    
    <item>
      <title>Spring cleaning</title>
      <link>https://iamsteve.me/notes/spring-cleaning</link>
      <guid isPermaLink="true">https://iamsteve.me/notes/spring-cleaning</guid>
      <pubDate>Sun, 29 Mar 2026 12:00:00 GMT</pubDate>
      <description>A roundup of under the hood improvements I&apos;ve made to the site recently.</description>
      <content:encoded><![CDATA[<p>I’ve made a conscious effort since starting this notes section at the turn of the year to work on some design improvements.</p>
<p>There’s a lot of papercuts, general polish required and and endless list of things to make better as my opinions have evolved since this current design was released in early 2024 and a lot of stuff I just didn’t get to.</p>
<h2>Tailwind v4 and dark mode</h2>
<p>At the start of the year I upgraded to v4 of tailwind and added dark mode. This was a bit of an effort over months prior. I’ve purposely kept it simple in regards to not having a theme toggle.</p>
<p>I decided this as I added dark mode to my portfolio with a toggle and it just felt like a faff. And I knew it would be more painful on this website.</p>
<p>So I opted for using <code>light-dark</code> and creating a bunch of tokens.</p>
<pre><code class="language-css">--color-heading: light-dark(var(--color-fern-1100), var(--color-fern-0));
--color-body: light-dark(var(--color-fern-1100), var(--color-fern-200));
--color-body-80: light-dark(
  oklch(from var(--color-fern-1100) l c h / 0.8),
  oklch(from var(--color-fern-300) l c h / 0.8)
);
</code></pre>
<p>A few tokens really carried things quite far in regards to text. But the challenge lay with the ‘surfaces’, anything that had a background. I’ve experimented in the past with a layer kind of approach. I’m not sure I like it totally, but it’s ok for now.</p>
<pre><code class="language-css">--color-canvas-light: var(--color-neutral-01-150);
--color-canvas-dark: var(--color-fern-1300);
--color-canvas: light-dark(var(--color-canvas-light), var(--color-canvas-dark));

--color-surface: light-dark(
  rgb(255 255 255),
  color-mix(in oklch, var(--color-fern-1100), transparent 70%)
);
--color-surface-02: light-dark(
  var(--color-neutral-01-50),
  color-mix(in oklch, var(--color-fern-900), transparent 60%)
);
--color-surface-03: light-dark(
  var(--color-neutral-01-50),
  color-mix(in oklch, var(--color-fern-900), transparent 50%)
);
--color-surface-04: light-dark(
  var(--color-neutral-01-50),
  color-mix(in oklch, var(--color-fern-900), transparent 10%)
);
</code></pre>
<p>It definitely needs refining further as I have noticed some contradictions, but things are ok.</p>
<h2>Moving to Content Collections</h2>
<p>The most significant change was <strong>migrating from Contentlayer to Content Collections</strong>. Contentlayer hasn&#39;t been actively maintained for a long time and it’s one of those things in the back of your mind you know is going to break at some point.</p>
<p>I upgraded Next.js to 16.1 but that broke a lot of stuff. I reverted and left it. I’m not sure it was all <a href="https://github.com/contentlayerdev/contentlayer">Contentlayer</a> but that spurred me to do so. Alongside that, I upgraded Next.js to 16.2 and there’s been no issues.</p>
<p>Previously, I tried to move to <a href="https://github.com/zce/velite">Velite</a>, but that didn’t work mostly due to the way post images are handled. So it’s nice <a href="https://github.com/sdorra/content-collections">Content Collections</a> was a more like for like replacement.</p>
<h2>Post layout improvements</h2>
<p>One of the things that bugged me for a good while was the post layout. I’ve changed things up slightly.</p>
<p>For larger screens you had the table of contents on the right, it’s now on the left. I also managed to get it to feel better when scrolling with scroll driven animations.</p>
<pre><code class="language-css">.toc * {
  animation: toc-blur-scroll linear both;
  animation-timeline: view();
}

@keyframes toc-blur-scroll {
  0% {
    filter: blur(12px);
    opacity: 0;
  }
  10%,
  95% {
    filter: blur(0);
    opacity: 1;
  }
  100% {
    filter: blur(24px);
    opacity: 0;
  }
}
</code></pre>
<p>Scroll driven animations are a real nice addition—which allowed me to blur the contents on entrance and exit at different rates.</p>
<p>Whilst the code is simple, it’s a new concept to get my head around. By setting <code>animation-timeline</code> to <code>view()</code> it says you want the <code>@keyframes</code> to apply based on the visibility of the element whether it’s in <code>view()</code>. Essentially, between 10% and 95% of the viewport the element will not be blurred.</p>
<p>It’s cleaned up the code from having a janky masking implementation blurring the scroll bar to something with a more seamless feel.</p>
<h2>Syntax highlighting</h2>
<p>I replaced Prism with <a href="https://shiki.style/">Shiki</a> for syntax highlighting. Initially, I didn’t have the best impression of Shiki because I misunderstood the control you got and how theming worked.</p>
<p>With the help of Claude I was able to move to Shiki and update every code block and improve upon everything I was trying to achieve with Prism previously.</p>
<h3>What’s improved?</h3>
<ol>
<li>Light and dark themes</li>
<li>Handling of line numbers with scrolling</li>
<li>General code block design (title, line highlighting, copy button, etc.)</li>
<li>Additional features like diffing, word highlighting, warnings, etc.</li>
<li>Fixed Tailwind&#39;s <code>@theme</code> directive highlighting</li>
</ol>
<h2>Notes improvements</h2>
<p>The notes section has an improved design. I’ll continue to iterate here but I’m happier with it. I’ve added a couple of unique things to notes like lightbox with zoom panning for touchscreens, a chat bubble component and probably some other stuff.</p>
<h2>Bug fixes</h2>
<ul>
<li>Fixed mobile nav not closing on route change</li>
<li>Fixed heading link icon alignment and scroll margin</li>
<li>Preserved straight quotes in chat blocks by running smartypants before the chat remark plugin</li>
<li>Quite a few things in regards to maintainability that I overlooked whilst adding a dark mode</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Have LLM’s finally cracked smart quotes?</title>
      <link>https://iamsteve.me/notes/have-llms-finally-cracked-smart-quotes</link>
      <guid isPermaLink="true">https://iamsteve.me/notes/have-llms-finally-cracked-smart-quotes</guid>
      <pubDate>Fri, 13 Mar 2026 20:38:47 GMT</pubDate>
      <description></description>
      <content:encoded><![CDATA[<p>Spoiler: not in code contexts</p>
<p>When you write in your text editor or messaging app, it will likely change the quote to the correct one and do this for you across the OS. However with the advent of LLM assisted code, writing, etc. they have a habit in my experience of undoing them.</p>
<p>The reason this bugs me moreso than correctness is because smart/curly quotes are more stylised. It’s easy to spot in a design if you use them in larger headings as well as mixed in different blocks of content. If you have multiple people working on a project, some people typing in code, or directly into a CMS, some copy direct from the app, you’ll have a pretty inconsistent experience with quotes used.</p>
<p>You can be well intentioned and try to ensure you have the correct quote, but with LLM’s they work through the document and change them to dumb quotes.</p>
<p>I was writing this post with a different angle but I was using vscode the day before publishing and copilot tried to autocomplete some code I didn’t need and I noticed it had used the correct entity in the content it generated.</p>
<p>So this led me to think have LLM’s finally cracked it? This is by no means conclusive and the use cases are entirely different.</p>
<p>I asked Claude in a couple of situations.</p>
<div style="
    border: 1px solid #e5e5e5;
    border-radius: 12px;
    overflow: hidden;
    margin: 1.5em 0;
  ">
    <div style="text-align: center; padding: 8px; font-size: 0.85em; color: #888; border-bottom: 1px solid #e5e5e5;">Claude app (Opus 4.6)</div>
    <div style="padding: 12px; display: flex; flex-direction: column; gap: 6px;">
      <div style="text-align: right;">
    <span style="
      display: inline-block;
      max-width: 75%;
      padding: 6px 12px;
      border-radius: 16px;
      font-size: 1em;
      background: #007AFF; color: white; border-bottom-right-radius: 4px;
    ">Can you use ‘’ “” in a sentence</span>
  </div><div style="text-align: left;">
    <span style="
      display: inline-block;
      max-width: 75%;
      padding: 6px 12px;
      border-radius: 16px;
      font-size: 1em;
      background: transparent; color: #1c1c1e; border: 1px solid #d1d1d6; border-bottom-left-radius: 4px;
    "><p>Sure! Here’s a sentence using both single and double quotation marks:</p><p>She said, “I think the word ‘serendipity’ is underused.”</p><p>In British English, the convention is actually the reverse — single quotes for primary quotations, with double quotes nested inside:</p><p>She said, ‘I think the word “serendipity” is underused.’</p><p>Both systems work, but the single-outer/double-inner style is the standard British convention. Would you like to know more about when to use each?</p></span>
  </div>
    </div>
  </div>

<p>Opus in app gets it, however, Claude Code and Raycast don’t. Their use cases are very different but considering code is a big way they interact with our code. I wish they treated them the same. Or maybe it’s how the app itself encodes the output or something beyond my comprehension?</p>
<div style="
    border: 1px solid #e5e5e5;
    border-radius: 12px;
    overflow: hidden;
    margin: 1.5em 0;
  ">
    <div style="text-align: center; padding: 8px; font-size: 0.85em; color: #888; border-bottom: 1px solid #e5e5e5;">Claude Code (Opus 4.6)</div>
    <div style="padding: 12px; display: flex; flex-direction: column; gap: 6px;">
      <div style="text-align: right;">
    <span style="
      display: inline-block;
      max-width: 75%;
      padding: 6px 12px;
      border-radius: 16px;
      font-size: 1em;
      background: #007AFF; color: white; border-bottom-right-radius: 4px;
    ">Can you use ‘’ “” in a sentence</span>
  </div><div style="text-align: left;">
    <span style="
      display: inline-block;
      max-width: 75%;
      padding: 6px 12px;
      border-radius: 16px;
      font-size: 1em;
      background: transparent; color: #1c1c1e; border: 1px solid #d1d1d6; border-bottom-left-radius: 4px;
    "><p>Sure — here's an example using all four curly quote characters:</p><p>- Left single quote ( ' ): 'Hello</p><p>- Right single quote ( ' ): Hello'</p><p>- Left double quote ( " ): "Hello</p><p>- Right double quote ( " ): Hello"</p><p>In a sentence:</p><p>"I've always thought 'curly quotes' look better," she said.</p><p>- " opens the outer quote</p><p>- I've uses ' (right single) as an apostrophe</p><p>- 'curly quotes' uses ' and ' for inner single quotes</p><p>- " closes the outer quote</p></span>
  </div>
    </div>
  </div>

<h2>It doesn’t work with AGENTS.md or CLAUDE.md</h2>
<p>You could add to either of these docs the guidance on how to use quotes, dashes, ellipsis—down to the specific HTML entities—and it will ignore them in my experience.</p>
<h2>Lint and GitHub action all the things</h2>
<p>However, you still need a solution. Thankfully AI can solve its own problem by creating a script and or Github Action relevant to your codebase.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Jevon’s paradox</title>
      <link>https://iamsteve.me/notes/jevons-paradox</link>
      <guid isPermaLink="true">https://iamsteve.me/notes/jevons-paradox</guid>
      <pubDate>Thu, 12 Mar 2026 21:01:55 GMT</pubDate>
      <description>There’s a strong bias towards just a little more.</description>
      <content:encoded><![CDATA[<p>By no means a unique thought, but something I’m feeling that many are experiencing too. There’s a strong bias towards just a little more. Tweak this tweak that. Oh what about this idea. When you’re building things with Claude Code at your disposal. </p>
<blockquote>
<p>In economics, the Jevons paradox, or Jevons effect, is said to occur when technological improvements that increase the efficiency of a resource&#39;s use lead to a rise, rather than a fall, in total consumption of that resource.<a href="https://en.wikipedia.org/wiki/Jevons_paradox">^1</a></p>
</blockquote>
<p>Rather than take the most efficient path to complete your idea you end up adding more to the scope. </p>
<p>I’ve been finding that there’s always that little bit more you can do. The ideas just get more ambitious as the request you give succeeds. </p>
<p>However, I’m finding it fun and I wonder what my design workflow will look like in the next 6 months? There’s so much change and stuff going on in this space I am just going with the flow. </p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Pages within pages</title>
      <link>https://iamsteve.me/notes/pages-within-pages</link>
      <guid isPermaLink="true">https://iamsteve.me/notes/pages-within-pages</guid>
      <pubDate>Mon, 23 Feb 2026 20:31:44 GMT</pubDate>
      <description></description>
      <content:encoded><![CDATA[<p>A pattern I&#39;ve noticed is what feels like pages within pages. These seemingly contain a large amount of information expanding upon a section within a page.</p>
<p>I first noticed it with Apple products. The example here builds upon the processor section in more detail.</p>
<figure style="margin: 2em 0;"><img src="/images/notes/pages-within-pages-apple.png" alt="Apple M5 processor section" style="max-width: 100%; height: auto;" />
<img src="/images/notes/pages-within-pages-apple.png" alt="Apple M5 processor section" width="3456" height="2068" style="max-width: 100%; height: auto;" />
<figcaption style="margin-top: 0.5em; font-style: italic; color: #666;">Apple M5 processor section</figcaption>
</figure>

<p>My initial impressions is it&#39;s a bit of an app crossover to retain context within the initial page. You can browse a page, expand the detail, return back to where you were.</p>
<p>There&#39;s been two &quot;high-profile&quot; examples recently from Stripe and Linear which do similarly.</p>
<div className="flex gap-4">
  <figure style="margin: 2em 0;"><img src="/images/notes/pages-within-pages-linear.png" alt="Linear Intake page" style="max-width: 100%; height: auto;" />
  <img src="/images/notes/pages-within-pages-linear.png" alt="Linear Intake page" width="3456" height="2068" style="max-width: 100%; height: auto;" />
  <figcaption style="margin-top: 0.5em; font-style: italic; color: #666;">Linear Intake page</figcaption>
  </figure>

  <figure style="margin: 2em 0;"><img src="/images/notes/pages-within-pages-stripe.png" alt="Stripe payments information" style="max-width: 100%; height: auto;" />
  <img src="/images/notes/pages-within-pages-stripe.png" alt="Stripe payments information" width="3456" height="2068" style="max-width: 100%; height: auto;" />
  <figcaption style="margin-top: 0.5em; font-style: italic; color: #666;">Stripe payments information</figcaption>
  </figure>
</div>

<p>Pages are striving to be succinct as possible because of attention spans and reality. But there&#39;s always the nagging feeling of &quot;I&#39;m not representing this feature as to its full extent as it is&quot;. And using this design pattern to expand on things is how it comes to be. I know I&#39;ve relied on this in more sales focused journeys not wanting to overwhelm the customers.</p>
<p>But this as a pattern feels like it&#39;s inspired by Notion and similar apps. You pop in and out of content rows, edit a bit, return to your database. Pages within pages in Notion feel a seamless pattern whether that is a popover or navigating through.</p>
<figure style="margin: 2em 0;"><img src="/images/notes/pages-within-pages-notion.png" alt="Notion" style="max-width: 100%; height: auto;" />
<img src="/images/notes/pages-within-pages-notion.png" alt="Notion" width="3456" height="2068" style="max-width: 100%; height: auto;" />
<figcaption style="margin-top: 0.5em; font-style: italic; color: #666;">Notion's pages within pages — a database row expanding into a page</figcaption>
</figure>

<p>I do agree with the sentiment it probably should be a page. However, the behaviour on the web isn’t standardised and there is such an unpredictability in some interactions that it probably doesn’t matter? Who knows whether you’ll go to a new page, open a new window or open a modal. Not that I agree with that, but it’s the reality.</p>
<p>To add to this as well, we have good support for View Transitions and that is blurring the lines between what is and isn’t a page change.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Anything to avoid a CMS</title>
      <link>https://iamsteve.me/notes/anything-to-avoid-a-cms</link>
      <guid isPermaLink="true">https://iamsteve.me/notes/anything-to-avoid-a-cms</guid>
      <pubDate>Fri, 20 Feb 2026 19:44:59 GMT</pubDate>
      <description></description>
      <content:encoded><![CDATA[<p>I’ve had this website quite a while in a flat file system now. But there’s always a bit of friction when publishing something. As you have to write in a file, commit and push.</p>
<p>It’s not big a deal, but depending on your setup you may have different quantities of frontmatter to contend with.</p>
<p>However, a CMS isn’t all that better. You still have much of the faff, but it looks a bit different. And with a CMS I’ve not seen one replicate the niceties of writing in iA Writer. Be it on a computer or phone.</p>
<p>In effect not much changes. Some of the tedious publishing workflow remains with file based but with better version control.</p>
<p>However, one thing I’ve discovered with Claude Code is automating that process with GitHub Actions.</p>
<p>It’s not particularly easy when some things for your website are bespoke. But chucking AI at it makes it easy.</p>
<p>With my publishing workflow I’ve managed to be able to create an action. I create a new note in the correct folder in my repo I can push this up to GitHub the action will run. Add necessary frontmatter, slugify the file name if needs be and publish for me.</p>
<p>In theory this is the least friction to writing I’ve found. The remaining tedium is committing it to git, making sure I’m on a branch then opening a pull request.</p>
<p>It should make publishing from my phone easier. This note is an attempt to test this.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Articles available in markdown</title>
      <link>https://iamsteve.me/notes/articles-available-in-markdown</link>
      <guid isPermaLink="true">https://iamsteve.me/notes/articles-available-in-markdown</guid>
      <pubDate>Wed, 21 Jan 2026 19:27:59 GMT</pubDate>
      <description>It’s possible an LLM might find it useful, or yourself.</description>
      <content:encoded><![CDATA[<p>Traffic has been in steady decline on this website. It’s easy to see why the content isn’t fresh and I don’t post frequently enough. Something feels different though.</p>
<p>There is the effect of AI now, that’s driving how we consume things, share things, put in the effort to learn or do things. I’ve certainly noticed the change in how I browse for solutions.</p>
<p>Combined with Googling being worse, which isn’t a revelation. It’s encouraged the worst in how to create a website. And that has swayed my opinion on how we’re going to find things.</p>
<p>This combined with seeing things around making your website easier to access for LLM’s in markdown feels like the next wave of “SEO”.</p>
<p>There’s nothing to gain or lose from this, as everything is available to the public on <a href="https://github.com/stevemckinney/iamsteve">Github</a>. Anyway, I’ve written this to say: articles on this website can be viewed in Markdown by adding <code>.md</code> to the end of a URL.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Notes = frequency?</title>
      <link>https://iamsteve.me/notes/notes-frequency</link>
      <guid isPermaLink="true">https://iamsteve.me/notes/notes-frequency</guid>
      <pubDate>Wed, 21 Jan 2026 06:43:11 GMT</pubDate>
      <description>A place for things outside of design and code focused articles.</description>
      <content:encoded><![CDATA[<p>It’s been on my mind for a little while if it’s worth just having an open stream of consciousness to ‘blog’. I’ve liked what <a href="https://chriscoyier.net/">Chris Coyier</a>, <a href="https://daverupert.com/">Dave Rupert</a> and <a href="https://lmnt.me">Louie Mantia</a> do in the sense they post what they want and share their interests. Then there’s what <a href="https://maggieappleton.com/">Maggie Appleton</a> and <a href="https://gomakethings.com/">Chris Ferdinandi</a> have with the digital garden.</p>
<h2>Building a more evergreen website</h2>
<p>I’ve been thinking of expanding in different areas of this website since redesigning back in 2024.</p>
<p>The direction is set around web design craft and seeing the digital garden approach this has allowed me to shift my mindset a bit. I can still do this by having the “/blog”, as I see this as the reason people visit or articles are indexed. But I want to allow myself more freedom with notes.</p>
<h3>Expanding beyond blog posts</h3>
<p>I want to build out different areas, I have an idea for a “letterforms” section, or rather a more typography focused section. I’d like to use this as a way to explore typography, through pairings and anatomical features.</p>
<p>Type design trends come and go also, but this will be a growing collection. It’ll be “typewolf-esque”, but I want to add my own spin.</p>
<h3>My own “gallery” and “collectibles”</h3>
<p>I’d like to use this notes section to post design practice, which can fuel ideas for blog posts or to build out a “patterns” section.</p>
<p>I want it to almost be a place where I collect things and be kind of fun. I started this with <a href="/collections"> Collections</a> for a link library. I intend to build upon this further as I&#39;ve been prototyping some ideas.</p>
<p>Let’s see where I go with this.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Using analytics again with simple analytics</title>
      <link>https://iamsteve.me/blog/using-analytics-again-with-simple-analytics</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/using-analytics-again-with-simple-analytics</guid>
      <pubDate>Mon, 10 Mar 2025 12:43:42 GMT</pubDate>
      <description>I was seeing an increase in my ‘serverless’ usage and it didn’t make sense. So I decided to add Simple Analytics and wanted to share a review of this privacy focused service.</description>
      <content:encoded><![CDATA[<p>I want to write about my experience adding an analytics script back to this website with <a href="https://www.simpleanalytics.com">Simple Analytics</a>.</p>
<h2>TLDR</h2>
<p><strong>I needed to figure out why my usage was going up dramatically on Netlify</strong>. I didn’t want a complex solution, I wanted to get a sense of the number of visits and where if any additional traffic was coming from with a privacy focus. I didn’t want to pay. All which Simple Analytics meets.</p>
<figure>
  <figure style="margin: 2em 0;">
    <img src="/images/blog/0177-simple-analytics-06.png" alt="" width="800" height="480" style="max-width: 100%; height: auto;" />
    <img src="/images/blog/0177-simple-analytics-05.png" alt="" width="800" height="480" style="max-width: 100%; height: auto;" />
  <figcaption style="margin-top: 0.5em; font-style: italic; color: #666;">Simple Analytics light and dark theme</figcaption><p style="font-size: 0.9em; color: #666; font-style: italic;">Toggle between options on the website for comparison</p></figure>
  <figcaption><p><strong>Fig. 1</strong> See what Simple Analytics looks like in light and dark theme.</p></figcaption>
</figure>

<h2>What prompted the need for analytics</h2>
<p>With the move to Next.js and “serverless” hosting services, there’s always the potential for an increase in your bill.</p>
<p>And at the time my Netlify function invocations suddenly started creeping up and eventually going over the plan limit.  On contacting support I found out that there were changes to the way was now calculating function invocations.</p>
<p>I did believe a view counter on posts was enough of an indicator for. I have had this in place for the majority of the lifetime of this website. I use it to sort popular posts on the homepage. And there was nothing out of the ordinary.</p>
<p>But to rule out anything irregular, I figured adding analytics would be useful to see if I was getting traffic from somewhere unexpected.</p>
<h2>Searching for a simple privacy based solution</h2>
<p>Over the years I’ve used different analytics solutions on this website in aim of avoiding Google Analytics—from Gauges to GoSquared. Eventually, I gave up around the time GDPR stuff set in place.</p>
<p>But to be able to go forward with this it needed to be privacy focused.</p>
<h2>Simple Analytics respects the user whilst giving me a good idea of the data</h2>
<p>The feature set is simple in comparison to Google Analytics, but this is true of privacy focused services in this space. I didn’t have many requirements other than getting an idea of page views and referrers. This allows me to see how articles are picking up and understanding the source of traffic.</p>
<p><strong>The features which are important to me</strong></p>
<ul>
<li>No need for a cookie banner</li>
<li>Respects user preferences like do not track</li>
<li>Visitors and page views</li>
<li>Referring traffic</li>
<li>Session length</li>
<li>Bots excluded by default</li>
</ul>
<p><strong>Other nice free features</strong></p>
<ul>
<li>Manage multiple sites (up to 5)</li>
<li>Visibility of your dashboard</li>
<li>Email reports</li>
<li>Alert when the script is missing</li>
<li>Dark and light mode</li>
<li>Data import for Google Analytics</li>
</ul>
<h3>Free tier</h3>
<p>It has to be mentioned it’s free with a month of history, which is great. I would be happy to know the amount of visitors—everything else is a bonus.</p>
<h3>It’s simple to get started</h3>
<p>With simple analytics it’s like other services you drop in a script, get confirmation and you’re good to go.</p>
<h3>It’s simple to get updates</h3>
<p>I want to view my dashboard and not have to dig and click to get an idea what’s happening. As soon as I go into Simple Analytics I can get an overview of how my site is doing.</p>
<figure>
<img src="/images/blog/0177-simple-analytics-01.png" alt="" width="800" height="480" style="max-width: 100%; height: auto;" />

<figcaption><strong>Fig. 2</strong> Showing the glanceable data on loading your dashboard</figcaption>
</figure>

<h3>Managing multiple sites is easy</h3>
<p>Again, in addition to getting updates I was working on a website for one of my clients and there was no idea of the traffic levels.</p>
<p>And I went to my dashboard and had a site setup within minutes. It’s an unfair comparison but doing this with Google would take longer to setup.</p>
<blockquote>
<p>You can add up to 5 websites as part of the free plan.</p>
</blockquote>
<h3>Data accuracy appears to be good</h3>
<p>By default bots and things are excluded, it mentions that 95% of bots should be blocked. You can also enable advanced robot blocking as a paid user and I would assume that would get closer to the 100%.</p>
<figure>
<img src="/images/blog/0177-simple-analytics-04.png" alt="" width="800" height="480" style="max-width: 100%; height: auto;" />
<figcaption><strong>Fig. 3</strong> A view of my dashboard showing the data available</figcaption>
</figure>

<p>My previous experiences here with Google Analytics you have to configure yourself which is a pain. So it’s nice that the majority is covered.</p>
<p>I have trialled Netlify’s analytics as a free trial—which was $9 a month at the time—I wasn’t a fan of it as there was no control over the bots and being able to get any real insight.</p>
<p>You can’t expect total accuracy and no one should with the use of ad blockers.</p>
<h3>Email reports</h3>
<p>These reports depend on whether you choose between weekly and monthly. These give a quick overview which is easy to understand.</p>
<figure>
<img src="/images/blog/0177-simple-analytics-02.png" alt="" width="800" height="480" style="max-width: 100%; height: auto;" />
<figcaption><strong>Fig. 4</strong> What you receive by email</figcaption>
</figure>

<p>I can see this weeks traffic versus last weeks and whether there are any new referrers or not. This is handy when most of the time you’re not going to want to inspect much further than this.</p>
<h2>Respect for users privacy</h2>
<p>The core selling point of Simple Analytics is the privacy element. To understand what this is as there is a level of configuration, depending on what you value.</p>
<ul>
<li>Respecting adblockers and the ‘do not track’ directive</li>
<li>No need for cookies and IP addresses aren’t collected</li>
<li>Ability to set your dashboard to public additional transparency</li>
<li>Missing script notification</li>
</ul>
<h2>What’s kind of missing</h2>
<p>It’s difficult to critique a free independent service, as it doesn’t have to be free. But there’s a few additions I’d like to see, or maybe I’m missing them.</p>
<h3>Full referrer</h3>
<p>With referrers it doesn’t really cover the location it comes from exactly. You can see the website, but not the referring page. I imagine this may be a privacy restriction, but I am not sure.</p>
<h3>Browser version</h3>
<p>As creators of websites the browser split and versions are quite handy to understand your audience and level of browser support you offer. Whilst this isn’t as big of an issue as it was, I think it would be nice to see browser versions.</p>
<p>Browser version appears to be exposed within goals, so would be good to see it available within the analytics views.</p>
<h3>A few more metrics</h3>
<p>It may be missing some of what I would consider simpler metrics, such as exit and bounce.</p>
<h2>Finishing thoughts</h2>
<p>Overall, the service can meet some of the complex needs someone may require with features like goals, events and the API. You can depend on UTM to also be tracked. Even AI is available to summarise and give an opinion on your traffic.</p>
<p>But for my use case I need an idea of who is visiting and from where. If this suits your needs too then <a href="https://www.simpleanalytics.com">Simple Analytics</a> is for you.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Rules I follow when typesetting</title>
      <link>https://iamsteve.me/blog/rules-i-follow-when-typesetting</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/rules-i-follow-when-typesetting</guid>
      <pubDate>Mon, 10 Mar 2025 08:37:00 GMT</pubDate>
      <description>I’ve developed some habits over the years when it comes to the display of text in a design with the aim of readability and aesthetic balance. And it feels like it could be useful to document this.</description>
      <content:encoded><![CDATA[<p>When writing or typesetting a design, I have things I follow in terms of creating a good flow to the article or balance within a page. However, I always believe in pragmatism with rules like this as there are things out of your control, like screen size, varying content, etc.</p>
<p>It’s important to aim for the ideal, but not to the detriment of creating something unmaintainable.</p>
<p><strong>Here’s a breakdown</strong></p>
<ol>
<li>Line height is proportional to size</li>
<li>Letter spacing or tracking is proportional to size</li>
<li>Everything is sentence case</li>
<li>Everything is left aligned</li>
<li>Use the correct type of dash</li>
<li>Use the correct quotes</li>
<li>Hanging lists and punctuation</li>
<li>Avoid punctuating titles where possible</li>
<li>When emphasising, highlighting or linking text watch out for punctuation</li>
<li>Use paragraphs to create help rhythm</li>
<li>Avoid orphans and widows</li>
</ol>
<h2>Line height is proportional</h2>
<p>There’s a few things you can use to determine the line height for your type. It’s a balance between your text looking loose or readable.</p>
<ul>
<li>Font size</li>
<li>Line length</li>
<li>The proportions of the typeface (eg: baseline, cap height, x height)</li>
<li>Where you’re using the type</li>
<li>How often this needs to change</li>
<li>What control over the change you have</li>
</ul>
<p>For example, in a hero title you can afford to be precise with your line height but where components vary with the text within; you may find challenges.</p>
<p>Each of the items listed can impact your choice of line height.  For larger headings, a line height lower or closer to the font size can be ideal. Whereas paragraphs with a good measure can be around a more comfortable 1.5x the font size.</p>
<h3>Line length determines your line height</h3>
<p>It’s an important to use the length of your copy to determine your line height. The shorter the line length, the smaller the line height. The longer the line length, the larger the line height.</p>
<figure>
  <figure style="margin: 2em 0;">
    <img src="/images/blog/0176-typesetting-line-height-01.svg" alt="" width="864" height="540" style="max-width: 100%; height: auto;" />
    <img src="/images/blog/0176-typesetting-line-height-02.svg" alt="" width="864" height="540" style="max-width: 100%; height: auto;" />
  <figcaption style="margin-top: 0.5em; font-style: italic; color: #666;">Compare typesetting with and without leading</figcaption><p style="font-size: 0.9em; color: #666; font-style: italic;">Toggle between options on the website for comparison</p></figure>
  <figcaption><p><strong>Fig. 1</strong> A heading and paragraph require different line height due to their line length and size</p></figcaption>
</figure>

<p>This works for large and small type, as a readable measure still applies. It’s a fine balance because with shorter line lengths it can easily look like there’s too much space between each line and throw off your composition. But for longer line lengths if it’s too tight it will be difficult to read.</p>
<h3>Using baseline, cap height and x height</h3>
<p>These are the important proportions of a typeface to create balance when creating your text composition. Spacing is applied using the ‘box’ of the type across web and some design tools by default—I’ll get into this and <code>text-box-trim</code> shortly.</p>
<figure>
<img src="/images/blog/0176-typesetting-line-height-03.svg" alt="" width="864" height="540" style="max-width: 100%; height: auto;" />
<figcaption>
<strong>Fig. 2</strong> Shows cap height, x height and baseline and how those affect line height
</figcaption>
</figure>

<p>But first, let’s look at how you apply spacing. Doing so evenly between items will result in an awkward feel to the space because of how this line height works.</p>
<p>Using a combination of baseline, cap-height and x-height to choose your spacing will help create a better balance.</p>
<h3>Understanding the ‘half leading’ of CSS</h3>
<p>Half leading[^1] in the browser based world of design means that half of the line height is applied to the top and the bottom of your text box.</p>
<figure>
<img src="/images/blog/0176-typesetting-line-height-04.svg" alt="" width="864" height="540" style="max-width: 100%; height: auto;" />
<figcaption>
<p><strong>Fig. 3</strong> There are two examples of text here, a heading and paragraph</p>
</figcaption>
</figure>

<p>The heading’s box is more flush with the text, as there isn’t anything extra to be applied above and below. And this can change the way your spacing looks if not taken into account. The line height of the heading uses <code>0.9</code> or <code>90%</code> and the line height of the paragraph uses <code>1.5</code> or <code>150%</code>.</p>
<figure>
<img src="/images/blog/0176-typesetting-line-height-05.svg" alt="" width="864" height="540" style="max-width: 100%; height: auto;" />
<figcaption>
<p><strong>Fig. 4</strong> Markers comparing applied spacing values against their optical appearance</p>
</figcaption>
</figure>

<p>This used to be more of an issue in the days where you used Photoshop or Illustrator to design. But as Figma is now the industry standard, expectations between designers and developers around spacing are more aligned.</p>
<h4>Levelling it out with <code>text-box</code></h4>
<p>As of writing, the method to remove this through <code>text-box</code> trimming is gaining traction in terms of browser support[^2] with Safari and Chrome. It’s not quite ready for day to day, but as more users upgrade this should become more viable.</p>
<p>It’s available in Figma and Sketch albeit both have limited control compared to CSS. And I imagine once the usage aligns, they will dictate how it’s used as they don’t have the same extent.</p>
<p>This will be more of a thing of the past in the future[^3], but I am curious to see how <code>text-box-trim</code> changes how you design.</p>
<h2>Letter spacing or tracking is proportional</h2>
<p>Like line height, I don’t think you can apply a simple percentage rule to any typeface and call it a day for every design you do.</p>
<figure>
  <figure style="margin: 2em 0;">
    <img src="/images/blog/0176-typesetting-letter-spacing-01.svg" alt="Text with default leading" width="864" height="540" style="max-width: 100%; height: auto;" />
    <img src="/images/blog/0176-typesetting-letter-spacing-02.svg" alt="Text with increased leading" width="864" height="540" style="max-width: 100%; height: auto;" />
    <img src="/images/blog/0176-typesetting-letter-spacing-03.svg" alt="Text with increased leading" width="864" height="540" style="max-width: 100%; height: auto;" />
  <figcaption style="margin-top: 0.5em; font-style: italic; color: #666;">Compare typesetting with and without tracking</figcaption><p style="font-size: 0.9em; color: #666; font-style: italic;">Toggle between options on the website for comparison</p></figure>
  <figcaption><p><strong>Fig. 5</strong> Shows the difference between the heading with tracking on and off</p></figcaption>
</figure>

<p>It takes a little tweaking depending on the typeface you’re using. Think of a display typeface versus a text typeface. Using them at varying sizes will require different extremes of tracking. Typefaces with <a href="/blog/the-best-ink-trap-typefaces-for-websites">ink traps</a>, for example, tend to be designed for display use and benefit from tighter tracking at large sizes.</p>
<h2>Everything is sentence case</h2>
<p>Everything, whether that is a heading, button, navigation link or whatever else you can think of. It’s sentence case—no exceptions.</p>
<p>It should go without saying but the only exceptions are names or something important like ’I’.</p>
<figure>
<img src="/images/blog/0176-typesetting-sentence-case-01.svg" alt="" width="864" height="540" style="max-width: 100%; height: auto;" />
<figcaption><strong>Fig. 6</strong> Shows an example of a title in title case and in sentence case.</figcaption>
</figure>

<p>Sentence case is superior for readability and remembering the system. Is it the first letter or is it a name? Simple. The inconsistency at which people apply title case is enough to oppose it when setting a style guide.</p>
<h2>Everything is left aligned</h2>
<p>This is something I feel I always contradict myself with. But like any guidance it doesn’t mean there aren’t exceptions—eg: a hero section.</p>
<figure>
  <figure style="margin: 2em 0;">
    <img src="/images/blog/0176-typesetting-left-aligned-01.png" alt="" width="864" height="540" style="max-width: 100%; height: auto;" />
    <img src="/images/blog/0176-typesetting-left-aligned-02.png" alt="" width="864" height="540" style="max-width: 100%; height: auto;" />
  <figcaption style="margin-top: 0.5em; font-style: italic; color: #666;">Options of designs with left and centralised alignment of text</figcaption><p style="font-size: 0.9em; color: #666; font-style: italic;">Toggle between options on the website for comparison</p></figure>
  <figcaption><p><strong>Fig. 7</strong> Two options of designs with central and left alignment for comparison.</p></figcaption>
</figure>

<p>Anyway, for the vast majority of your design it should be aligned to the left (or right if your language is right to left). It means your right side of text has a ragged edge which makes it easy to scan. It’s most true for articles.</p>
<p>If your composition works better centrally, it must be a small amount of text. You don’t want to be reading large centralised paragraphs.</p>
<h2>Use the correct type of dash</h2>
<p>I’d recently heard a pointer for identifying AI copy was the use of the em dash (—). Which feels unfair, but I see it, AI does like to use them. I hope doesn’t lead to a lack of their use—as I like to use them.</p>
<p>I do wonder if this comes from the assumption that the judge of the writing assumes the writer doesn’t know how to use them? Which is where I was going with that. And knowing where to use each dash ensures your writing is typographically correct.</p>
<h3>Hyphens (-)</h3>
<p>Hyphens are used to join words to create meaning or indicate where a word breaks within a sentence to maintain grammatical correctness.</p>
<h3>En-dash (–)</h3>
<p>The name comes from the letter ’n’ as the character tends to be the width of the letter ’n’. But its use is important to understand.</p>
<p>It’s used to indicate a range. It could be a range of numbers, dates or start and end of a destination eg: MAN–LON.</p>
<h3>Em-dash (—)</h3>
<p>The name comes from the letter ‘m’ as the character tends to be the width of the letter ‘m’. And in terms of CSS this is where the <code>em</code> unit comes from too.</p>
<p>The easiest way I remember how to use an em-dash is as more of a substitute for a commas, parentheses or semicolons.</p>
<p>I see it as a way to break up a sentence. The statement you write in between the dashes should make sense on its own and the sentence should make sense on its own if the statement between the dashes is removed.</p>
<p>I could be wrong here, but that is my understanding.</p>
<h3>Composing sentences with em-dashes</h3>
<p>My stylistic preference, when writing a sentence that contains an em-dash it shouldn’t have spaces before and after it. You can use a <code>&amp;thinsp;</code> but otherwise no space is preferred.</p>
<blockquote>
<p>Design is not just what it looks like and feels like — design is how it works</p>
</blockquote>
<blockquote>
<p>Design is not just what it looks like and feels like—design is how it works</p>
</blockquote>
<h3>Keyboard shortcuts</h3>
<p>The en and em dash have the following keyboard shortcuts to access.</p>
<h4>en-dash</h4>
<p><kbd><kbd style="display: inline-block; padding: 0.2em 0.5em; background: #f5f5f5; border: 1px solid #ddd; border-radius: 4px; font-family: system-ui, sans-serif; font-size: 0.9em;">option</kbd> <kbd style="display: inline-block; padding: 0.2em 0.5em; background: #f5f5f5; border: 1px solid #ddd; border-radius: 4px; font-family: system-ui, sans-serif; font-size: 0.9em;">-</kbd></kbd></p>
<h4>em-dash</h4>
<p><kbd><kbd style="display: inline-block; padding: 0.2em 0.5em; background: #f5f5f5; border: 1px solid #ddd; border-radius: 4px; font-family: system-ui, sans-serif; font-size: 0.9em;">option</kbd> <kbd style="display: inline-block; padding: 0.2em 0.5em; background: #f5f5f5; border: 1px solid #ddd; border-radius: 4px; font-family: system-ui, sans-serif; font-size: 0.9em;">shift</kbd> <kbd style="display: inline-block; padding: 0.2em 0.5em; background: #f5f5f5; border: 1px solid #ddd; border-radius: 4px; font-family: system-ui, sans-serif; font-size: 0.9em;">-</kbd></kbd></p>
<h2>Use the correct quotes</h2>
<p>I’ve put this before in a previous article, but let’s go over it again. There’s straight quotes and curly quotes. Curly quotes are more complementary with your typeface.</p>
<figure>
  <img src="/images/blog/0176-typesetting-quotes-01.svg" alt="" width="864" height="540" style="max-width: 100%; height: auto;" />
  <figcaption><p><strong>Fig. 8</strong> Left are straight quotes, right are curly quotes</p></figcaption>
</figure>

<p>The best reference for the usage of quotes smartquotesforsmartpeople.com. The shortcuts are fairly simple, but it’s better if you have something to do it automatically for you as it can be easily missed.</p>
<h4>Opening double quote</h4>
<p><kbd><kbd style="display: inline-block; padding: 0.2em 0.5em; background: #f5f5f5; border: 1px solid #ddd; border-radius: 4px; font-family: system-ui, sans-serif; font-size: 0.9em;">shift</kbd> <kbd style="display: inline-block; padding: 0.2em 0.5em; background: #f5f5f5; border: 1px solid #ddd; border-radius: 4px; font-family: system-ui, sans-serif; font-size: 0.9em;">option</kbd> <kbd style="display: inline-block; padding: 0.2em 0.5em; background: #f5f5f5; border: 1px solid #ddd; border-radius: 4px; font-family: system-ui, sans-serif; font-size: 0.9em;">[</kbd></kbd></p>
<h4>Closing double quote</h4>
<p><kbd><kbd style="display: inline-block; padding: 0.2em 0.5em; background: #f5f5f5; border: 1px solid #ddd; border-radius: 4px; font-family: system-ui, sans-serif; font-size: 0.9em;">shift</kbd> <kbd style="display: inline-block; padding: 0.2em 0.5em; background: #f5f5f5; border: 1px solid #ddd; border-radius: 4px; font-family: system-ui, sans-serif; font-size: 0.9em;">option</kbd> <kbd style="display: inline-block; padding: 0.2em 0.5em; background: #f5f5f5; border: 1px solid #ddd; border-radius: 4px; font-family: system-ui, sans-serif; font-size: 0.9em;">]</kbd></kbd></p>
<h4>Opening single quote</h4>
<p><kbd><kbd style="display: inline-block; padding: 0.2em 0.5em; background: #f5f5f5; border: 1px solid #ddd; border-radius: 4px; font-family: system-ui, sans-serif; font-size: 0.9em;">option</kbd> <kbd style="display: inline-block; padding: 0.2em 0.5em; background: #f5f5f5; border: 1px solid #ddd; border-radius: 4px; font-family: system-ui, sans-serif; font-size: 0.9em;">[</kbd></kbd></p>
<h4>Closing single quote</h4>
<p><kbd><kbd style="display: inline-block; padding: 0.2em 0.5em; background: #f5f5f5; border: 1px solid #ddd; border-radius: 4px; font-family: system-ui, sans-serif; font-size: 0.9em;">option</kbd> <kbd style="display: inline-block; padding: 0.2em 0.5em; background: #f5f5f5; border: 1px solid #ddd; border-radius: 4px; font-family: system-ui, sans-serif; font-size: 0.9em;">]</kbd></kbd></p>
<p>When dealing with automatic transformation into them. Many apps do this by default. For code, you’ll need to use a library like smartypants.</p>
<h2>Hanging lists and punctuation</h2>
<p>The aim with hanging punctuation is keeping a clear key line. Overall, it helps keep the rhythm for the eye to follow. Depending on your design tool of choice there is varying levels of control and convenience to do this in your design.</p>
<figure>
  <figure style="margin: 2em 0;">
    <img src="/images/blog/0176-typesetting-hanging-quote-01.png" alt="" width="864" height="540" style="max-width: 100%; height: auto;" />
    <img src="/images/blog/0176-typesetting-hanging-quote-02.png" alt="" width="864" height="540" style="max-width: 100%; height: auto;" />
  <figcaption style="margin-top: 0.5em; font-style: italic; color: #666;">Hanging quote comparison</figcaption><p style="font-size: 0.9em; color: #666; font-style: italic;">Toggle between options on the website for comparison</p></figure>
  <figcaption><p><strong>Fig. 9</strong> Comparing the difference between a body of text with and without hanging quotes.</p></figcaption>
</figure>

<p>Across these examples, you can see the difference hanging the quotes makes to the flow of the writing. I like it as a design detail as it gives an opportunity to add a little flair without being disruptive.</p>
<figure>
  <figure style="margin: 2em 0;">
    <img src="/images/blog/0176-typesetting-hanging-list-01.png" alt="" width="864" height="540" style="max-width: 100%; height: auto;" />
    <img src="/images/blog/0176-typesetting-hanging-list-02.png" alt="" width="864" height="540" style="max-width: 100%; height: auto;" />
  <figcaption style="margin-top: 0.5em; font-style: italic; color: #666;">Hanging lists comparison</figcaption><p style="font-size: 0.9em; color: #666; font-style: italic;">Toggle between options on the website for comparison</p></figure>
  <figcaption><p><strong>Fig. 10</strong> Comparing the difference between a body of text with and without hanging lists.</p></figcaption>
</figure>

<h3>With CSS use hanging-punctuation</h3>
<p>To achieve it for all the cases you may require it was a challenge, until <code>hanging-punctuation</code> came about.</p>
<figure>
```css showLineNumbers title="hanging-punctuation-options.css"
p {
  hanging-punctuation: none;
  hanging-punctuation: first;
  hanging-punctuation: last;
  hanging-punctuation: allow-end;
}
```
<figcaption>
It’s a [flexible property](https://developer.mozilla.org/en-US/docs/Web/CSS/hanging-punctuation), you can combine all three values or have one or two.
</figcaption>
</figure>

<p>The browser support is poor as of writing[^4]—but it presents a future with greater control.</p>
<p>Although, I like hanging punctuation for the alignment reason, it can be challenging to always achieve it on smaller screens with the more restricted space.</p>
<h2>Avoid punctuating titles where possible</h2>
<p>I will try to avoid punctuation in a title because it looks messy. I find it’s difficult to apply with consistency. If one title is punctuated it will stand out more when another isn’t.</p>
<figure>
  <figure style="margin: 2em 0;">
    <img src="/images/blog/0176-typesetting-punctuation-07.svg" alt="" width="864" height="540" style="max-width: 100%; height: auto;" />
    <img src="/images/blog/0176-typesetting-punctuation-06.svg" alt="" width="864" height="540" style="max-width: 100%; height: auto;" />
  <figcaption style="margin-top: 0.5em; font-style: italic; color: #666;">Showing removal of punctuation from the hero</figcaption><p style="font-size: 0.9em; color: #666; font-style: italic;">Toggle between options on the website for comparison</p></figure>
  <figcaption><p><strong>Fig. 11</strong> Comparing the difference between a mobile hero design with and without punctuation part of the title and description.</p></figcaption>
</figure>

<h3>Watch out for full stops in centralised titles</h3>
<p>It’s something that can optically throw off the balance of your heading. It stands out more on mobile due to the narrower width. <em>Well I am kind of reaching, but it does stand out optically</em>.</p>
<figure>
  <figure style="margin: 2em 0;">
    <img src="/images/blog/0176-typesetting-punctuation-04.svg" alt="" width="864" height="540" style="max-width: 100%; height: auto;" />
    <img src="/images/blog/0176-typesetting-punctuation-03.svg" alt="" width="864" height="540" style="max-width: 100%; height: auto;" />
  <figcaption style="margin-top: 0.5em; font-style: italic; color: #666;">Showing removal of punctuation from the hero</figcaption><p style="font-size: 0.9em; color: #666; font-style: italic;">Toggle between options on the website for comparison</p></figure>
  <figcaption><p><strong>Fig. 12</strong> Comparing the difference between a mobile hero design with and without punctuation part of the title and description.</p></figcaption>
</figure>

<p>On a separate note, it’s similar to hanging punctuation. Where you have a central title with a full stop at the end the final line will feel off optically.</p>
<h2>When emphasising, highlighting or linking text watch out for punctuation</h2>
<p>This is a small detail, but the vast majority of the time and more so with linking you shouldn’t include the full stop.</p>
<figure>
  <div className="sandbox">
    <div className="bg-neutral-01-100 px-[4vmax] py-[10vmax] aspect-16/10 flex items-center">
      <span className="text-fern-1100 font-display text-[clamp(1rem,0.6087rem+1.7391vw,2rem)] block text-center font-normal leading-4xl  text-balance tracking-[-.015em]">Old style is a humanist style of <u>serif</u>. The history of <span className="font-variation-bold">this style goes back to 1465</span>.</span>
    </div>
  </div>
  <figcaption><strong>Fig. 13</strong> An example of text using emphasis before the end of a sentence</figcaption>
</figure>

<h2>Use paragraphs to create help rhythm</h2>
<p>When some things like headings, lists, buttons follow a heading; it can create a sense of awkwardness in an article or design.</p>
<figure>
  <figure style="margin: 2em 0;">
    <img src="/images/blog/0176-typesetting-paragraphs-01.png" alt="" width="864" height="540" style="max-width: 100%; height: auto;" />
    <img src="/images/blog/0176-typesetting-paragraphs-02.svg" alt="" width="864" height="540" style="max-width: 100%; height: auto;" />
  <figcaption style="margin-top: 0.5em; font-style: italic; color: #666;">Showing addition of a paragraph to the design</figcaption><p style="font-size: 0.9em; color: #666; font-style: italic;">Toggle between options on the website for comparison</p></figure>
  <figcaption><strong>Fig. 14</strong> Comparison of two text compositions, heading with button, heading with paragraph and button to show the difference in balance.</figcaption>
</figure>

<p>Why? For me it’s down to the presence of the thing which follows the heading. A heading following a heading may not feel right. A button following a heading will likely feel out of place due to the balance between the elements.</p>
<p>The spacing flows much better when there is a paragraph to break it up. Your rhythm suffers when there isn’t.</p>
<p>Sometimes you can’t avoid it and it shouldn’t be at the expense of unnatural writing or forcing it but it’s a conscious effort I make.</p>
<h2>Avoid widows and orphans</h2>
<p>Widows can create some awkwardness in your design. A widow is a single word or short line of text. So where you have greater control over the flow of text in a component you can try to ensure it doesn’t happen.</p>
<figure>
  <img src="/images/blog/0176-typesetting-widows-01.png" alt="" width="864" height="540" style="max-width: 100%; height: auto;" />
  <figcaption><strong>Fig. 15</strong> Comparison of two text compositions with and without a widow.</figcaption>
</figure>

<h3>CSS text-wrap can handle it</h3>
<p>Before <code>text-wrap</code> it would be generally pointless to try cover every possible case of a widow in your design. But now with CSS you have two options to control text wrapping.</p>
<pre><code class="language-css">text-wrap: balance
</code></pre>
<p><code>balance</code> does exactly that it aims to achieve the most balanced layout. Which is ideal for your headings and this works well the majority of the time.</p>
<pre><code class="language-css">text-wrap: pretty
</code></pre>
<p><code>pretty</code> is a bit of a arbitrary word to decipher what happens, but it ensures that there isn’t one word left on it’s own. It’s for the use cases where <code>balance</code> would be excessive—like lengthier paragraphs.</p>
<p>There is also a performance aspect to it. If you think the browser has to calculate and reflow the text to balance it correctly.</p>
<p>Before <code>text-wrap</code> this is something that would be less practical to chase in a lot of situations and you’d have had to approach it manually. A method of doing so is still valuable to know.</p>
<h3>Manual balancing</h3>
<p>Methods for manually balancing titles or keeping word groups together is worth knowing. Sometimes you might find <code>text-wrap</code> doesn’t <em>quite</em> balance the title the way you want or you need to break a long word.</p>
<p>Don’t reach for <code>&lt;br/&gt;</code>. Use <code>&lt;wbr/&gt;</code> or <code>&amp;nbsp;</code>.</p>
<pre><code class="language-html">&lt;h1&gt;Fundamentals of visual&amp;nbsp;design&lt;/h1&gt;
&lt;p&gt;Underlying principles and elements&lt;wbr/&gt;that guide effective and visually appealing design.&lt;/p&gt;
</code></pre>
<p>Using a <code>&amp;nbsp;</code> (non-breaking space) will ensure you can keep word pairs together and using <code>&lt;wbr/&gt;</code> will only insert a <code>&lt;br/&gt;</code> when necessary.</p>
<h3>Avoiding widows</h3>
<p>A widow is where a single line of a paragraph ends up at the top of a new column or page, separated from the rest of its text. In print, this is a well-known problem. On the web it’s less common because we rarely work with columns or paged layouts.</p>
<p>But if you use CSS columns or <code>break-inside</code> for content layout, it’s easy to come up against them. That lone line draws the eye to an awkward gap rather than the content. It breaks the reading flow. You can use <code>break-inside: avoid</code> on elements you don’t want split across columns, but that can create its own spacing issues. The honest answer is that if you’re using CSS columns for long-form text, you’ll likely need to test and adjust manually.​​​​​​​​​​​​​​​​## Ending thoughts
Taking these rules into account, a balanced approach to typesetting improves both readability and visual appeal.  Paying attention to factors like line height, letter spacing, and alignment makes things more intentional and works within the constraints of the chosen typeface.</p>
<p>Keeping in mind the practicality of doing these things ensures your design is maintainable and not introducing more work. However, I have written similarly before with <a href="/blog/visual-design-tips-you-can-apply-immediately">visual design tips</a> and these posts seem to go down well.</p>
<p>[^1]: <a href="https://matthiasott.com/notes/the-thing-with-leading-in-css">The Thing With Leading in CSS</a>
[^2]: <a href="https://caniuse.com/?search=text-box">Can I use text-box</a>
[^3]: <a href="https://developer.chrome.com/blog/css-text-box-trim">CSS text-box-trim</a>
[^4]: <a href="https://caniuse.com/?search=hanging">Can I use hanging-punctuation</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Bento grid layout with CSS grid and container queries</title>
      <link>https://iamsteve.me/blog/bento-layout-css-grid</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/bento-layout-css-grid</guid>
      <pubDate>Tue, 02 Jul 2024 14:58:09 GMT</pubDate>
      <description>Bento grids offer a unique layout challenge for CSS. With the use of Tailwind you can create a flexible layout with modern CSS grid and @container queries.</description>
      <content:encoded><![CDATA[<p>There’s a lot of discussion happening around whether masonry is needed in CSS. And this discussion brings in things like bento grids. It inspired me to create a bento grid using today’s CSS grid and @container queries.</p>
<p>For this example masonry isn’t required&thinsp;&mdash;&thinsp;we have a known number of items with predetermined sizes, so CSS grid handles it well. That said, masonry would shine if you had a variable number of items or unpredictable content heights&thinsp;&mdash;&thinsp;it’s something I would like to see part of CSS in whatever way it ends up being.</p>
<blockquote style="
    margin: 1.5em 0;
    padding: 1em 1em 1em 1.5em;
    background: #fffbea;
    border-left: 4px solid #f59e0b;
    font-style: italic;
  ">
    I make the assumption that you’re comfortable setting up Tailwind for your project
  </blockquote>

<h2>The bento design</h2>
<p>The design showcases a rough idea of an app I wish existed. Each section displays a different feature with larger sections having an illustration of the feature.</p>
<figure className="flex flex-col gap-2">
<div style="margin: 2em 0; background: #f5f5f5; padding: 12px; border-radius: 8px;">
    <iframe
      src="https://stevemckinney.github.io/bento-grid/option-1.html"
      style="width: 100%; border: 1px solid #ddd; border-radius: 4px;"
      height="600"
      frameborder="0"
      loading="lazy">
    </iframe>
    <p style="margin-top: 8px; font-size: 0.9em; color: #666;"><a href="https://stevemckinney.github.io/bento-grid/option-1.html">View interactive demo →</a></p>
  </div>
<figcaption>A compact grid showing 6 features of a fictional app. Layout will vary based on your device. This is a live demo.</figcaption>
</figure>

<h3>Considerations</h3>
<ul>
<li>Content spans different column widths</li>
<li>Icon plus title style in unpredictable width containers</li>
<li>Rows with equal height content and imagery</li>
<li>Images will need to retain or change aspect ratio</li>
<li>Image masks will need to change with different image crops</li>
</ul>
<h2>Project files</h2>
<p>The design is available through Figma’s community and the code is available through Github. There’s two layout options in both.</p>
<div className={`flex gap-2`}>
  <a href="https://www.figma.com/community/file/1386411347459963894/bento-grid" style="
    display: inline-flex;
    align-items: center;
    gap: 0.5em;
    padding: 0.5em 1em;
    background: #f5f5f5;
    border: 1px solid #ddd;
    border-radius: 6px;
    text-decoration: none;
    color: #333;
    font-weight: 500;
  ">Figma</a>
  <a href="https://github.com/stevemckinney/bento-grid" style="
    display: inline-flex;
    align-items: center;
    gap: 0.5em;
    padding: 0.5em 1em;
    background: #f5f5f5;
    border: 1px solid #ddd;
    border-radius: 6px;
    text-decoration: none;
    color: #333;
    font-weight: 500;
  ">Github</a>
</div>

<h2>HTML structure</h2>
<p>First, it’s necessary to get the structure of the bento grid. Then it makes sense to cover the rest of the layout and visual style with Tailwind.</p>
<h3>Create a container</h3>
<p>Everything needs to be contained within a <code>&lt;div&gt;</code> with this you’ll apply the grid styles to it.</p>
<pre><code class="language-html">&lt;section&gt;
  &lt;header&gt;
    &lt;h2&gt;Publish from anywhere with your frontmatter blog&lt;/h2&gt;
    &lt;p&gt;
      Why should you be left out of a cross device writing experience because
      you’re using a static site? Bureau takes away the pain of manually moving
      posts to your codebase and gives you the writing experience you need.
    &lt;/p&gt;
  &lt;/header&gt;
  &lt;div class=&quot;bento-container&quot;&gt;
    &lt;!-- sections here --&gt;
  &lt;/div&gt;
&lt;/section&gt;
</code></pre>
<h3>Basic structure for each section</h3>
<p>As the design features sections with different sizing and visual weight through use of imagery your markup for each will differ slightly.</p>
<pre><code class="language-html">&lt;section class=&quot;bento-section&quot;&gt;
  &lt;div class=&quot;bento-body&quot;&gt;
    &lt;h3&gt;
      &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot;&gt;&lt;use href=&quot;#automated&quot;&gt;&lt;/svg&gt;&lt;/span&gt;
      Automated versioning with Git
    &lt;/h3&gt;
    &lt;p&gt;When you create a new post Bureau automatically creates a branch—keep working on drafts as long as you need. Open a pull request when you’re done and find yourself publishing more than ever.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;bento-image-container&quot;&gt;
    &lt;img srcset=&quot;../images/git-versioning.png 1x, ../images/git-versioning@2x.png 2x&quot; width=&quot;468&quot; height=&quot;376&quot; class=&quot;bento-image&quot;&gt;
  &lt;/div&gt;
&lt;/section&gt;
</code></pre>
<p>Grouping the text based content together and applying a container around the image allows you greater control later when adding style and layout.</p>
<h3>Putting all the HTML together</h3>
<p>Overall for this design there’s 6 sections. Some sections will have an image others without. Some will span more columns and some will span more rows. For layouts like this tailwind is perfect to manage these variations.</p>
<p>If you’re working in an environment that allows for a components, each section could be a single component with some properties for customisation.</p>
<pre><code class="language-html">&lt;section class=&quot;features&quot;&gt;
  &lt;header class=&quot;features-header&quot;&gt;
    &lt;h2 class=&quot;features-title&quot;&gt;Publish from anywhere with your frontmatter blog&lt;/h2&gt;
    &lt;p class=&quot;features-description&quot;&gt;Why should you be left out of a cross device writing experience because you’re using a static site? Bureau takes away the pain of manually moving posts to your codebase and gives you the writing experience you need.&lt;/p&gt;
  &lt;/header&gt;

  &lt;div class=&quot;bento-container&quot;&gt;
    &lt;section class=&quot;bento-section bento-section-primary&quot;&gt;
      &lt;div class=&quot;bento-body&quot;&gt;
        &lt;h3 class=&quot;bento-title&quot;&gt;
          &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot;&gt;&lt;use href=&quot;#automated&quot;&gt;&lt;/svg&gt;&lt;/span&gt;
          Automated versioning with Git
        &lt;/h3&gt;
        &lt;p class=&quot;bento-description&quot;&gt;When you create a new post Bureau automatically creates a branch—keep working on drafts as long as you need. Open a pull request when you’re done and find yourself publishing more than ever.&lt;/p&gt;
      &lt;/div&gt;
      &lt;div class=&quot;bento-image-container&quot;&gt;
        &lt;img srcset=&quot;images/git-versioning.png 1x, images/git-versioning@2x.png 2x&quot; width=&quot;468&quot; height=&quot;376&quot;&gt;
      &lt;/div&gt;
    &lt;/section&gt;
    &lt;section class=&quot;bento-section bento-section-primary&quot;&gt;
      &lt;div class=&quot;bento-body&quot;&gt;
        &lt;h3 class=&quot;bento-title&quot;&gt;
          &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot;&gt;&lt;use href=&quot;#autocomplete&quot;&gt;&lt;/svg&gt;&lt;/span&gt;
          Component autocomplete
        &lt;/h3&gt;
        &lt;p class=&quot;bento-description&quot;&gt;Bureau finds MDX components and autocompletes them for you—taking the best bits of a code editor combined with a beautiful writing experience. Start writing a component for autocomplete or use the menu.&lt;/p&gt;
      &lt;/div&gt;
      &lt;div class=&quot;bento-image-container&quot;&gt;
        &lt;img srcset=&quot;images/component-autocomplete.png 1x, images/component-autocomplete@2x.png 2x&quot; width=&quot;468&quot; height=&quot;376&quot;&gt;
      &lt;/div&gt;
    &lt;/section&gt;
    &lt;section class=&quot;bento-section bento-section-secondary&quot;&gt;
      &lt;div class=&quot;bento-body&quot;&gt;
        &lt;h3 class=&quot;bento-title&quot;&gt;
          &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot;&gt;&lt;use href=&quot;#markdown&quot;&gt;&lt;/svg&gt;&lt;/span&gt;
          Markdown as standard
        &lt;/h3&gt;
        &lt;p class=&quot;bento-description&quot;&gt;Bureau provides a first-class markdown editing experience, by using the same library as you.&lt;/p&gt;
      &lt;/div&gt;
      &lt;div class=&quot;bento-image-container&quot;&gt;
        &lt;img srcset=&quot;images/markdown-menu.png 1x, images/markdown-menu@2x.png 2x&quot; width=&quot;232&quot; height=&quot;342&quot;&gt;
      &lt;/div&gt;
    &lt;/section&gt;
    &lt;section class=&quot;bento-section bento-section-primary&quot;&gt;
      &lt;div class=&quot;bento-body&quot;&gt;
        &lt;h3 class=&quot;bento-title&quot;&gt;
          &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot;&gt;&lt;use href=&quot;#contextual_token&quot;&gt;&lt;/svg&gt;&lt;/span&gt;
          Frontmatter templates
        &lt;/h3&gt;
        &lt;p class=&quot;bento-description&quot;&gt;It’s pretty tedious starting a new frontmatter post, isn’t it? The editor works with your frontmatter and will generate timestamps, ID’s and more. All with a simple setup—we’ll find your config or generate one with Bureau.&lt;/p&gt;
      &lt;/div&gt;
      &lt;div class=&quot;bento-image-container&quot;&gt;
        &lt;img srcset=&quot;images/frontmatter-templates.png 1x, images/frontmatter-templates@2x.png 2x&quot; width=&quot;468&quot; height=&quot;376&quot;&gt;
      &lt;/div&gt;
    &lt;/section&gt;
    &lt;section class=&quot;bento-section bento-section-tertiary&quot;&gt;
      &lt;div class=&quot;bento-body&quot;&gt;
        &lt;h3 class=&quot;bento-title&quot;&gt;
          &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot;&gt;&lt;use href=&quot;#typed&quot;&gt;&lt;/svg&gt;&lt;/span&gt;
          Typed content
        &lt;/h3&gt;
        &lt;p class=&quot;bento-description&quot;&gt;Bureau will look to see if your frontmatter is typed and if not you can let Bureau know.&lt;/p&gt;
      &lt;/div&gt;
    &lt;/section&gt;
    &lt;section class=&quot;bento-section bento-section-tertiary&quot;&gt;
      &lt;div class=&quot;bento-body&quot;&gt;
        &lt;h3 class=&quot;bento-title&quot;&gt;
          &lt;span aria-hidden=&quot;true&quot;&gt;&lt;svg width=&quot;24&quot; height=&quot;24&quot;&gt;&lt;use href=&quot;#automated&quot;&gt;&lt;/svg&gt;&lt;/span&gt;Works with your code
        &lt;/h3&gt;
        &lt;p class=&quot;bento-description&quot;&gt;Bureau doesn’t care about the framework you use. Add your Git repository or start a new one and Bureau will look after your content. This is the publishing experience for static websites.&lt;/p&gt;
      &lt;/div&gt;
    &lt;/section&gt;
  &lt;/div&gt;
&lt;/section&gt;
</code></pre>
<h2>On to the grid’s CSS</h2>
<p>The CSS required to create a bento grid is surprisingly minimal. You could also use <code>subgrid</code> for your columns, if your grid is defined on a parent element. It’s worth noting that <code>subgrid</code> would be particularly useful for aligning the internal content of each card&thinsp;&mdash;&thinsp;icon, title, and description&thinsp;&mdash;&thinsp;consistently across cards without extra CSS. That’s a worthwhile next step if you’re building this into a component system.</p>
<pre><code class="language-css">.bento-container {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  grid-auto-flow: dense;
  gap: 1rem;
}
</code></pre>
<p>The important bit of CSS here is <code>grid-auto-flow</code> aside from defining the 12 column grid itself. This tells the grid algorithm to fill in gaps where possible with smaller grid items.</p>
<figure>
  <img src="/images/blog/0175-bento-grid-columns@2x.png" alt="" width="864" height="564" style="max-width: 100%; height: auto;" />
  <figcaption>Grid overlay shows the columns applied to the design</figcaption>
</figure>

<pre><code class="language-css">/* optional */
@media (min-width: 1280px) {
  .bento-container {
    grid-auto-rows: 1fr;
  }
}
</code></pre>
<p>Another important part to the design is <code>grid-auto-rows</code>. As this affects the two smaller square items they need to occupy an equal amount of rows. Only applying this to larger screens ensures it doesn’t create excess space on smaller screen layouts. This is a deliberate design choice&thinsp;&mdash;&thinsp;achieving a true bento style layout on smaller screens is difficult with the space constraint, so rows size to their content on mobile and are forced to equal height on desktop where the grid has room to breathe.</p>
<figure>
  <img src="/images/blog/0175-bento-grid-rows@2x.png" alt="" width="864" height="564" style="max-width: 100%; height: auto;" />
  <figcaption>Grid overlay shows the rows applied to the design</figcaption>
</figure>

<p>When a grid is overlayed onto the design you can see what to aim for. Each section aligns with a row and each row is of an equal height.</p>
<h3>Grid sections CSS</h3>
<p>This is a matter of setting how many columns and rows you wish for each section to <code>span</code>. As part of the design there are 3 different sizes for sections.</p>
<pre><code class="language-css">.bento-section-primary {
  grid-column: span 6;
  grid-row: span 4;
}

.bento-section-secondary {
  grid-column: span 3;
  grid-row: span 4;
}

.bento-section-tertiary {
  grid-column: span 3;
  grid-row: span 2;
}
</code></pre>
<h3>What this looks like</h3>
<p>Without the content you’re left with a shell that matches the initial design.</p>
<figure>
<div className="sandbox">
  <div style="
    margin: 2em 0;
    padding: 1.5em;
    background: #f0f9ff;
    border: 1px solid #0ea5e9;
    border-radius: 8px;
    text-align: center;
  ">
    <p style="margin: 0; color: #0369a1;">
      <strong>Interactive grid demo</strong><br>
      <em>Visit the website to try the interactive bento grid demonstration</em>
    </p>
    <p style="margin: 1em 0 0 0;"><a href="https://stevemckinney.github.io/bento-grid/option-1.html" style="
      display: inline-flex;
      align-items: center;
      gap: 0.5em;
      padding: 0.5em 1em;
      background: #0ea5e9;
      border-radius: 6px;
      text-decoration: none;
      color: #fff;
      font-weight: 500;
    ">View interactive demo →</a></p>
  </div>
</div>
<figcaption>A visual of the bento grid without content and @media query adjustments</figcaption>
</figure>

<h2>Tailwind setup</h2>
<p>For this I have used <a href="https://tailwindcss.com/blog/tailwindcss-v4">Tailwind 4</a>, which changes from using <code>tailwind.config.js</code> to using CSS for most configuration.</p>
<p>In this CSS file we’ll setup the type as well, for which I’m using <a href="https://rsms.me/inter/">Inter Variable</a>.</p>
<pre><code class="language-css">@font-face {
  font-family: &#39;Inter&#39;;
  src: url(&#39;/fonts/InterVariable.woff2&#39;) format(&#39;woff2&#39;);
  font-display: swap;
  font-weight: 100 900;
}

@theme {
  /* color */
  /* general */
  --color-zircon: rgb(154 205 203);
  --color-cream: oklch(97.3% 0.086 120.3);
  --color-bittersweet: rgb(254 95 85);
  --color-lavender: rgb(204 201 220);

  /* gunmetal */
  --color-gunmetal-900: rgb(24 36 37);
  --color-gunmetal-850: rgb(32 48 50);
  --color-gunmetal-800: rgb(40 60 62);
  --color-gunmetal-750: rgb(48 72 75);
  --color-gunmetal-700: rgb(43 78 81);
  --color-gunmetal-650: rgb(64 96 100);
  --color-gunmetal-600: rgb(72 108 112);
  --color-gunmetal-550: rgb(80 120 124);
  --color-gunmetal-500: rgb(88 132 137);
  --color-gunmetal-450: rgb(95 144 149);

  /* mask */
  --image-mask-bottom: radial-gradient(
    125% 85% at 50% 15%,
    #000 65%,
    transparent 100%
  );
  --image-mask-top: radial-gradient(
    97.5% 80% at 50% 80%,
    #000 65%,
    transparent 100%
  );
}

:root {
  font-family: &#39;Inter&#39;;
  font-feature-settings: &#39;dlig&#39; on, &#39;ss03&#39; on;
}
</code></pre>
<p>If you’re looking for a standard CSS application you can take the variables here too or the <a href="https://github.com/stevemckinney/bento-grid/blob/main/app.output.css">compiled CSS</a>.</p>
<h2>Applying layout</h2>
<p>You can get the complete markup on <a href="https://github.com/stevemckinney/bento-grid">Github</a>—there’s a lot to get through but I will run through what’s needed with Tailwind to create this layout.</p>
<pre><code class="language-html">&lt;section class=&quot;w-full px-4 md:px-14 py-16 flex flex-col items-center gap-10&quot;&gt;
  &lt;header class=&quot;flex flex-col gap-4 items-center max-w-[612px]&quot;&gt;
    &lt;h2
      class=&quot;text-cream text-center text-balance text-4xl md:text-[3.5rem] leading-[.9285714286] font-medium tracking-[-.03em] m-0 optical-size-32&quot;
    &gt;
      Publish from anywhere with your frontmatter blog
    &lt;/h2&gt;
    &lt;p class=&quot;text-white text-center m-0 max-w-prose&quot;&gt;
      Why should you be left out of a cross device writing experience because
      you’re using a static site? Bureau takes away the pain of manually moving
      posts to your codebase and gives you the writing experience you need.
    &lt;/p&gt;
  &lt;/header&gt;

  &lt;div
    class=&quot;w-full max-w-[1328px] grid grid-cols-12 grid-flow-dense xl:auto-rows-fr gap-4&quot;
  &gt;
    &lt;!-- sections here --&gt;
  &lt;/div&gt;
&lt;/section&gt;
</code></pre>
<p>What was <code>bento-container</code> earlier now contains all of those same styles within. In addition to setting a <code>max-width</code> to the container.</p>
<h3>Section breakdown</h3>
<p>Now to apply all of the style and additional layout adjustments. Highlighted are the lines which affect layout.</p>
<pre><code class="language-html">&lt;section class=&quot;@container/section flex flex-col col-span-full md:col-span-6 xl:row-span-4 gap-2 p-2 bg-gunmetal-850 ring ring-gunmetal-750 rounded-2xl&quot;&gt;
  &lt;div class=&quot;p-6 flex flex-1 flex-col gap-4&quot;&gt;
    &lt;h3 class=&quot;text-cream font-semibold flex flex-col @[17.5rem]:flex-row @[17.5rem]:items-center gap-4 [font-variation-settings:&#39;opsz&#39;_32]&quot;&gt;
      &lt;span class=&quot;bg-gunmetal-750 ring ring-gunmetal-650 w-10 h-10 flex flex-[0_0_auto] items-center justify-center rounded-full&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg class=&quot;fill-cream&quot; width=&quot;24&quot; height=&quot;24&quot;&gt;&lt;use href=&quot;#automated&quot;&gt;&lt;/svg&gt;&lt;/span&gt; Automated versioning with Git
    &lt;/h3&gt;
    &lt;p class=&quot;text-white text-pretty max-w-prose&quot;&gt;When you create a new post Bureau automatically creates a branch—keep working on drafts as long as you need. Open a pull request when you’re done and find yourself publishing more than ever.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;flex justify-center items-end rounded-lg bg-gunmetal-800 ring ring-gunmetal-750 overflow-hidden aspect-100/66 md:aspect-square xl:aspect-640/376&quot;&gt;
    &lt;img srcset=&quot;images/git-versioning.png 1x, images/git-versioning@2x.png 2x&quot; class=&quot;object-none object-[center_1rem] w-full h-full mask-(--image-mask-bottom)&quot; width=&quot;468&quot; height=&quot;376&quot;&gt;
  &lt;/div&gt;
&lt;/section&gt;
</code></pre>
<h4>Setup the @container</h4>
<p>There’s adjustments that need to be made based on the containers size for images and titles which will be covered shortly. You can scope this container as well with a <code>container-name</code> or use Tailwind’s <code>/</code> syntax.</p>
<pre><code class="language-html">&lt;section
  class=&quot;@container/section flex flex-col col-span-full md:col-span-6 xl:row-span-4 gap-2 p-2 bg-gunmetal-850 ring ring-gunmetal-750 rounded-2xl&quot;
&gt;&lt;/section&gt;
</code></pre>
<p>Here the container has further adjustment on column width throughout the standard Tailwind breakpoints.</p>
<figure>
  <img src="/images/blog/0175-bento-grid-section-structure.png" alt="" width="864" height="564" style="max-width: 100%; height: auto;" />
  <figcaption>Highlighting how space is applied to each section</figcaption>
</figure>

<p>Spacing is another crucial element. It’s applied to the outer edge of the container and between the content and image.</p>
<h4>Ensure content fills the available space</h4>
<p>On line 2 you’re using <code>flex-1</code> or <code>flex: 1 1 0%</code> to have the text content to expand fill any remaining space. It ensures when content differs in height images will be in alignment.</p>
<pre><code class="language-html">&lt;div class=&quot;p-6 flex flex-1 flex-col gap-4&quot;&gt;&lt;/div&gt;
</code></pre>
<p>This could be seen as optional or applied to the image container. It depends on your preference.</p>
<h4>Section title</h4>
<p>Within each of titles there is an a <code>&lt;span&gt;</code> with an <code>&lt;svg&gt;</code> referencing a sprite icon with the fill colour applied as a <code>class</code>.</p>
<pre><code class="language-html">&lt;h3 class=&quot;text-cream font-semibold flex flex-col @[17.5rem]:flex-row @[17.5rem]:items-center gap-4 [font-variation-settings:&#39;opsz&#39;_32]&quot;&gt;
  &lt;span class=&quot;bg-gunmetal-750 ring ring-gunmetal-650 w-10 h-10 flex flex-[0_0_auto] items-center justify-center rounded-full&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg class=&quot;fill-cream&quot; width=&quot;24&quot; height=&quot;24&quot;&gt;&lt;use href=&quot;#automated&quot;&gt;&lt;/svg&gt;&lt;/span&gt; Automated versioning with Git
&lt;/h3&gt;
</code></pre>
<p>Each title will switch its layout to row when the space available is <code>17.5rem</code> or greater. You could do this automatically with <code>flex-wrap</code>—but I have opted for greater control here so that all titles will wrap at this point.</p>
<h4>Art directed images</h4>
<p>Lines 8–10 are ensuring each image is tailored for the container it’s in. Each image uses <code>object-none</code> or <code>object-fit: none</code> to ensure the image doesn’t scale down.</p>
<pre><code class="language-html">&lt;div
  class=&quot;flex rounded-lg bg-gunmetal-800 ring ring-gunmetal-750 overflow-hidden aspect-340/376 @md:aspect-640/376&quot;
&gt;
  &lt;img
    srcset=&quot;images/git-versioning.png 1x, images/git-versioning@2x.png 2x&quot;
    class=&quot;object-none object-[1rem_1rem] @md:object-[center_1rem] w-full h-full mask-(--image-mask-bottom)&quot;
    width=&quot;468&quot;
    height=&quot;376&quot;
  /&gt;
&lt;/div&gt;
</code></pre>
<p>Bear with me, this may seem a little backwards from what you may be used to with responsive design. If these images scale you begin to lose detail—so the aim with <code>object-fit</code> is to keep it. And by using <code>object-position</code> you can align the image more favourably.</p>
<p>And by setting an <code>aspect-ratio</code> on the container it allows more precision for the image size. Managing this with @container queries applies the <code>aspect-ratio</code> in a better way than @media queries.</p>
<p><strong>This does differ for each image. The alignment of each image does change. A freedom we’re allowed in this demo at least.</strong></p>
<h2>Finishing up</h2>
<p>Well this post is longer than I had anticipated—hopefully it’s clear enough to follow. There’s a lot to go through to get through with the slight differences between sections—and that’s why I enjoy using Tailwind. This could be easily created with components in mind, whether that’s using a React framework or Web Components.</p>
<p>I’ve also not covered too much in terms of implementing the visual design here—again due to the length of the post.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>About version 7</title>
      <link>https://iamsteve.me/blog/about-version-7</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/about-version-7</guid>
      <pubDate>Thu, 29 Feb 2024 10:13:38 GMT</pubDate>
      <description>How I moved 140 posts from a database CMS to a static site in Next.js. No redesign just website rebuild and some hindsight into the decision making.</description>
      <content:encoded><![CDATA[<p>With this version there was little to no visual change. I say was, as this post was created after going live. The purpose was to move from ExpressionEngine to Next.js. It was an important change as I felt at the time at a dead end with ExpressionEngine.</p>
<h2>Why rebuild the website?</h2>
<p>ExpressionEngine was no longer cutting it for me. I had reached a point where things were breaking and I couldn’t replace those things in ExpressionEngine.</p>
<p>The lack of community around ExpressionEngine made things really difficult for me. I rely on a community that shares how to do things or plugins for getting by with a lot of my development work. So even simpler things like RSS and getting structured data to output were no longer working.</p>
<h3>I wanted a better deploy system</h3>
<p>This was another important thing, being able to deploy and have rollbacks, preview branches, etc. for convenience. Which is where moving to a host like Netlify was ideal. I had given this a try with my portfolio. The ease of it all was great.</p>
<p>I’m wary of cost here, as it can easily escalate, but for now it’s in line with what I was paying previously. I’ve also seen a lot around Cloudflare being a good alternative and this is something I may explore.</p>
<h3>Being able to use MDX</h3>
<p>If you’re unfamiliar with MDX it allows you to use JSX in your markdown files. So with it you’re able to use components within posts and can make them much more interactive.</p>
<p>For where I use code demos this is really useful. I can keep the code in here for the most part without need for an external service. I intend to do this with simpler examples as I will have greater control over the integration into the article.</p>
<h3>It was time to go static</h3>
<p>So round mid-2021 (see, it’s taken a while to write about), I decided it was time to get it over with if I ever planned to redesign the website. And I decided to go the static route—if you can call Next.js a static site generator.</p>
<p>Theres always been a lot of hype around static site generators, from the original popularity of Jekyll. And I feel I had always avoided it due to having to go all in on the static side, but that’s not the case anymore.</p>
<p>I was torn between Gatsby and Next.</p>
<p>I had built my portfolio in Gatsby a year earlier, so I felt ok with the React world. Gatsby was a strong choice, I liked the way GraphQL worked to a degree and the community around it seemed to be thriving at the time.</p>
<h3>Choosing Next.js</h3>
<p>However, I went for Next.js because on reading it seemed it was better for sites with more pages, such as a blog.</p>
<p>Other than that I didn’t think too much of it. But I am so glad I didn’t pick Gatsby. It’s turned out to be a wise decision as Gatsby has lost all of that momentum.</p>
<p>But importantly my content is much more portable and there’s a great community around Next.js and React in general. So if it all changes and we’re all building sites on Astro or something else, I know the change won’t be as painful.</p>
<h2>Before the rebuild</h2>
<p>I had 2 major tasks before I could start rebuilding, future self stuff. Changing the URL structure and exporting all post files from a database in to text files.</p>
<p>Thankfully one was far easier than the others.</p>
<h3>Preparing a URL structure change</h3>
<p>One of the things I felt <del>could</del> would be a problem was the current URL structure surrounding blog posts. And I didn’t want to have that as a problem on top of moving to Next.js and a new hosting platform.</p>
<p>The structure was <code>/blog/entry/[slug]</code> and was moving to <code>/blog/[slug]</code>.</p>
<p>I was aware this would break links from other websites, for which I setup redirects. And knew by the time I’d finally finish redeveloping the website on Next all the issues will have been ironed out.</p>
<p>Eventually, on the move over to Netlify it was easy to switch up and knowing that was done was something I thanked my past self for doing.</p>
<p>All it takes is a few lines of code in <code>netlify.toml</code> and using <code>:splat</code></p>
<pre><code class="language-toml">[[redirects]]
  from = &quot;/blog/entry/*&quot;
  to = &quot;/blog/:splat&quot;
  status = 301
  force = true
</code></pre>
<h3>Manually exporting posts to a file</h3>
<p>I knew there was a tedious task ahead getting each post into markdown files. This was not straightforward and had me debate whether it was the right thing to do. I persevered and I ended up creating an export template in ExpressionEngine which allowed me to format everything as plain markdown with frontmatter.</p>
<pre><code class="language-yaml">---
title:
date:
lastmod:
summary:
metadesc:
theme: &#39;#fff7e0&#39;
tags: [&#39;Design&#39;]
categories: [&#39;Design&#39;, &#39;Visual design&#39;]
images:
large:
medium:
ogImage: &#39;/opengraph-image.png&#39;
status: &#39;open&#39;
id:
fileroot:
---
</code></pre>
<p>I went overboard with this as I was unsure what I would and wouldn’t need. Which was better than figuring it out later and having to edit ~140 files again.</p>
<p>I went as far as using <code>fileroot</code> to avoid naming it as <code>slug</code>, <code>slugAsParams</code> or <code>url</code> or something likely to conflict with anything. Separate <code>summary</code> and <code>metadesc</code>. A lot of the stuff I anticipated needing, I didn’t. I’ll eventually clean this up.</p>
<p>By far the most tedious part of this job.</p>
<h2>Finally… the build</h2>
<p>Everything beyond the point of code was a much nicer in terms of effort required. I did have to compromise in areas, I didn’t want this to take any longer as I wanted to redesign the website. On top of having to get to grips with Next and how to build a blog website.</p>
<h3>Using a starter</h3>
<p>I found an <a href="https://github.com/timlrx/tailwind-nextjs-starter-blog">excellent Next.js starter</a> which covered the unfamiliar parts for me. It set me off immediately with Tailwind, search, MDX, newsletter handling and publishing script.</p>
<h3>Making components and keeping CSS as is</h3>
<p>I was able to move all CSS over as a global import and continue with Sass as this had always been.</p>
<p>I begun to break down the previous HTML and begin to create components. A lot of stuff was in partials previously in ExpressionEngine but it needed converting to React based components. This way of working is something I have desired for a while.</p>
<p>It was all ready to use and convert to a combination of CSS modules and Tailwind. For me, I like the way the components are managed, you keep all the associated style and behaviour closer together.</p>
<h3>Failing to sort posts</h3>
<p>The painful parts were sorting the posts on the homepage by view count, I couldn’t figure out a solution to this. I was able to track them without too much trouble following an article by <a href="https://codebycorey.com/blog/page-views-nextjs-supabase">Corey O’Donnell</a>. I used Supabase and it was linking the data together that wouldn’t happen for me.</p>
<p>Fortunately for version 8, I was able to get this working.</p>
<h3>Setting up the newsletter</h3>
<p>The newsletter subscription was challenging too. I did manage to figure it out and then it broke afterwards around 8 months later and took me a while to realise. Far better developers than I would probably say you need tests or something. Which is something I would like to explore.</p>
<p>But this is something I felt a real achievement in doing the overall behaviour of this is much more seamless and nicer. No third party JavaScript to insert anything. Just post from the page and update the state.</p>
<h3>Compromising on the search overlay</h3>
<p>I had to compromise on the search, I wasn’t able to get it to work as an overlay anymore. However, I was able to get it to search through the posts and show thanks to the starter.</p>
<p>It offered more of a live search experience which is a win. Not many use search, it worked and I wasn’t willing to put more time in to delay—so I accepted the tradeoff.</p>
<h2>Database to static complete</h2>
<p>But that’s my experience of moving from a database CMS to React framework. I find a lot of the additional conveniences a beneficial for developing the website and fixing small bugs here and there.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>About version 8</title>
      <link>https://iamsteve.me/blog/about-version-8</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/about-version-8</guid>
      <pubDate>Thu, 29 Feb 2024 10:13:38 GMT</pubDate>
      <description>Design and development decisions for the 8th version of this website. New design, using Next.js App Router and pretty much all in on Tailwind.</description>
      <content:encoded><![CDATA[<p>I had been wanting to redesign for a while—it’s been more than enough time. The previous design had been in place since late 2016—along with iterations throughout 2017. I think the design held up well, but it’s time for something new. And as with some form of tradition in writing about major changes here, I want to document some of the decisions.</p>
<h2>Goals</h2>
<p>There’s always goals when you set out to redesign outside of modernising the design and working towards something fresh.</p>
<ul>
<li>A new colour palette</li>
<li>A richer reading experience with MDX</li>
<li>Image flexibility</li>
<li>Use Next.js app router</li>
<li>Embrace Tailwind more</li>
</ul>
<h2>Design</h2>
<p>The design itself is a modernised version of what came before it. When I design something for myself or part of my own projects, I want to utilise the skills I have. It’s what makes it enjoyable.</p>
<p>I have evolved the design through the typography, illustration, colour and layout.</p>
<h3>Typography</h3>
<p>I’ve opted to move to two sans serif typefaces. They’re both grotesque’s, so they do complement each other.</p>
<p>I feel both are within the trends of where type is at currently. I’m drawn to type trends, the choice does carry how modern a design feels. The last version I used a typeface that was inline with the Circular/Product Sans popularity of the time.</p>
<figure>
  <div className="sandbox">
    <div className="bg-neutral-01-100 px-[4vmax] py-[10vmax] aspect-16/10 flex items-center">
      <span className="text-fern-1100 font-display lowercase text-[clamp(2.5rem,1.4565rem+5.2174vw,5.5rem)] block text-center font-variation-extrabold leading-7xl tracking-[-.1rem] lg:tracking-[-.15rem] text-balance">Exploring&nbsp;web design&nbsp;craft</span>
    </div>
  </div>
  <figcaption>Visual representation of the typeface Roc Grotesk</figcaption>
</figure>

<p>I chose Roc Grotesk for its strong presence, which I use for headings. I really like the proportions and the variety in widths and weights that come in a variable font.</p>
<figure>
  <div className="sandbox">
    <div className="bg-neutral-01-100 px-[10vmax] py-[10vmax] aspect-16/10 relative flex items-center justify-center">
      <div className="w-full flex items-center justify-center">
        <span className="text-fern-1100 font-body lowercase text-[clamp(1.3125rem,1.0734rem+1.1957vi,2rem)] leading-tight block text-center font-light leading-7xl tracking-[-.025rem] lg:tracking-[-.05rem] text-balance">Tips and tutorials about the design and build of web interfaces</span>
      </div>
    </div>
  </div>
  <figcaption>Visual representation of the typeface Elza</figcaption>
</figure>

<p>Whereas I’m using Elza for body copy, which is a better choice for reading, for a few reasons.</p>
<ul>
<li>The slightly larger x-height</li>
<li>More open characters</li>
<li>Characters like ‘a’, ‘e’ and ‘r’ feel better for reading</li>
</ul>
<h3>Colour</h3>
<p>The colour palette is familiar but renewed. My aim was to pair back the colour and really reserve that for post images and the occasional flourish. I achieve that through introducing more neutral colours and complementary colours that have a stronger contrast (eg: red vs green).</p>
<div className="sandbox">
  <div className="flex items-center justify-center gap-4 aspect-16/10 drop-shadow-placed">
    <span className="flex-1 h-full bg-rio-300 flex justify-center items-center rounded-lg shadow-placed"></span>
    <span className="flex-1 h-full bg-fern-1100 flex justify-center items-center rounded-lg shadow-placed"></span>
    <span className="flex-1 h-full bg-ui-body flex justify-center items-center rounded-lg shadow-placed"></span>
    <span className="flex-1 h-full bg-dandelion-200 flex justify-center items-center rounded-lg shadow-placed"></span>
    <span className="flex-1 h-full bg-neutral-01-150 flex justify-center items-center rounded-lg shadow-placed"></span>
  </div>
</div>

<p>I have made some sensible decisions with the colour palette—but I know myself I will likely change this over time. Overall, I want the website to less stark, less washed out and have more harmony.</p>
<h3>Monochrome or colour?</h3>
<p>I struggled with the amount of colour used throughout the website. It’s probably to do with how much I’ve looked at this design. But I’d like to show what the homepage hero would look like between the monochrome and colour variations.</p>
<figure>
  <div className="sandbox">
    <div className="bg-neutral-01-100  relative flex items-center justify-center group">
      <img src="/images/blog/about-version-8-hero-mono.svg" alt="Monochrome version of the homepage hero with heading and illustrations" width="1216" height="774" style="max-width: 100%; height: auto;" />
      <img src="/images/blog/about-version-8-hero-colour.svg" alt="Colour version of the homepage hero with heading and illustrations" width="1216" height="774" style="max-width: 100%; height: auto;" />
    </div>
  </div>
  <figcaption>Starting with the monochrome version of a hero image that contains a heading and various illustrations positioned in such a way. Hovering over the image to see the difference between a colour and monochrome versions.</figcaption>
</figure>

<h3>Slight structural changes</h3>
<p>Overall, throughout the website remains similar. I want to try divide the design and code categories and everything else into the archive.</p>
<h2>Design iteration</h2>
<p>It took a long time I felt for me to reach a point I was happy with the design.</p>
<p>I had a couple of clear directions and had I not decided to throw everything out I think this version would have been released much sooner.</p>
<figure style="margin: 2em 0;">
  <img src="/images/blog/about-version-8-early-01@2x.png" alt="One version of a highly colourful design. The sections are clearly divided throughout from the hero image, post sections and footer." width="848" height="2588" style="max-width: 100%; height: auto;" />
  <img src="/images/blog/about-version-8-early-02@2x.png" alt="Another version of a highly colourful design. The sections are clearly divided throughout except for the hero where it feels more blended as part of the page." width="848" height="2588" style="max-width: 100%; height: auto;" />
</figure>

<p>I felt confident in this direction for a while, but the more I looked at it the more I wasn’t happy with it. There was something I couldn’t correct with this and I also feel it would look dated quite quickly.</p>
<p>I liked where I was going with the navigation. And I liked the divided popular in sections, the numbers and chart ranking feel gave something different.</p>
<p>The one thing I feel with the design I have now, is it will hold up better over time. There’s loads of ideas I had and how I wanted to structure the homepage, but they were a bit too ambitious for the time being.</p>
<h3>Early mobile ideas</h3>
<figure style="margin: 2em 0;">
  <img src="/images/blog/about-version-8-mobile-home.svg" alt="Early mobile homepage design iteration" width="320" height="1000" style="max-width: 100%; height: auto;" />
  <img src="/images/blog/about-version-8-mobile-home-02.svg" alt="Alternative mobile homepage design iteration" width="308" height="1000" style="max-width: 100%; height: auto;" />
  <img src="/images/blog/about-version-8-mobile-article.svg" alt="Early mobile article page design iteration" width="320" height="1000" style="max-width: 100%; height: auto;" />
</figure>

<p>Mobile was where I kicked off the design, I wanted to not leave it as an afterthought even though it’s a small portion of the traffic. It felt easier to approach a redesign from mobile as well.</p>
<p>You can see within these examples some different directions I was thinking of heading.</p>
<h2>Rebuilding and moving to Next.js app router</h2>
<p>As part of the last version I decided to move to Next.js. This was a learning curve and using the pages router.</p>
<p>However, for this redesign that was flipped on its head with app router. I was expecting to reuse some of the more challenging elements of initially moving to Next.js.</p>
<p>I did try to transition to app router from pages but for me it didn’t work and as Vercel are clear this is the way forward I decided to do it from scratch.</p>
<h3>View counter</h3>
<p>I spent an inordinate amount of time on the view tracking—JavaScript development is not my best skill 😅. I referenced a lot of <a href="https://github.com/leerob/leerob.io">Lee Robinson’s</a> code as he had one in place, but there was a lot of figuring out required as I was using Supabase over Planetscale.</p>
<p>But this was much easier to setup view count sorting on the homepage which I wasn’t able to achieve previously. Swings and roundabouts.</p>
<h3>Pagination</h3>
<p>I felt pagination was surprisingly painful to do. I feel there’s some bugs in it but it seems to do the job. I referred to timlrx’s theme for this and customised to my needs.</p>
<h3>Contentlayer</h3>
<p>I discovered Contentlayer, which I really like from a publishing aspect. It adds a lot of flexibility to how you can get your content as there is a JSON representation of it.</p>
<p>You can also make your frontmatter typesafe, which is a nice benefit as I can force myself to make sure all needed frontmatter is present.</p>
<p>Otherwise I’m not bothered about types and typescript, it’s too much for me.</p>
<blockquote>
<p>Contentlayer appears it is no longer being maintained. I intend to replace it with <a href="https://github.com/zce/velite">velite</a> as this looks like the closest thing to it.</p>
</blockquote>
<h3>Better code highlighting</h3>
<p>Another place I had a load of faff with getting builds to work on Netlify. But I think in the end this was down to the node version I was using on Netlify even though I thought I was on a more up to date version.</p>
<p>I was resigned to using <code>rehype-pretty-code</code> but managed to get it all working with <code>rehype-prism-plus</code>. Which I was able to get a decent theme going, pretty code is far too limited in code highlighting.</p>
<p>And personally I find it easier to read when your brackets in HTML and JSX are the same colour as the tag, which wasn&#39;t achievable without using Prism.</p>
<h2>Using border-image for nicer borders</h2>
<p>The standard borders available in CSS aren’t desirable visually. You have <code>dotted</code>, <code>dashed</code> and not a lot else when it comes to controlling border style.</p>
<p>That’s where <code>border-image</code> comes to the rescue. Throughout the homepage and header sections of most pages I use a more visually pleasing border.</p>
<p>In terms of code it’s fairly simply but I don’t think <code>border-image</code> is easy to use. The border will break at certain screen widths but for the most part it’s fine.</p>
<h2>Container queries to create large and medium sized cards</h2>
<p>This has been a great opportunity to learn how to use container queries to build some things on this website.</p>
<p>It took some getting used to, as it’s no longer tied to the window size. I found it’s more getting over your years of being used to using media queries than a bit of new syntax.</p>
<p>It’s quite pleasing to have one component serve two purposes. If you look at the homepage, there are large cards with images and smaller cards without images. These also differ with font size and spacing.</p>
<h2>Grid and sub-grid to manage layout</h2>
<p>At the time of building this website, <code>subgrid</code> had become available, this means I can define the whole layout for the website from the <code>&lt;body&gt;</code>. Which makes it quite straightforward to orchestrate your layouts throughout breakpoints.</p>
<pre><code class="language-css">grid-template-columns:
  [margin-start]
  var(--grid-margin)
  [container-start]
  repeat(2, minmax(0, 1fr))
  [content-start]
  repeat(2, minmax(0, 1fr))
  [prose-start]
  repeat(8, minmax(0, 1fr))
  [prose-end]
  repeat(2, minmax(0, 1fr))
  [content-end]
  repeat(2, minmax(0, 1fr))
  [container-end]
  var(--grid-margin)
  [margin-end];
</code></pre>
<p>I have defined a few layouts, but the one here is for larger screen layouts. I have a few points where I can decide where to place content.</p>
<p>I still have some things to learn with grid, but I’m fairly confident with it.</p>
<h2>What’s next?</h2>
<p>There’s things I decided not to include for launch and spend more time figuring out how I want to approach them. I’ve a bit of learning to do for some of them, but they are…</p>
<ul>
<li>Categorisation of posts &amp; article cleanup</li>
<li>Publish new articles and find some rhythm of what I write about</li>
<li>Move from Contentlayer to <a href="https://github.com/zce/velite">Velite</a></li>
<li>Bug fixes and responsive improvements for less loved pages (eg: contact &amp; about)</li>
<li>Links archive</li>
<li>Notes section for updates and emerging articles</li>
<li>Different homepage structure as I add more content</li>
<li>Post improvements, better layout, content styling, etc.</li>
<li>Search</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>The best ink trap fonts for web design</title>
      <link>https://iamsteve.me/blog/the-best-ink-trap-typefaces-for-websites</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/the-best-ink-trap-typefaces-for-websites</guid>
      <pubDate>Wed, 28 Jul 2021 10:28:00 GMT</pubDate>
      <description>A look at type that features prominent cuts or tapering into the type and a variety of recommendations you can use in your designs.</description>
      <content:encoded><![CDATA[<p>If I think back to the first time I saw a typeface with ink traps, it was <a href="https://frerejones.com/families/retina">Retina</a> by Frere-Jones. I wasn’t immediately fond of the style at first, but trends have a habit of growing on you.</p>
<p>I’ve wanted an opportunity to look at this particular style of type—as I’ve worked on my portfolio and I consider a redesign for this website. Within this post I’m going to detail the things to look for and a bunch of typefaces.</p>
<h2>What details are you looking for?</h2>
<div className="article-image">
  <img src="/images/blog/ink-trap-example-01@2x.png" alt="Demonstrating the difference between two fonts with and without ink traps that are more obvious examples" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>The majority in this post will be ‘ink trap’ by definition, but some may use similarly exaggerated forms. As you can see in the example, Averta has a steady tapering towards the joins. Whereas, Whyte has angular notches, which give a sense of the individual letters having part missing.</p>
<div className="article-image">
  <img src="/images/blog/ink-trap-example-02@2x.png" alt="Demonstrating the difference between two fonts with and without ink traps that are less obvious examples" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Looking at another less apparent example, with Degular Display the tapering happens far quicker to create a stronger contrast. Unlike Whyte it isn’t as like a ridge, creating a different feel.</p>
<h2>What’s the purpose of an ink trap</h2>
<p>Ink traps retain legibility at smaller sizes in print. They’re carefully designed parts of type, which disappear when printed—due to the ink bleeding and filling in the gaps.</p>
<p>While it may display a certain way on screen, the appearance will change when printed. If you pay attention to printed material and notice the type isn’t as crisp as it could be, this could be down to the choice of typeface.</p>
<h3>What’s this got to do with websites?</h3>
<p>It can serve the same purpose on the web. Looking at the examples at smaller type sizes, ink traps help by opening spaces in the letters further. This can make legibility better at those sizes.</p>
<h2>Fonts</h2>
<p>Let’s get into the fonts that have this feature.</p>
<h3><a href="https://abcdinamo.com/typefaces/whyte">Whyte Inktrap</a></h3>
<div className="article-image">
  <img src="/images/blog/01-whyte@2x.png" alt="Whyte Inktrap typeface specimen" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>In terms of Ink trap fonts, I feel like Whyte could be the ‘<a href="/blog/alternatives-to-circular">Circular</a>’ of this style. The Figma website was the first time I’d come across Whyte and I’ve seen it used a few times elsewhere.</p>
<p>It feels futuristic, because of its curves on the ascenders—which goes against the feeling of a traditional grotesque. It surprised me how it remains legible at small sizes—even in the heavier weights—despite the ink traps being as prominent as they are.</p>
<h3><a href="https://fonts.adobe.com/fonts/degular">Degular</a></h3>
<div className="article-image">
  <img src="/images/blog/02-degular@2x.png" alt="Degular typeface specimen" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Available on Adobe Fonts and one of my favourite typefaces I’ve come across recently—I had to use it in my <a href="https://mcknny.com">portfolio</a>.</p>
<p>The first typeface by <a href="https://ohnotype.co">OH no Type Co</a> featured in this article. Which comes in three optical sizes, each with ink traps that lead to wonderfully exaggerated curves at the joins.</p>
<h3><a href="https://frerejones.com/families/retina">Retina</a></h3>
<div className="article-image">
  <img src="/images/blog/03-retina@2x.png" alt="Retina typeface specimen" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>It’s important to note the microplus version is where you see the ink traps.</p>
<p>In smallish sized lighter weights, it adds extra character. In larger sized heavier weights it feels overdone—which makes it have a much more limited use case.</p>
<h3><a href="https://www.gt-flexa.com">GT Flexa</a></h3>
<div className="article-image">
  <img src="/images/blog/04-gt-flexa@2x.png" alt="GT Flexa typeface specimen" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>An incredibly flexible and versatile typeface—to be fair it’s in the name—as the <a href="https://www.gt-flexa.com">website</a> will demonstrate. You could create endless compositions, I wish I could afford the full thing.</p>
<p>I enjoy the wide crossbars on the lowercase ‘t’ and ear of the lowercase ‘r’. They add a uniqueness.</p>
<h3><a href="https://pangrampangram.com/products/neue-machina">Neue Machina</a></h3>
<div className="article-image">
  <img src="/images/blog/05-neue-machina@2x.png" alt="Neue Machina typeface specimen" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>A typeface which has a lot of character, it has deep ridges at the joins for a real exaggerated style.</p>
<p>It has an almost monospace feel with the lowercase ‘a’, ‘i’ and ‘l’ which gives it a quite futuristic feel. But combining abrupt curves with lovely geometry, it feels unique but familiar.</p>
<h3><a href="https://www.futurefonts.xyz/studiotriple/jaune-grande">Juane Grande</a></h3>
<div className="article-image">
  <img src="/images/blog/06-juane-grande@2x.png" alt="Juane Grande typeface specimen" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>A typeface that throws out a lot of conventions. The bolder weights are particularly nice, the letters push the limits of legibility.</p>
<p>It’s as if this is what the Didone of the sans serif world would look like—with the characteristic contrast between thick and thin lines.</p>
<h3><a href="https://fonts.adobe.com/fonts/halyard">Halyard (text &amp; micro)</a></h3>
<div className="article-image">
  <img src="/images/blog/07-halyard@2x.png" alt="Halyard typeface specimen" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>At first it looks like a pretty plain sans serif, but on closer inspection at the micro variation, it feels delicate and legible.</p>
<p>The micro italic really embraces the ink traps and almost as if the letterforms were written. The italic lowercase ‘h’ and ‘p’ in the light weight are excellent.</p>
<p>On a similar level, the text version is slightly more subtle, but just as nice.</p>
<p>Albeit each of these have different intended use cases. I’d definitely use the micro italic with some tighter letter spacing for more decorative uses.</p>
<h3><a href="https://pangrampangram.com/products/fraktion">Fraktion Sans</a></h3>
<div className="article-image">
  <img src="/images/blog/08-fraktion-sans@2x.png" alt="Fraktion Sans typeface specimen" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Another option from Pangram Pangram, with plenty of weights and styles, it’s an option which is more on the compact side.</p>
<p>Like many of the choices in this article, it has an angular style about it. The lowercase ‘a’ is identical (or almost) to its monospace counterpart—which sets this typeface apart.</p>
<h3><a href="https://uxum.mdn.market">Uxum Grotesque</a></h3>
<div className="article-image">
  <img src="/images/blog/09-uxum-grotesque@2x.png" alt="Uxum Grotesque typeface specimen" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Uxum features a more subtle approach to ink traps. They have the depth of other typefaces, but are much finer. It creates a nice harmony and allows for unique characteristics—which sets itself apart from your Circular and FF Mark styles.</p>
<h3><a href="https://wearegradient.net/polysans/">Polysans</a></h3>
<div className="article-image">
  <img src="/images/blog/10-polysans@2x.png" alt="Polysans typeface specimen" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Polysans is similar to Uxum, in the sense it has much finer ink traps. It has a Helvetica feel about it, especially with lighter weights. The difference being it comes with proper italics.</p>
<h3><a href="https://fonts.adobe.com/fonts/covik-sans">Covik Sans / Mono</a></h3>
<div className="article-image">
  <img src="/images/blog/11-covik-sans@2x.png" alt="Covik Sans typeface specimen" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>The final OH no Type Co. option and it’s a push to include this as it doesn’t feature ink traps. It has a contrast to suggest, which is why I want to include it. It’s different to a lot of the type in this article too.</p>
<h3><a href="https://f37foundry.com/font-library/f37-jan/">F37 Jan</a></h3>
<div className="article-image">
  <img src="/images/blog/12-f37-jan@2x.png" alt="F37 Jan typeface specimen" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>If you’re looking for geometric type, then look no further than F37 Jan. It’s inspired by Matthew Carter’s Bell Centennial and Jan Tschichold’s Untitled Sans Serif—which makes for a great blend of styles.</p>
<p>The one thing I’d like to see is heavier weights as part of the set.</p>
<h3><a href="https://thedesignersfoundry.com/tomato-grotesk">Tomato Grotesk</a></h3>
<div className="article-image">
  <img src="/images/blog/13-tomato-grotesk@2x.png" alt="Tomato Grotesk typeface specimen" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>A typeface with a few unique properties of its own along with the ink traps. The double storey ‘a’ and lowercase ‘k’ have a unique style to them compared to others in this post.</p>
<h2>Google Fonts</h2>
<p>The availability of ink trap typefaces on Google Fonts is pretty good. There are a fair few options that compete with premium ink trap typefaces found within this article.</p>
<h3><a href="https://fonts.google.com/specimen/Bricolage+Grotesque">Bricolage Grotesque</a></h3>
<div className="article-image">
  <img src="/images/blog/the-best-ink-trap-typefaces-for-websites-bricolage-grotesque.svg" alt="Bricolage Grotesque typeface specimen" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>I’ve seen this used quite a lot, it’s very popular lately and has the strongest ink trap personality of all the Google Font examples. It has a similarity with Whyte Inktrap in terms of the prominent ink traps. But otherwise it has quite a fun look and feel.</p>
<h3><a href="https://fonts.google.com/specimen/Darker+Grotesque">Spline Sans</a></h3>
<div className="article-image">
  <img src="/images/blog/the-best-ink-trap-typefaces-for-websites-spline-sans.svg" alt="Spline Sans typeface specimen" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>
This reminds me a lot of Degular, but there are some subtle differences between the two. If you look closely at the 'e' you'll see where the crossbar joins it's completely rounded—a nice detail that’s characterised in other letters too.

<h3><a href="https://fonts.google.com/specimen/Darker+Grotesque">Spline Sans Mono</a></h3>
<div className="article-image">
  <img src="/images/blog/the-best-ink-trap-typefaces-for-websites-spline-sans-mono.svg" alt="Spline Sans Mono typeface specimen" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>
The mono space version of Spline Sans, also a variable typeface.

<h3><a href="https://fonts.google.com/specimen/Anek+Latin">Anek</a></h3>
<div className="article-image">
  <img src="/images/blog/the-best-ink-trap-typefaces-for-websites-anek.svg" alt="Anek typeface specimen" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Anek is a variable typeface, there&#39;s a good variety of weights and styles. It feels like a fairly balanced typeface with quite a large x-height that would be good for either headings or paragraphs.</p>
<h3><a href="https://fonts.google.com/specimen/Anybody">Anybody</a></h3>
<div className="article-image">
  <img src="/images/blog/the-best-ink-trap-typefaces-for-websites-anybody.svg" alt="Anybody typeface specimen" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>A subtle example again particularly in lighter weights. I like the uniqiue ascenders on the lowercase &#39;y&#39;.</p>
<h3><a href="https://fonts.google.com/specimen/DM+Sans">DM Sans</a></h3>
<div className="article-image">
  <img src="/images/blog/the-best-ink-trap-typefaces-for-websites-dm-sans.svg" alt="DM Sans typeface specimen" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>DM Sans is another example that’s pushing it, but it has a subtle tapering at the joins. I like the flatness of the double storey &#39;a&#39;.</p>
<h3><a href="https://fonts.google.com/specimen/Darker+Grotesque">Pathway Extreme</a></h3>
<div className="article-image">
  <img src="/images/blog/the-best-ink-trap-typefaces-for-websites-pathway-extreme.svg" alt="Pathway Extreme typeface specimen" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>
There’s a uniqueness to Pathway Extreme deep angular cuts that differ from typical ink traps. The thinner crossbars add personality if you were to use it as a display choice.

<h2>A style that’s grown on me</h2>
<p>As I reflect on it, it’s a nice response to the “plainer” sans serif typefaces that have dominated since 2015 give or take. It gives us more creative options for our designs without hindering legibility and readability of some of the more experimental typefaces out there.</p>
<p>Nonetheless, it’s an interesting use of a design detail that otherwise fulfilled a purpose. It’s grown on me and I feel it’s going to gain more popularity than it already has.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>‘Atomic’ font size management with Sass</title>
      <link>https://iamsteve.me/blog/atomic-font-size-management-with-sass</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/atomic-font-size-management-with-sass</guid>
      <pubDate>Wed, 13 Jun 2018 06:27:00 GMT</pubDate>
      <description>In a responsive world, managing font sizes can be tricky. So how can an atomic approach help?</description>
      <content:encoded><![CDATA[<p>Have you found yourself thinking: ‘how many times have I set this font size?’ If so, this post should help. Font size management is challenging, especially with responsive design. However, I’ve been using an ‘atomic’ approach with Sass which has made things easier.</p>
<h2>A very brief overview of tachyons/atomic CSS</h2>
<p>If you’re new to this style of writing CSS, the principle is generally to do one thing and do it well, and across multiple breakpoints.</p>
<p>In the example of font sizing, we’ll end up with CSS which looks somewhat like the following:</p>
<pre><code class="language-css">.f1 {
  font-size: 36px; }

/* and so on... */

.f6 {
  font-size: 16px; }

@media (min-width: 480px) {
  .f1-a {
    font-size: 36px; }

  /* and so on... */

  .f6-a {
    font-size: 16px; } }

@media (min-width: 960px) {
  .f1-d {
    font-size: 36px; }

  /* and so on... */

  .f6-d {
    font-size: 16px; } } }
</code></pre>
<p>You have multiple class names for applying one property across a set of media queries. The class names inside the media queries have a suffix which identifies them eg: <code>-a</code>. You may have more font sizes, you may have more breakpoints. The idea is speed, less repetitive writing of the same CSS and more consistency.</p>
<pre><code class="language-html">&lt;h1 class=&quot;f3 f2-a f1-d&quot;&gt;This is my heading&lt;/h1&gt;
&lt;p class=&quot;f6 f5-d&quot;&gt;This is my paragraph of text, lorem ipsum dolor sit.&lt;/p&gt;
</code></pre>
<p>There’s something nice about this approach to your HTML:</p>
<ol>
<li>Knowing which font size is applied at which media query</li>
<li>Knowing changes won’t affect anywhere else</li>
<li>Being able to trial sizes quickly</li>
<li>Knowing the font sizes are always part of your type scale</li>
</ol>
<p>Now, let’s get into the setup with Sass.</p>
<h2>To begin get your font sizes together</h2>
<p>Depending on the stage you find yourself at, be it the site is built, ready to build or in the design phase. The first step is to gather all the font sizes you currently have. This can also help identify where you may have too many.</p>
<h3>Add your font sizes to variables</h3>
<p>Next, add each of those font sizes to variables. They will be used within the next steps, it also helps keep things reusable.</p>
<pre><code class="language-scss">$f1: 36px;
$f2: 30px;
$f3: 24px;
$f4: 21px;
$f5: 18px;
$f6: 16px;
</code></pre>
<p>The naming of each variable isn’t make or break. For me <code>f1</code> through <code>f6</code> works well. The similarity is shared with <code>h1</code> through <code>h6</code>. <code>h1</code> is the larger and <code>h6</code> is the smaller. Also, it isn’t necessarily tied to being the ‘h’ of heading.</p>
<h3>Set up the initial font sizes</h3>
<p>Next, you need to choose a naming convention and write the CSS for your font sizes. These will be used as the lowest breakpoint, or when you don’t need the font size to change across the board.</p>
<pre><code class="language-scss">.f1 {
  font-size: $f1;
}
.f2 {
  font-size: $f2;
}
.f3 {
  font-size: $f3;
}
.f4 {
  font-size: $f4;
}
.f5 {
  font-size: $f5;
}
.f6 {
  font-size: $f6;
}
</code></pre>
<h3>Setting up a breakpoint map</h3>
<p>Now you need to decide how many breakpoints you want each font size to be applied at. I’m using three in the following example, but it’s entirely up to what your design requires.</p>
<pre><code class="language-scss">$a: 480px;
$b: 600px;
$c: 960px;
</code></pre>
<p>Define variables for your widths, like your font sizes. And again, naming isn’t hugely important, but I always recommend something short and memorable.</p>
<pre><code class="language-scss">$breakpoint-map: (
  &#39;a&#39;: $a,
  &#39;b&#39;: $b,
  &#39;c&#39;: $c,
);
</code></pre>
<p>The second step is to set up your breakpoint map. You want the keys (eg: <code>&#39;a&#39;</code>) to be named the same as your variables minus the <code>$</code>, the values of those keys are your variables.</p>
<h3>Looping through the breakpoint map and assigning font sizes</h3>
<p>The next step is where Sass does all the work for you and you will see the benefits of how quickly it can be adjusted.</p>
<pre><code class="language-scss">// Loop through the breakpoint map, assign each breakpoint to the relevant variable
// eg: $breakpoint-name = &#39;b&#39; and $breakpoint-width = 480px
@each $breakpoint-name, $breakpoint-width in $breakpoint-map {
  @media (min-width: $breakpoint-width) {
    .f1-#{$breakpoint-name} {
      font-size: $f1;
    }
    .f2-#{$breakpoint-name} {
      font-size: $f2;
    }
    .f3-#{$breakpoint-name} {
      font-size: $f3;
    }
    .f4-#{$breakpoint-name} {
      font-size: $f4;
    }
    .f5-#{$breakpoint-name} {
      font-size: $f5;
    }
    .f6-#{$breakpoint-name} {
      font-size: $f6;
    }
  }
}
</code></pre>
<p>What’s happening here is the <code>@each</code> loop is going through the <code>$breakpoint-map</code> and:</p>
<ol>
<li>Assigning each key (eg: <code>&#39;a&#39;</code>) to <code>$breakpoint-name</code> to every font size class</li>
<li>Assigning each value (eg: <code>$a</code>) to <code>$breakpoint-width</code> to every media query</li>
</ol>
<h3>Quick and easy to update</h3>
<p>The benefits of this approach versus doing it through manual CSS are fairly clear. It’s a matter of adding a new breakpoint to the map or quickly adjust on a per project basis. All you have to wait for is Sass to compile.</p>
<p>Even if your project doesn’t allow for Sass and you need to generate something quickly you can always use Codepen.</p>
<h2>Alternative: font size ‘locks’</h2>
<p>This approach gained some popularity a while ago now, but <a href="https://fvsch.com/code/css-locks/">CSS locks</a> can build upon this style of writing CSS further.</p>
<p>The main benefit of font size locks is having proportional font sizes no matter the screen size.</p>
<h3>A smart *calc()*ulation</h3>
<p>The linked article does a far better job of explaining the intricacies than I’m able to. Essentially you use <code>calc()</code> to have a minimum and maximum font size between two minimum and maximum screen widths.</p>
<pre><code class="language-scss">// overview
calc( min-font-size + ( ( max-font-size - min-font-size ) * ( 100vw - min-screen-width ) / ( max-screen-width - min-screen-width) ) )

// actual usage
calc( 16px + ( ( 24 - 16 ) * ( 100vw - 480 ) / ( 1280 - 480) ) )
</code></pre>
<p>I wouldn’t worry about understanding this too much, as the next step is to make a Sass function for easy use.</p>
<h3>Put it all in a Sass function</h3>
<p>To save remembering whether part of the calculation should or shouldn’t be a pixel value, you bundle it all together into a Sass function instead.</p>
<pre><code class="language-scss">@function font-size-lock(
  $min-font-size,
  $max-font-size,
  $min-screen-width,
  $max-screen-width
) {
  @return calc(
    #{$min-font-size} +
      (
        (#{strip-unit($max-font-size)} - #{strip-unit($min-font-size)}) * (
            100vw - #{$min-screen-width}
          ) /
          (#{strip-unit($max-screen-width)} - #{strip-unit($min-screen-width)})
      )
  );
}
</code></pre>
<p>There is also the use of a <code>strip-unit()</code> function because of the variables you set earlier. They can be used without breaking the calculations.</p>
<pre><code class="language-scss">@function strip-unit($number) {
  @if type-of($number) == &#39;number&#39; and not unitless($number) {
    @return $number / ($number * 0 + 1);
  }

  @return $number;
}
</code></pre>
<h3>Usage</h3>
<p>Drop those functions into your current setup and you’re good to go.</p>
<pre><code class="language-scss">.f1-l {
  font-size: font-size-lock($f3, $f1, 480px, 1200px);
}
</code></pre>
<h3>Set a restriction once you go beyond min/max screen size</h3>
<p>Beyond the screen sizes specified, you’ll find the font size will still increase and decrease. So to counter that you need to add a couple of media queries.</p>
<pre><code class="language-scss">// $f1: 36px;
// $f3: 24px;

.f1-l {
  font-size: $f3;

  @media (min-width: 480px) {
    font-size: font-size-lock($f3, $f1, 480px, 1200px);
  }

  @media (min-width: 1200px) {
    font-size: $f1;
  }
}
</code></pre>
<p>Now you have your font size starting at 24px, below 480px wide viewports. Then, beyond that it will scale between 24px and 36px, until 1200px. Finally, above 1200px the font size will not go beyond 36px.</p>
<h2>That’s it</h2>
<p>If you’re like me, the ability to keep track and be able to feel in control of your design implementation is the main reason this approach should grow on you.</p>
<p>Again, if you don’t use Sass or any preprocessor for that matter, you can still benefit, by using something like Codepen. Drop in the code and copy the output and you’re good to go.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Tips for using colour effectively in web illustration</title>
      <link>https://iamsteve.me/blog/tips-for-using-colour-effectively-in-web-illustration</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/tips-for-using-colour-effectively-in-web-illustration</guid>
      <pubDate>Thu, 10 May 2018 12:22:00 GMT</pubDate>
      <description>Our websites can offer us an important advantage when it comes to choosing colour for illustration—constraint.</description>
      <content:encoded><![CDATA[<p>Finding and settling on a way to use colour within your illustrations is a fun challenge. Once you do, it becomes much easier going forward to make them. In this post, I’ll share the things I have found worked for me.</p>
<h2>Choosing your colour palette</h2>
<p>The first thing to cover is choosing your palette. There are two approaches: you have an existing colour palette or you’re beginning a redesign in which you have more freedom.</p>
<h3>Use your existing colour palette</h3>
<p>If you have colours already determined for your website, why not use those as a starting point? Things will immediately feel more at home.</p>
<h3>Choose for your website first</h3>
<div className="article-image">
  <img src="/images/blog/colour-in-illustration-choose-for-website@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>A website colour palette will be made up of some neutral and some vibrant (or differing) colours, for the various uses throughout a website. These colours will offer a lot of choice for your illustrations too.</p>
<p>So, if you’re struggling initially, this is a good way to spark inspiration and find any gaps you may have in your selection.</p>
<h3>Let the choices be determined by the type of illustration</h3>
<p>For example, is your illustration more of a scene or character? The differing use case can determine the range of colours you will need.</p>
<div className="article-image">
  <img src="/images/blog/colour-in-illustration-scenic-illustration@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>A scenic illustration will need some neutral colours—with varying shades and tones. These are useful for adding detail to the background, so it doesn’t feel overwhelming. If you were to use vibrant and varied colour it would distract from the subject of the illustration.</p>
<p>Your vibrant colours should be used to draw the eye to the main subject of the illustration.</p>
<div className="article-image">
  <img src="/images/blog/colour-in-illustration-character-illustration@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>With a character based illustration, you’re going to need colour for smaller areas like eyes, variety for skin tones, and not have to worry as much about the issues of a larger scene.</p>
<h3>Use the colours &amp; refine during use</h3>
<p>I don’t think I’ve ever picked a colour palette and it’s right from the off. I can pick a set of colours which are reasonably close, but I tend to find things need tweaking.</p>
<h3>Don’t try to add every colour you will need</h3>
<p>If you already have a palette determined, use those colours as far as they will go. Use those colours in different ways and see how they combine.</p>
<p>This way you’ll keep your colour palette limited and potentially find creative combinations that you wouldn’t have without the restriction. Then, if you absolutely need to, you can add additional colours.</p>
<h2>Using your colour palette</h2>
<p>Using your palette consistently is one of the most challenging things.</p>
<h3>Think about the context and use</h3>
<p>I covered this to an extent earlier, but use case is important. If your illustration is the main feature, for example a large hero image, you have more freedom in the amount of colour you can use. Whereas if it’s a list of blog posts with individual featured images, you will be better served by keeping the colour restricted further.</p>
<h3>Don’t overwhelm small areas with lots of colour</h3>
<p>The balance of colour on the page is important, if many small images, have many colours, it’s going to feel busy and overwhelming.</p>
<figure>
<img src="/images/blog/colour-in-illustration-website-overview@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>By no means perfect, but you can see what I’ve aimed for with this website.</figcaption>
</figure>

<p>I have found using one or two stronger colours to be a good balance. Making use of neutral complementary tones for everything else. The aim is to bring focus to the main objects and again think of the surrounding areas.</p>
<h2>When shading and highlighting</h2>
<p>A successful set of illustrations feel harmonious together. Much of this is achieved through consistent stroke styles, highlights and shading.</p>
<h3>Make a range of tints</h3>
<p>This is a step to save you time and help with consistency. Each colour you have make lighter versions of it. You want a reasonably wide variety of them, with plenty of the lightest of colours as the change in lightness is more apparent.</p>
<div className="article-image">
  <img src="/images/blog/colour-in-illustration-light-tints@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>For example, you may increase the lightness by 20%–30% for the first few tints. Then decrease that to 5%, at the very lightest colours it becomes more obvious the difference.</p>
<h3>Make fewer tones and shades</h3>
<p>It’s much easier to get by on fewer tones and shades. As well, you don’t really want a huge variety in saturation or how dark these colours are.</p>
<p>You’ll use these if you intend to have outlines as part of your illustration. I recommend two darker colours for borders, one that’s a higher saturation and one that’s a lower saturation. There are different instances where the warmer and cooler colours will be a better fit.</p>
<figure>
<img src="/images/blog/colour-in-illustration-tones-shades@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>There are much fewer colours for shading. Higher saturation and lower saturation colours make the difference here.</figcaption>
</figure>

<p>The good thing with using one shade/tone for outline colour is when you apply a shadow you can reduce the opacity and the stroke is unaffected by the colour. Whereas, if you apply it to a highlight you’ve created a new colour, which more often than not doesn’t look ideal.</p>
<h3>Use a darker saturated colour for shadows</h3>
<p>When you use black, or add black to a colour to make a shadow it can feel unnatural. The colour goes muddier. There are two techniques for handling this:</p>
<ol>
<li>Make the colour darker and increase the saturation</li>
<li>Apply a black square over the colour with overlay/soft light blending mode then reduce opacity as needed</li>
</ol>
<p>It makes a subtle but important difference, I’ve spoke about this before in a <a href="https://iamsteve.me/blog/entry/visual-design-tips-you-can-apply-immediately">visual design tips post</a>. So this is at least one crossover between illustration and web/UI design.</p>
<h3>Make strokes a contrasting colour</h3>
<p>This can depend on the style you’re going for but the correct stroke colour is important. Make sure it contrasts well, it’s better it’s darker than too light. A stroke which is too light can make things feel off.</p>
<figure>
<img src="/images/blog/colour-in-illustration-stroke-colour@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>
This slightly exaggerated example, shows the difference a border with good contrast makes.
</figcaption>
</figure>

<p>There are other techniques for approaching things like shadows and strokes, but this approach is easier to remember.</p>
<h3>Watch out for colour clashes</h3>
<p>Colour clashes is possibly the wrong word here. Anyway, for example, you have lighter colour with a dark border, next to another dark colour, this can cause an awkward look with the colours.</p>
<div className="article-image">
  <img src="/images/blog/colour-in-illustration-colour-clash@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>A simple fix can be to change the darkest stroke to be above the lighter stroke, as the image demonstrates.</p>
<h2>Illustrator tips</h2>
<p>Here’s a few things where the power and features of illustrator can really help you out.</p>
<h3>Let Illustrator handle your tints, shades &amp; tones</h3>
<p>One thing I really love about Illustrator is the colour guide panel. It’s got a lot of power to help you quickly generate colour palettes with limited fuss. The amount of functionality it has is worth a post on its own, however, I’ll cover some things quickly.</p>
<div className="article-image">
  <img src="/images/blog/colour-in-illustration-colour-guide-panel@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Go to <code>Window &gt; Colour Guide</code> in the menu. From here you can choose which types of colours you’d like, from shades to the warmth of colour. You can change this by clicking the little icon to the top right of the panel.</p>
<p>You may also find the range of colours to be limited, by again clicking the little icon at the top right and going into the panel options you can expand the amount of colours you need. You can also add them to the <a href="https://iamsteve.me/blog/entry/how-to-use-swatches-in-illustrator">swatches panel for ease of use</a>.</p>
<h3>Select same</h3>
<p>In the menu you will find <code>Select &gt; Same</code>, if you haven’t used this before, I’m certain you’ll be using it a lot in the future. From here you’ll be able to quickly select and change fills, strokes and so on with ease.</p>
<h3>Refine or recolour with ‘Recolor Artwork’</h3>
<p>The colour adjustment tools within Illustrator are really powerful, especially ‘Recolor Artwork’. If you’re close to the colour palette you want, but things don’t feel as harmonious as you would like, these tools can really help.</p>
<div className="article-image">
  <img src="/images/blog/colour-in-illustration-recolour-artwork@2x.png" alt="" width="738" height="640" style="max-width: 100%; height: auto;" />
</div>

<p>Select all of your colours and go to <code>Edit &gt; Edit Colors &gt; Recolor Artwork</code>. From here you can adjust each colour individually, and once you click ok it will update all the colours.</p>
<p>Under the same <code>Edit &gt; Edit Colors</code> menu you can also find ‘Recolor with preset’, this is handy for reducing the amount of colour in an image or making it monochrome. You can get a totally different look and feel through this, it’s a useful tool otherwise meant for print related jobs.</p>
<h2>Finishing thoughts</h2>
<p>One of the things I try to put across a lot in my posts is <em>things aren’t final</em>. You’re entitled to change them later, especially with personal projects.</p>
<p>Iterating is important, once you become aware something isn’t working, don’t be afraid to put it to one side and start again. Even if this means you’ve put this work public, you can change it.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Nice and easy lazy loading with lazysizes.js</title>
      <link>https://iamsteve.me/blog/nice-and-easy-lazy-loading-with-lazysizes-js</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/nice-and-easy-lazy-loading-with-lazysizes-js</guid>
      <pubDate>Sun, 11 Feb 2018 19:58:00 GMT</pubDate>
      <description>Lazy loading doesn’t have to be difficult, here’s how to add smooth loading images to your website.</description>
      <content:encoded><![CDATA[<p>Images play a large part in the reason why websites continue to grow in page size. While they don’t affect performance as much as JavaScript, they remain a burden on data and loading times. In this post I want to show you how to add lazy loading images as part of your workflow.</p>
<h2>What makes a good lazy loaded image?</h2>
<p>Before I get into the how, I want to quickly list some things I believe makes good lazy loading.</p>
<ul>
<li>Has a fallback when JavaScript is disabled</li>
<li>Will work with srcset, retina, etc.</li>
<li>Doesn’t make the page ‘jump’ about as the images load</li>
<li>Doesn’t force you to change your markup structure</li>
<li>You can customise the loading</li>
<li>Doesn’t depend on the likes of jQuery</li>
</ul>
<p>The fact images don’t affect performance like JavaScript, and aren’t always needed in the page, this means you can <em>lazy load all the things</em> and reduce page size and requests significantly.</p>
<h3>Example</h3>
<p>Each of those things can be compared here, albeit you may need to view the Codepen on a slow connection!</p>
<div style="margin: 2em 0;">
    <iframe
      height="468"
      style="width: 100%;"
      scrolling="no"
      title="Lazy loading images"
      src="https://codepen.io/stevemckinney/embed/b513dec968b7749537ccbb8fd951532d?default-tab=result&theme-id=31700&editable=true"
      frameborder="0"
      loading="lazy"
      allowtransparency="true"
      allowfullscreen="true">
    </iframe>
  </div>

<h2>Lazy loading with lazysizes.js</h2>
<p>Now to get into how to achieve lazy loading, using lazysizes.js. You’re reasonably spoilt for choice and have a fair amount of libraries to choose from. I chose lazysizes.js for it’s vanilla JavaScript, simplicity, and plugins for extra functionality—like lazy loaded background images. It also has a bunch of events which you will utilise <a href="#using-events-in-javascript-to-clean-up-loading">later in this post</a>.</p>
<h3>Setup</h3>
<p>To begin using lazysizes, <a href="https://github.com/aFarkas/lazysizes/blob/gh-pages/lazysizes.min.js">download and include lazysizes.min.js</a> or <a href="https://github.com/aFarkas/lazysizes">a method that suits your project best</a>.</p>
<pre><code class="language-html">...everything else

&lt;script src=&quot;path/to/lazysizes.js&quot;&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<h3>Basic markup required for lazyloading images</h3>
<p>At it’s most basic there is no additional JavaScript setup required. It’s mostly done through HTML and CSS.</p>
<pre><code class="language-html">&lt;img
  data-src=&quot;image.jpg&quot;
  data-srcset=&quot;image.jpg 1x, image@2x.jpg 2x&quot;
  class=&quot;lazyload&quot;
/&gt;
</code></pre>
<p>The main differences here are relatively small, the <code>src</code> and <code>srcset</code> attributes become <code>data-src</code> and <code>data-srcset</code>. The <code>class</code> is a <em>requirement</em> too—many times I have forgot to add it.</p>
<p><em>That’s all you need to make your images lazy load</em>. However, left like this there will be no indication the image is loading and page load itself will feel janky.</p>
<h2>Making the load smoother</h2>
<p>To take away the page jank as images load, you need to use the <a href="https://alistapart.com/article/creating-intrinsic-ratios-for-video">intrinsic ratio technique</a> for sizing the images.</p>
<p>As the images don’t exist on page load, there is no way for the browser to know the dimensions. The browser can’t predict the space required, so once they load the page can feel jumpy. The way this is solved is by creating a ‘placeholder’ and positioning the image over that.</p>
<h3>Adjust the markup</h3>
<p>The first step to do this, is to adjust our current markup. The only change is to add a <code>div</code> round the image. This is so the image inside has a reference, to be placed and sized correctly.</p>
<pre><code class="language-html">&lt;div class=&quot;image loading&quot;&gt;
  &lt;img
    data-src=&quot;image.jpg&quot;
    data-srcset=&quot;image.jpg 1x, image@2x.jpg&quot;
    class=&quot;lazyload&quot;
  /&gt;
&lt;/div&gt;
&lt;noscript&gt;
  &lt;img
    src=&quot;image.jpg&quot;
    srcset=&quot;image.jpg 1x, image@2x.jpg&quot;
    class=&quot;image-fallback&quot;
  /&gt;
&lt;/noscript&gt;
</code></pre>
<p>The <code>image</code> class name will be used to apply the image sizing and placement with an intrinsic ratio. This <code>div</code> can also be used to indicate something is happening. So additionally a <code>loading</code> class name has been added.</p>
<h4>The fallback</h4>
<p>You’ll notice the <code>&lt;noscript&gt;</code> tag in there too. This is treated as a regular image, no data attributes. As when JavaScript is disabled this will show instead.</p>
<h3>The placeholder padding calculation</h3>
<p>Just before getting into the CSS, you need to understand how to calculate sizing the images. The size is applied with a percentage padding.</p>
<pre><code class="language-css">( height / width ) * 100
</code></pre>
<p>This calculation is based upon the aspect ratio of the image. To calculate this you divide the height by the width and multiply by 100.</p>
<h3>CSS for image sizing</h3>
<p>This is called <a href="https://alistapart.com/d/creating-intrinsic-ratios-for-video/example2.html">the intrinsic ratio method</a>, with a few additional lines of CSS, this sizes your image appropriately. A background gradient has been added to show something will be there.</p>
<pre><code class="language-scss">.image {
  position: relative;
  padding-bottom: 66.5492958%;

  // Tweak as needed
  background: linear-gradient(rgb(242, 242, 242) 66%, rgba(242, 242, 242, 0));
}

.image img {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 2;
}
</code></pre>
<p>Another benefit of lazy loading images is if the visitor doesn’t reach that image within the page it’s not something they have to download. For those with smaller data plans, it’s a good thing.</p>
<h3>CSS for loading indicator</h3>
<p>The <code>loading</code> class will apply the loading indicator and also be used in JavaScript later.</p>
<pre><code class="language-scss">@keyframes scaleout {
  0% {
    transform: scale(0);
  }

  100% {
    transform: scale(1);
    opacity: 0;
  }
}

.loading:before {
  content: &#39;&#39;;
  position: absolute;
  z-index: 1;
  top: 50%;
  left: 50%;
  margin-top: -16px;
  margin-left: -16px;
  width: 32px;
  height: 32px;
  border-radius: 32px;
  animation: scaleout 1.2s infinite ease-in-out;

  // Tweak as needed
  mix-blend-mode: soft-light;
  background-color: rgba(0, 0, 0, 0.9);
}
</code></pre>
<p>Essentially this is a kind of pulsing indicator using a pseudo element.</p>
<p>You’ll also notice <code>mix-blend-mode</code>, this will mean that the loading indicator looks ideal over any background. There are other ways to indicate loading, a more <a href="https://codepen.io/viktorstrate/pen/yoBRLy">skeleton style</a> or using <a href="http://tobiasahlin.com/spinkit/">other indicators</a>.</p>
<h3>CSS to fade the image in</h3>
<p>The final step to make it all seamless is to utilise the <code>lazyload</code> class. This was added to the <code>img</code> tag earlier and gets transformed into <code>lazyloaded</code>. You can use this to transition the opacity, or whatever you see fit.</p>
<pre><code class="language-css">.lazyload,
.lazyloading {
  opacity: 0;
}

.loading,
.lazyload,
.lazyloaded,
.image {
  opacity: 1;
  transition: 2s cubic-bezier(0.215, 0.61, 0.355, 1);
}
</code></pre>
<p>This bit of code appears a little messy, but each class is used at a different stage. So you need to ensure each of them has the appropriate transition and opacity.</p>
<h2>Using events in JavaScript to clean up loading</h2>
<p>lazysizes.js has a few events you can utilise to make changes. One of the things you can do is listen for the <code>lazyloaded</code> event and remove the <code>loading</code> class.</p>
<p>This can be used to stop the loading indicator running in the background. Which I can’t say for certain, but I’m sure it’ll help page performance slightly.</p>
<pre><code class="language-javascript">var lazy = function lazy() {
  document.addEventListener(&#39;lazyloaded&#39;, function (e) {
    e.target.parentNode.classList.add(&#39;image-loaded&#39;)
    e.target.parentNode.classList.remove(&#39;loading&#39;)
  })
}

lazy()
</code></pre>
<p>The code is calling a function called <code>lazy</code>. Inside this function there is an event listener waiting for the <code>lazyloaded</code> event to happen. This happens individually for each image as and when they have loaded.</p>
<p><code>addEventListener</code> allows you to pass a function as the second argument, which in this example using <code>e</code> will allow you to modify the image. In your anonymous function, to remove the <code>loading</code> class you need to look at the current element <code>e.target</code> and find its parent <code>parentNode</code>.</p>
<p>All combined that means <code>e.target.parentNode</code> will return the image. The <code>parentNode</code> in this instance is the <code>&lt;div&gt;</code> around the image and the class will be removed.</p>
<h2>What to do when JavaScript is disabled</h2>
<p>As mentioned earlier the need for the image to show when JavaScript is disabled. When JavaScript is disabled you will still have the leftovers from the image which will be lazy loaded.</p>
<p>In your <code>&lt;head&gt;</code> you can add some CSS to hide this. It’s the most reliable way to do so.</p>
<pre><code class="language-html">&lt;noscript&gt;
  &lt;style&gt;
    .image.loading {
      display: none;
    }
  &lt;/style&gt;
&lt;/noscript&gt;
</code></pre>
<p>With the code in place your design shouldn’t look out of place, for the times when JavaScript can fail and when it’s disabled.</p>
<h2>Flicker of a border around the image</h2>
<p>Occasionally you may see a default browser border, this is because there is no <code>src</code> defined in our example.</p>
<pre><code class="language-html">&lt;img
  src=&quot;data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==&quot;
  data-src=&quot;path/to/image.png&quot;
  data-srcset=&quot;path/to/image.png 1x, path/to/image@2x.png 2x&quot;
/&gt;
</code></pre>
<p>However, as recommended as part of the lazysizes.js documentation you can add a transparent pixel as the <code>src</code>. This overcomes that problem. In general use I rarely see it, so I haven’t included it as part of the examples. It can make your HTML look pretty messy too!</p>
<h2>Other effects</h2>
<p>Here are some other ways of transitioning in the image. Have a look at the code, the CSS used is towards the top.</p>
<div style="margin: 2em 0;">
    <iframe
      height="468"
      style="width: 100%;"
      scrolling="no"
      title="Lazy loading images - other effects"
      src="https://codepen.io/stevemckinney/embed/f774865f5cccdd31e4edae1ae74bc40a?default-tab=result&theme-id=31700&editable=true"
      frameborder="0"
      loading="lazy"
      allowtransparency="true"
      allowfullscreen="true">
    </iframe>
  </div>

<div style="margin: 2em 0;">
    <iframe
      height="468"
      style="width: 100%;"
      scrolling="no"
      title="Lazy loading images effects"
      src="https://codepen.io/stevemckinney/embed/KQaEEO?default-tab=result&theme-id=31700"
      frameborder="0"
      loading="lazy"
      allowtransparency="true"
      allowfullscreen="true">
    </iframe>
  </div>

<p>You may also want to apply the whole effect to the container, so the text transitions in too. The JavaScript would need some slight modifications, but it can somewhat double up as a scroll effects library.</p>
<h2>Summary</h2>
<p>When I first set out with lazy loading images, I thought it would be a real pain. It isn’t without extra work, but it isn’t a huge hassle unless it’s with background images.</p>
<p>With most use cases you will be using the <code>&lt;img&gt;</code> tag, with changes in the attribute names.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>A year in writing — 2017</title>
      <link>https://iamsteve.me/blog/a-year-in-writing-2017</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/a-year-in-writing-2017</guid>
      <pubDate>Sun, 28 Jan 2018 14:06:00 GMT</pubDate>
      <description>This year I took it at a slower pace with the articles. It was a year I felt I didn’t focus so much on this website, so I was quite surprised to see the website continue to grow.</description>
      <content:encoded><![CDATA[<p>This year I decided to take it at a slower pace with articles. It was a year I felt I didn’t focus so much on this website. I posted a lot less and stopped towards the end of the year. Still, I was quite surprised to see the website continue to grow.</p>
<h2>Summary</h2>
<p>These posts usually serve as a good way to start the year. I aim to reflect upon myself, the site and goals. I set out goals for 2016, but decided not to in 2017, at least not to do with this website.</p>
<ul>
<li><a href="#2017-in-reflection">2017 in reflection</a></li>
<li><a href="#website-year-in-review">Website year in review</a></li>
</ul>
<h2>2017 in reflection</h2>
<p>At the start of the year, I posted one final post which saw me complete my goal of posting weekly for two years. I had a break in mind as soon as I’d hit this. I returned with a monthly posting schedule, with the first post after the break coming in March.</p>
<p>The main reason for this was I couldn’t maintain weekly posting, as I was looking for a new job and building a portfolio.</p>
<h2>Going back to doing things just for fun</h2>
<p>This year was one I tried to really position myself as only being a designer. It put a lot of pressure on myself to make design only posts, I wrote less about code.</p>
<p>I originally started designing websites many years ago for fun. I started writing this website for fun and learning too. Over time, I feel like I’ve taken things too seriously—which isn’t me. The pressure I put on myself to be seen as ‘only a designer’ was wrong.</p>
<p>It was part of what had a knock on effect. As well as, things happening in my life and trying to succeed with finding a new job, I lost motivation.</p>
<h3>Finding motivation again and not over doing it</h3>
<p>I avoided a lot of topics to keep things design focused. I had planned to change it and go back to an earlier idea of designing and coding. It’s too much work, I was being far too much of a perfectionist.</p>
<p>If I find myself posting regularly again, the content will be mixed between design and code. There’s benefits to each type of post, and it allows me to manage my time better.</p>
<h2>Website year in review</h2>
<p>This was a good year in terms of website visits and newsletter subscribers. Overall, traffic had a couple of spikes, but grew steadily. The same can be said of newsletter subscribers as well.</p>
<h3>Things of note</h3>
<p>In 2016 I got featured by a couple of prominent people in the industry, and this year was similar but with a couple of prominent websites instead. It’s always a pleasant surprise when it happens and I appreciate it.</p>
<p>I had the design submitted to <a href="https://www.siteinspire.com/websites/7248-iamsteve">Site Inspire</a> and <a href="https://www.awwwards.com/inspiration/59229dd0e13823488515d459">one</a> or <a href="https://www.awwwards.com/inspiration/59085f66e1382337ca672908">two</a> articles popped up on Awwwards. This all happened between the end of April and early May. Gallery features, tweets and some other social stuff meant a high of nearly 20k sessions for the month of June! I believe at one stage I saw nearly 50 people online.</p>
<p>From what I can gather it was a bit of a snowball effect from the website being submitted to <a href="https://bestwebsite.gallery/sites/sotd/2017/04/27/i-am-steve">bestwebsite.gallery</a>. I’m really grateful for those submissions. It brought a huge amount of traffic and newsletter subscribers (by my standards at least).</p>
<h3>Website updates</h3>
<p>I released a redesign at the end of August 2016. With many plans for improvements, 2017 allowed me to work on improving iteratively. This is what I call my own iterating in public experience.</p>
<p>Over the course of the year I’d made some bigger changes but many small improvements and bug fixes. Some notable changes and additions were:</p>
<ul>
<li>New header area with illustration and lettering</li>
<li>New illustration for the newsletter</li>
<li>Footer updates</li>
<li>Navigation and search updates</li>
<li>About tweaks</li>
<li>Uses page</li>
<li>Contact update</li>
<li>Progressive web app</li>
<li>Critical CSS</li>
<li>Lazy loading images</li>
</ul>
<div className="article-image">
  <img src="/images/blog/homepage-change@2x.png" alt="" width="1024" height="480" style="max-width: 100%; height: auto;" />
</div>

<p>There’s quite a change between these two homepages. It seems people resonated more with the full width hero area in terms of design.</p>
<p>The rest of the changes have been mostly around visual refinement. Adhering to a more rigid grid and alignment throughout. Objectively those changes have made for a nicer flow through out the page. Less of the wide narrow wide narrow layouts.</p>
<h3>Visits month by month</h3>
<p>A comparison table of visits in 2017, 2016 and 2015.</p>
<table>
<thead>
<tr>
<th align="left">Month</th>
<th align="center">Visits 2017</th>
<th align="center">Visits 2016</th>
<th align="right">Visits 2015</th>
</tr>
</thead>
<tbody><tr>
<td align="left">January</td>
<td align="center">6466</td>
<td align="center">2784</td>
<td align="right">735</td>
</tr>
<tr>
<td align="left">February</td>
<td align="center">7251</td>
<td align="center">3140</td>
<td align="right">870</td>
</tr>
<tr>
<td align="left">March</td>
<td align="center">8218</td>
<td align="center">5124</td>
<td align="right">1122</td>
</tr>
<tr>
<td align="left">April</td>
<td align="center">8323</td>
<td align="center">3830</td>
<td align="right">1099</td>
</tr>
<tr>
<td align="left">May</td>
<td align="center">19475</td>
<td align="center">4324</td>
<td align="right">1229</td>
</tr>
<tr>
<td align="left">June</td>
<td align="center">11434</td>
<td align="center">4544</td>
<td align="right">1338</td>
</tr>
<tr>
<td align="left">July</td>
<td align="center">10598</td>
<td align="center">4655</td>
<td align="right">1473</td>
</tr>
<tr>
<td align="left">August</td>
<td align="center">11061</td>
<td align="center">4592</td>
<td align="right">1772</td>
</tr>
<tr>
<td align="left">September</td>
<td align="center">11315</td>
<td align="center">5855</td>
<td align="right">2110</td>
</tr>
<tr>
<td align="left">October</td>
<td align="center">13378</td>
<td align="center">6390</td>
<td align="right">2310</td>
</tr>
<tr>
<td align="left">November</td>
<td align="center">13323</td>
<td align="center">6939</td>
<td align="right">2488</td>
</tr>
<tr>
<td align="left">December</td>
<td align="center">11578</td>
<td align="center">5941</td>
<td align="right">2545</td>
</tr>
</tbody></table>
<p>You can see the biggest month was May, the features mentioned earlier was the influence. It dropped off, but has maintained a nice increase overall.</p>
<p>Comparing to the previous two years you can see the difference writing consistently has made. Albeit this year has been dramatically reduced.</p>
<h3>Visits by notable browser</h3>
<p>No surprises here, as always Chrome is the runaway leader, with Safari and Firefox the next biggest browsers.</p>
<table>
<thead>
<tr>
<th align="left">Browser</th>
<th align="center">Visits 2017</th>
<th align="center">Visits 2016</th>
<th align="right">Visits 2015</th>
</tr>
</thead>
<tbody><tr>
<td align="left">Chrome</td>
<td align="center">78314</td>
<td align="center">38569</td>
<td align="right">12484</td>
</tr>
<tr>
<td align="left">Safari (+ Mobile)</td>
<td align="center">12505</td>
<td align="center">5295</td>
<td align="right">1530</td>
</tr>
<tr>
<td align="left">Firefox</td>
<td align="center">10235</td>
<td align="center">7161</td>
<td align="right">2955</td>
</tr>
<tr>
<td align="left">IE</td>
<td align="center">1155</td>
<td align="center">1027</td>
<td align="right">683</td>
</tr>
<tr>
<td align="left">Opera</td>
<td align="center">773</td>
<td align="center">476</td>
<td align="right">148</td>
</tr>
<tr>
<td align="left">Edge</td>
<td align="center">580</td>
<td align="center">219</td>
<td align="right">23</td>
</tr>
</tbody></table>
<h3>Top 10 read articles</h3>
<p>It’s nice to see some of the newer articles I have wrote move into this list in comparison to last year.</p>
<ol>
<li><a href="/blog/horizontal-scrolling-responsive-menu">Creating a horizontal scrolling responsive menu</a></li>
<li><a href="/blog/creating-custom-stroke-width-profiles-in-illustrator">Creating custom stroke width profiles in Illustrator</a></li>
<li><a href="https://iamsteve.me/blog/entry/alternatives-to-circular">Alternatives to Circular</a></li>
<li><a href="/blog/using-flexbox-for-horizontal-scrolling-navigation">Using flexbox for horizontal scrolling navigation</a></li>
<li><a href="/blog/enhancing-horizontal-scrolling-with-flickity-js">Enhancing horizontal scrolling with flickity.js</a></li>
<li><a href="https://iamsteve.me/blog/entry/multiple-level-horizontal-scrolling-navigation">Multiple level horizontal scrolling</a></li>
<li><a href="https://iamsteve.me/blog/entry/how-to-use-kerning-tracking">How to use kerning and tracking</a></li>
<li><a href="/blog/a-guide-to-vertical-rhythm">A guide to vertical rhythm</a></li>
<li><a href="https://iamsteve.me/blog/entry/how-to-flexible-squares-with-css">How to flexible squares with CSS</a></li>
<li><a href="https://iamsteve.me/blog/entry/websites-using-alternatives-to-the-hamburger">Websites using alternatives to the hamburger</a></li>
</ol>
<h3>Summary of the year</h3>
<figure>
<img src="/images/blog/summary-2017@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>Sessions: 131.2k, users: 103.8k, page views: 263.9k, pages per session: 2.01, avg. session: 1m 17s.</figcaption>
</figure>

<p>I was quietly hoping to double traffic, last year was 58k and this year was 131k, so it’s definitely exceeded expectations. One of the surprises is the average of 2 pages per session, this was around 1.4 last year.</p>
<p>The most important thing for me is to keep readers returning. I can only do that by giving reason to keep coming back. I aim to do this, but without pressuring myself too much.</p>
<h2>Goals for 2018</h2>
<p>This year again, it’s going to be things which I’d like to do, rather than hold myself to (aside from one or two):</p>
<ul>
<li>Get back to a more regular posting schedule</li>
<li>Find a healthy balance between life and creating</li>
<li>Follow ‘if it’s not hell yes, then it’s no’ better</li>
<li>Make more improvements to the website</li>
<li>Upgrade the website to the latest ExpressionEngine</li>
<li>Look at ways to make better use of my email list</li>
</ul>
<p>I hope you have a good year ahead.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Illustrator quick tip: which stroke alignment?</title>
      <link>https://iamsteve.me/blog/illustrator-tip-which-stroke-alignment</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/illustrator-tip-which-stroke-alignment</guid>
      <pubDate>Thu, 21 Sep 2017 08:00:00 GMT</pubDate>
      <description>There are three types of stroke alignment, so when and where is each useful?</description>
      <content:encoded><![CDATA[<p>One of the things you may face with applying a stroke to an object in Illustrator, is which of the three alignments should you use? Each type has its own advantages and disadvantages, which this post will explore.</p>
<h2>9 times out of 10 you should stick with centre</h2>
<div className="article-image">
  <img src="/images/blog/illustrator-stroke-stroke-panel@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>There are three alignments, centre, inside and outside. You’ll see there are subtle differences between them. Each make the look and feel of an object slightly different. They also behave differently with caps and corners.</p>
<figure>
<img src="/images/blog/illustrator-stroke-compare-all-alignments@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>Each of these squares are the same size, but using a different stroke alignment.</figcaption>
</figure>

<p>At first it looks like the squares are made larger. However, to summarise this post quickly, you should almost always use centre. Why? I’ll get into the details now.</p>
<h2>Inside alignment</h2>
<p>Aligning your strokes to the inside is by far the easiest to manage. It doesn’t affect the dimensions of your object, the size you make, is the size you export. However, there are two downsides to keep in mind.</p>
<h3>Inside doesn’t accommodate stroke caps</h3>
<figure>
<img src="/images/blog/illustrator-stroke-compare-centre-inside-caps@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>The centre stroke has round corner joins. As does the inside but you can’t tell.</figcaption>
</figure>

<p>The biggest negative of inside alignment is no stroke caps. If rounded caps and joins are part of your style, you won’t be able to achieve them as easily. You would need to expand the object and do it manually—no thanks.</p>
<h3>Open paths are only central without a custom stroke width</h3>
<p>If your design style doesn&#39;t require stroke caps, you still need to watch out when drawing paths which aren’t closed. It may be tricky to achieve consistency. As they will always align to the centre, you can overcome this by making a <a href="/blog/creating-custom-stroke-width-profiles-in-illustrator">custom stroke width profile</a>.</p>
<h2>Outside alignment</h2>
<p>The outside stroke is one of the trickier ones to use and it’s not one I’d personally recommend using unless you’re in a rush. It’s suitable for complex shapes, with intricate areas which you want to retain those details.</p>
<h3>Different dimensions on save</h3>
<p>As the stroke is applied completely round the outside the size will appear the same (in Illustrator). However, on saving it will increase. This is the main thing to be aware of.</p>
<p>If you were intent on having a particular size, you may find your design to be off in those areas. For example, if you were to make a 16px favicon, which had a 1px stroke on the outside your favicon would be 18px.</p>
<h3>Difficult to align</h3>
<p>With the stroke not being accounted for in the dimensions it can make things trickier to align precisely. You’ll find things snap or line up using guides, but you’ll need to nudge the object over slightly each time.</p>
<h3>Corner radius feels off</h3>
<figure>
<img src="/images/blog/illustrator-stroke-centre-outside-compare@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>The outside alignment corners are rounder than centre alignment corners.</figcaption>
</figure>

<p>As demonstrated in the image you will see the centre and outside stroke alignments. <a href="/visual-design-tips-you-can-apply-immediately#12-make-sure-your-nested-corner-radius-account-for-the-outer-radius">Having the correct corner radius</a> can make things feel more intentional.</p>
<h2>Centre alignment</h2>
<p>Finally, with centre it’s the default. As it’s the only available option until a path is closed. I aim to use the majority of the time, though it’s not without its ‘gotchas’.</p>
<h3>Different dimensions and alignment is off</h3>
<p>Again, as the stroke isn’t positioned inside the path the dimensions are different. You’ll also need to also nudge things over slightly to account for the stroke when aligning things precisely.</p>
<h3>Centre is better for stroke caps and corners</h3>
<p>As mentioned previously, inside alignment doesn’t account for stroke caps and corners. The outside does to an extent, but things like inner corner radii can feel off.</p>
<h3>Centre is better for SVG</h3>
<p>When you use inside or outside for stroke alignment the exported paths have a fill. When you export with a centre alignment you have access to all the stroke properties. This allows you to adjust the width, caps and joins without having to save it out again.</p>
<h2>Stroke caps</h2>
<div className="article-image">
  <img src="/images/blog/illustrator-stroke-cap-comparisons@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>When you add a stroke cap that’s rounded or projecting. It can also affect the dimensions, as it extends beyond the anchor point. This is something to be aware of when you require exact dimensions when a path isn’t closed.</p>
<h2>The solution: a template</h2>
<p>If centre is the best, how do you size things reliably? The answer is to make a template and use a grid &amp; guides.</p>
<h3>Enable guides</h3>
<div className="article-image">
  <img src="/images/blog/illustrator-stroke-grid-preferences@2x.png" alt="" width="896" height="736" style="max-width: 100%; height: auto;" />
</div>

<p>Go in to the <code>Illustrator menu &gt; Preferences &gt; Guides &amp; Grid</code>, to setup your grid. Change ‘gridline every’ to be the size of the object you’re making. Add the same value in subdivisions (or fewer if it suits you better). This way you&#39;ll end up with a reliable pixel grid.</p>
<h3>Enable snap to grid &amp; snap to pixel</h3>
<p>You can enable these under <code>View &gt; Snap to Grid</code> and <code>View &gt; Snap to Pixel</code>.</p>
<p>Enabling these initially will help with sizing the template quickly. Keeping snap to pixel enabled will ensure things stay on the pixel grid where possible.</p>
<h3>Draw a square the size of the object</h3>
<div className="article-image">
  <img src="/images/blog/illustrator-stroke-template-initial@2x.png" alt="" width="896" height="736" style="max-width: 100%; height: auto;" />
</div>

<p>In this example I want to have a 32px icon. So using the rectangle tool by pressing <kbd>m</kbd> and draw a 32px rectangle.</p>
<h3>Draw another rectangle minus the stroke width (optional)</h3>
<div className="article-image">
  <img src="/images/blog/illustrator-stroke-template-complete@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>This step is optional, as it serves as more of a reminder, for the place your points should start from. Once a stroke is applied it will go into the defined area.</p>
<div className="article-image">
  <img src="/images/blog/illustrator-stroke-guides-enabled@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>The size here depends on the stroke width you intend to use. When aligning centrally you can take the stroke size minus the overall width. In this case of 32px, it would be a 31px inner square with a 1px stroke. With a 2px stroke it would be 30px, as half of the stroke is positioned either side of the path.</p>
<h3>On export or aligning</h3>
<p>When exporting you’ll want to remove the fill applied (if there is one) and group the objects together <kbd><kbd>cmd</kbd> + <kbd>g</kbd></kbd>.</p>
<p>Grouping the template and object together is ideal for aligning. It’s also useful if you have icons, everything will scale consistently too.</p>
<h2>That’s everything</h2>
<p>This is the way to get all the benefits of having a centre stroke. So if you want round caps and joins, you can. You don’t have to worry about alignment, and scaling proportionally.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Search overlay with smooth reveal animation</title>
      <link>https://iamsteve.me/blog/search-overlay-with-smooth-reveal-animation</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/search-overlay-with-smooth-reveal-animation</guid>
      <pubDate>Wed, 16 Aug 2017 12:15:00 GMT</pubDate>
      <description>A common part of a website is the ability to search. Depending on how important search is to your website can define much of how it looks and how it’s prioritised in the design.</description>
      <content:encoded><![CDATA[<p>Search is a common function of a website, app, etc. Depending on how important search is to your users can define how it’s prioritised and looks within your design.</p>
<p>In this post, I want to show you how to create a search which appears with a smooth transition on the click or tap of a button.</p>
<h2>What you&#39;re making</h2>
<p>If you&#39;d like to grab any of the code and skip the post feel free to browse the CodePen.</p>
<div style="margin: 2em 0;">
    <iframe
      height="520"
      style="width: 100%;"
      scrolling="no"
      title="Search overlay"
      src="https://codepen.io/stevemckinney/embed/bab51a2f0032bd24e33f24b48ca39acb?default-tab=result&theme-id=23161"
      frameborder="0"
      loading="lazy"
      allowtransparency="true"
      allowfullscreen="true">
    </iframe>
  </div>

<p>All code and design files can be downloaded for <a href="#subscribe">being part of my list</a>.</p>
<h2>Design: overview</h2>
<p>Here’s the design you’ll be making. It’s quite simple, so I have avoided a walk through as the designs themselves serve as a place to explain.</p>
<h3>Search overlay</h3>
<div className="article-image">
  <img src="/images/blog/search-reveal-large@2x.png" alt="Desktop search overlay design with large input field and icons" width="896" height="504" style="max-width: 100%; height: auto;" />
</div>

<p>Overall, the design aims to visually grab the attention. It makes use of the screen size available through the large input and icons. I wanted the form to appear ‘clickable’ through having clearly a defined input. As you see some which do away with the defined field approach.</p>
<p>There are a couple of shadows applied to the search field itself. A smaller shadow to add intensity to the bottom, and another with larger radius to make it feel more realistic. The shadow is a darker version of the background which makes things feel intentional.</p>
<p>The background has a subtle gradient, the aim is for it to have a sense of depth as it transitions over the existing background.</p>
<h3>Small screen</h3>
<div className="article-image">
  <img src="/images/blog/search-reveal-small@2x.png" alt="Small screen search overlay design with input positioned at the bottom" width="738" height="631" style="max-width: 100%; height: auto;" />
</div>

<p>For smaller screens, I&#39;ve opted to move the search to the bottom of the screen. This means it’s easier to reach, as you can focus on the input with JavaScript, but it doesn’t always bring up the keyboard.</p>
<p>Things are sized more according to the screen size, with the icons and form field. Aside from them, nothing else has changed.</p>
<h2>Icon setup</h2>
<div className="article-image">
  <img src="/images/blog/search-reveal-icons@2x.png" alt="Search and close icons at 32px and 24px sizes" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>The icons are designed on at 32px x 32px and scaled down to 24px x 24px for the small screen design. <a href="https://www.dropbox.com/s/jgm07uywlt18hbh/design-code-search-overlay-icons.ai?dl=0">You can download the two icons used</a> for your design.</p>
<h2>HTML</h2>
<p>Let’s get into making this usable, starting with HTML. The summary of the markup you need: button to open, button to close, overlay and the form.</p>
<h3>Open button</h3>
<p>The button is an anchor tag, with an SVG inside. This allows us to style and reuse the icon easily. Pasting this code into your editor without CSS will mean the icon will be a black square.</p>
<pre><code class="language-html">&lt;a href=&quot;#link-to-search&quot; class=&quot;button button-open&quot;&gt;
  &lt;svg
    xmlns=&quot;http://www.w3.org/2000/svg&quot;
    width=&quot;32&quot;
    height=&quot;32&quot;
    viewBox=&quot;0 0 32 32&quot;
    class=&quot;icon&quot;
  &gt;
    &lt;rect class=&quot;fill-none&quot; width=&quot;32&quot; height=&quot;32&quot; /&gt;
    &lt;path
      class=&quot;fill-currentcolor&quot;
      d=&quot;M29.82861,24.17139,25.56519,19.908A13.0381,13.0381,0,1,0,19.908,25.56525l4.26343,4.26337a4.00026,4.00026,0,0,0,5.65723-5.65723ZM5,14a9,9,0,1,1,9,9A9.00984,9.00984,0,0,1,5,14Z&quot;
    /&gt;
  &lt;/svg&gt;
&lt;/a&gt;
</code></pre>
<p>The class names <code>button</code> and <code>button-open</code> will be used for both styling and JavaScript later in the post. The <code>href</code> should ideally link to a fallback search page, should JavaScript fail or be disabled.</p>
<blockquote>
<p>You may notice the icon has several class names applied to it. I’ve detailed my process about <a href="/blog/lets-make-a-better-icon-system-with-svg">how I use SVG for icons before</a>.</p>
</blockquote>
<h3>Overlay</h3>
<p>The overlay itself is a <code>&lt;div&gt;</code> tag round a form. Each element inside the form has an appropriate class to be used for styling.</p>
<pre><code class="language-html">&lt;div class=&quot;overlay hiding&quot;&gt;
  &lt;!-- Form markup here --&gt;
&lt;/div&gt;
</code></pre>
<p>You will notice the overlay has two class names. <code>overlay</code> and <code>hiding</code> all general styling will be applied to <code>.overlay</code>. <code>.hiding</code> will have styles which hide the element and will be transitioned to <code>.showing</code>.</p>
<p>This approach helps keep our CSS more maintainable. As when you switch class names there is less to override.</p>
<h3>Close button</h3>
<p>Similar to the open button, the icon and class name are different.</p>
<pre><code class="language-html">&lt;button class=&quot;button button-close&quot;&gt;
  &lt;svg
    xmlns=&quot;http://www.w3.org/2000/svg&quot;
    width=&quot;32&quot;
    height=&quot;32&quot;
    viewBox=&quot;0 0 32 32&quot;
    class=&quot;icon&quot;
  &gt;
    &lt;rect class=&quot;fill-none&quot; width=&quot;32&quot; height=&quot;32&quot; /&gt;
    &lt;path
      class=&quot;fill-currentcolor&quot;
      d=&quot;M18.82813,16,29.41406,5.41406a1.99979,1.99979,0,0,0-2.82812-2.82812L16,13.17188,5.41406,2.58594A1.99979,1.99979,0,0,0,2.58594,5.41406L13.17188,16,2.58594,26.58594a1.99979,1.99979,0,1,0,2.82813,2.82813L16,18.82813,26.58594,29.41406a1.99979,1.99979,0,0,0,2.82813-2.82812Z&quot;
    /&gt;
  &lt;/svg&gt;
&lt;/button&gt;
</code></pre>
<h3>Search form</h3>
<p>The form markup should be placed inside the overlay <code>&lt;div&gt;</code>.</p>
<pre><code class="language-html">&lt;form action=&quot;#&quot; class=&quot;form-search&quot;&gt;
  &lt;label for=&quot;keywords&quot; class=&quot;visuallyhidden&quot;&gt;Search&lt;/label&gt;
  &lt;input
    class=&quot;input input-search&quot;
    id=&quot;keywords&quot;
    name=&quot;keywords&quot;
    type=&quot;search&quot;
    placeholder=&quot;Find something…&quot;
    autocorrect=&quot;off&quot;
    autocapitalize=&quot;off&quot;
    required
  /&gt;
  &lt;button type=&quot;submit&quot; class=&quot;button button-search&quot;&gt;
    &lt;svg
      xmlns=&quot;http://www.w3.org/2000/svg&quot;
      width=&quot;32&quot;
      height=&quot;32&quot;
      viewBox=&quot;0 0 32 32&quot;
      class=&quot;icon&quot;
    &gt;
      &lt;rect class=&quot;fill-none&quot; width=&quot;32&quot; height=&quot;32&quot; /&gt;
      &lt;path
        class=&quot;fill-currentcolor&quot;
        d=&quot;M29.82861,24.17139,25.56519,19.908A13.0381,13.0381,0,1,0,19.908,25.56525l4.26343,4.26337a4.00026,4.00026,0,0,0,5.65723-5.65723ZM5,14a9,9,0,1,1,9,9A9.00984,9.00984,0,0,1,5,14Z&quot;
      /&gt;
    &lt;/svg&gt;
  &lt;/button&gt;
&lt;/form&gt;
</code></pre>
<p>The form markup isn&#39;t complex and each individual element has a relevant class name. Which will be used for styling later. The icon is the same one used earlier (ideally the repetition would be avoided).</p>
<blockquote>
<p>You should be able to adjust the form to one that works with your CMS.</p>
</blockquote>
<h2>Sass: visual style and layout</h2>
<p>This is where it gets trickier, there&#39;s quite a bit to get through for the styling. This bit focuses purely on getting the layout and visual style in place. I’m going to be writing the CSS using Sass, though you can <a href="https://codepen.io/stevemckinney/pen/bab51a2f0032bd24e33f24b48ca39acb">get the compiled code</a> from the Pen.</p>
<h3>Variables</h3>
<pre><code class="language-scss">// Variables
$base-px: 8px;
$breakpoint: 768px;
$breakpoint-max: $breakpoint - 1px;

// Colours
$background: #f7fbfb;
$background-2: #eaf5f5;
$background-3: #bbd8d8;
$primary: #fd7f71;
$primary-2: #c3d8d7;
$white: #fff;

// Font stack
$system: -apple-system, BlinkMacSystemFont, &#39;Segoe UI&#39;, Roboto, Helvetica,
  Arial, sans-serif, &#39;Apple Color Emoji&#39;, &#39;Segoe UI Emoji&#39;, &#39;Segoe UI Symbol&#39;;
</code></pre>
<p><code>$base-px</code> is for spacing, <code>$breakpoint</code> and <code>$breakpoint-max</code> are for media queries. Then you have several colours and a system font stack. These variables will allow you to tweak things easier.</p>
<h3>General setup</h3>
<pre><code class="language-scss">// Basics
// ----------------------
body {
  display: flex;
  justify-content: center;
  align-items: center;
  align-content: center;
  background-color: $background;
  height: 100vh;
  font-family: $system;
}
</code></pre>
<p>This code is so the open button will align centrally vertically and horizontally.</p>
<h3>Hiding the label</h3>
<p>A design choice is to hide the label, however, it still serves a purpose to screen readers (albeit proper accessibility isn’t covered here).</p>
<pre><code class="language-scss">// For hiding the label
// ----------------------
.visuallyhidden {
  position: absolute;
  overflow: hidden;
  clip: rect(0 0 0 0);
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  border: 0;
}
</code></pre>
<p><code>.visuallyhidden</code> is a reasonably common practice, which ensures the element is hidden, but can be picked up by screen readers.</p>
<h3>SVG colour inheriting styles</h3>
<p>This CSS is important for the SVG icons having the correct colour applied to them. As mentioned earlier there are class names applied to the SVG paths.</p>
<pre><code class="language-scss">// SVG Helpers
// ---------------------------
.fill-currentcolor {
  fill: currentcolor;
}

.fill-none {
  fill: none;
}
</code></pre>
<p>The <code>fill</code> property is an SVG specific property. The default fill on an SVG is black, this is why you need to have one for removing the <code>fill</code>.</p>
<h3>Icons</h3>
<p>Each icon used is the same size, starting at 24px for smaller screens and then increased to 32px at the <code>$breakpoint</code>.</p>
<pre><code class="language-scss">// Icon
// ---------------------------
.icon {
  width: 24px;
  height: 24px;
  transition: 0.3s ease-out;

  @media (min-width: $breakpoint) {
    width: 32px;
    height: 32px;
  }
}
</code></pre>
<h3>Button and input ‘reset’</h3>
<p>These styles normalise the browser applied styling and give you a consistent starting point. Particularly the <code>appearance</code> property, this removes much of the browser default styling.</p>
<pre><code class="language-scss">// Input/button reset
// ---------------------------
.input,
.button {
  display: inline-block;
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  line-height: normal;
  border: none;
  outline: none;
  max-width: 100%;
  font-family: $system;
}
</code></pre>
<h3>Button <code>.button</code></h3>
<p>This is the reason you apply two class names to each button. For each button I want to ensure a consistent <code>cursor</code> and <code>color</code>. The <code>.button</code> itself and <code>.icon</code> within scale up.</p>
<pre><code class="language-css">// Button
// ---------------------------
.button {
  cursor: pointer;
  color: $primary;
  transition: 0.3s ease-out;

  &amp;:hover,
  &amp;:focus {
    transform: scale(1.125);

    .icon {
      transform: scale(1.25);
    }
  }
}
</code></pre>
<p>The important thing to note is the <code>color</code>, this is inherited by the icon. You can change this to any colour and the icon will follow suit.</p>
<p>The hover state is applying a scale effect to both the button and the icon. With the subtle ease-out transition it makes for a kind of jelly effect.</p>
<h3>Button to open <code>.button-open</code></h3>
<p>This is the means for opening the search overlay. In JavaScript shortly you will apply code so when it’s clicked, the overlay opens.</p>
<pre><code class="language-css">.button-open {
  // Display/alignment
  display: flex;
  justify-content: center;
  align-items: center;
  align-content: center;

  // Sizing
  width: 96px;
  height: 96px;
  border-radius: 48px;

  // Style
  background-color: $white;
  box-shadow: 0 1px 1px rgba($background-3, 0.6), 0 3px 3px rgba($background-3, 0.4),
    0 8px 16px rgba($background-3, 0.3);

  &amp;:hover,
  &amp;:focus {
    box-shadow: 0 2px 2px rgba($background-3, 0.4), 0 4px 4px rgba($background-3, 0.3),
      0 12px 32px rgba($background-3, 0.3);
  }
}
</code></pre>
<p>Along with the icon transition earlier the <code>box-shadow</code> is also being made to appear as if the element is becoming slightly raised. It’s a subtle tweak to show depth.</p>
<h3>Button to close <code>.button-close</code></h3>
<p>The close button is reasonably simple, you’re positioning it to the top right and making sure it the background colour is transparent.</p>
<pre><code class="language-scss">// Button (close)
// ---------------------------
.button-close {
  position: absolute;
  top: 7.5vw;
  right: 7.5vw;
  padding: 0;
  background-color: transparent;
}
</code></pre>
<h3>Form <code>.form-search</code></h3>
<p>The form element itself, serves as a container to limit the width of the input and allows you to align the search button easily.</p>
<pre><code class="language-scss">.form-search {
  position: relative;
  width: 100%;

  @media (min-width: $breakpoint) {
    max-width: 720px;
  }
}
</code></pre>
<p>Adding <code>position: relative</code> will make sure the button is anchored to the form element. At smaller screen sizes you want the form to fill the viewport.</p>
<h3>Search input</h3>
<p>There’s quite a bit of CSS applied to this element, the majority is related to visual style and sizing, rather than alignment.</p>
<pre><code class="language-scss">// Input
// ---------------------------
.input-search {
  // Sizing
  padding: 26px ($base-px * 2) 25px; // 72px height
  width: 100%;

  // Style
  font-size: 18px;
  font-weight: 600;
  color: $primary;
  background-color: $white;
  box-shadow: 0 1px 1px rgba($background-3, 0.6), 0 3px 3px rgba($background-3, 0.4),
    0 8px 16px rgba($background-3, 0.3);

  @media (min-width: $breakpoint) {
    // Sizing
    padding: 29px ($base-px * 6); // 96px height

    // Style
    font-size: 32px;
    border-radius: 30em;
  }
}

.input-search::placeholder {
  color: $primary-2;
}
</code></pre>
<p>I find it easier to use <code>padding</code> to apply the size you want over adding a <code>height</code> and corresponding <code>line-height</code>.</p>
<h3>Overlay</h3>
<p>The overlay is fixed to the viewport and everything again is positioned centrally with flexbox. This is much of the heavy lifting for positioning.</p>
<pre><code class="language-scss">// Overlay
// ---------------------------
.overlay {
  // Display
  overflow: hidden;
  display: flex;
  justify-content: center;
  align-items: flex-end;
  align-content: flex-end;

  // Positioning
  position: fixed;
  z-index: 3;
  left: 0;
  width: 100%;
  height: 100%;

  // Style
  background-image: linear-gradient(to top, $background, $background-2);

  @media (min-width: $breakpoint) {
    align-items: center;
    align-content: center;
  }
}
</code></pre>
<p>On smaller screens the form is aligned to the bottom, as you get beyond the <code>$breakpoint</code> the form is aligned centrally. <code>align-items</code> and <code>align-content</code> properties are what control this.</p>
<p>Going into further detail, a <code>z-index</code> is applied to ensure it’s above the other content. There is only the <code>left</code> value set here, normally you would want to apply a <code>top</code> or <code>bottom</code> value. However, when getting into the animation shortly, this will be covered.</p>
<p>The gradient is also applied here so it matches the design.</p>
<h2>SCSS: animation/transition setup</h2>
<p>If you followed along with the code as is, you should have what resembles a complete design. The following code will have the class names applied through JavaScript at the relevant points.</p>
<h3>Hiding</h3>
<p>The initial state the form is hidden. That’s why the <code>class</code> on the overlay <code>&lt;div&gt;</code> is <code>class=&quot;overlay hiding&quot;</code>.</p>
<pre><code class="language-scss">// Initial state
.hiding {
  max-height: 0;
  opacity: 0;
  bottom: 0;

  // This transition happens when the close button is clicked
  // and should be faster than the .showing state
  transition:
    max-height .3s .2s cubic-bezier(0.215, 0.61, 0.355, 1),
    opacity .6s ease-out;

  // When hiding inner elements should be invisible too
  .button-search,
  .input-search {
    opacity: 0; }

  // Offset the button
  .button-search {
    transform: translate3d(0, 33%, 0); }

  // Offset the input more
  .input-search {
    transform: translate3d(0, 50%, 0); }
</code></pre>
<h3>Hide the contents</h3>
<p>What’s happening here is you’re using both <code>max-height</code> and <code>opacity</code> to hide the contents of the overlay. The <code>overflow</code> set earlier in <code>.overlay</code> ensures that everything is completely hidden.</p>
<h3>Closing goes off from the bottom</h3>
<p>Next you have the <code>bottom</code> property, this will be apparent when closing the overlay. It will appear to go off the screen from the bottom.</p>
<h3>Hint at the height collapsing</h3>
<p>With the <code>transition</code> the <code>max-height</code> value transitions quicker than the <code>opacity</code>. The reason for this is to give a hint that the height is shrinking.</p>
<h3>Inner elements ‘nudge’ up</h3>
<p>The form elements will be positioned centrally, or at the bottom depending on screen size. So in both instances making them reveal upwards looks as if it’s a coordinated and waiting for the overlay to be open.</p>
<h3>Showing</h3>
<p>When <code>.button-open</code> is clicked this class name will be applied to the overlay.</p>
<pre><code class="language-scss">// Showing state
.showing {
  max-height: 100vh;
  top: 0;

  // This happens when the open button is clicked
  // max-height transition is to appear more subtle
  transition: max-height 0.4s 0.2s cubic-bezier(0.215, 0.61, 0.355, 1), opacity
      0.8s ease-out;
}
</code></pre>
<p>With the showing state the <code>max-height</code> ensures the height is transitioned and the <code>top</code> position ensures the overlay looks like it comes from the top. Working in combination with the hidden state when the showing class is swapped for hiding it will look like it’s going off the bottom of the screen.</p>
<p>This is the good thing about removing class names through JavaScript—which will be covered shortly. You also don’t have to write as much CSS. So you don’t need to have <code>opacity: 1</code> and you don’t need to change the <code>transform</code> on the inner elements. This is because those styles don’t exist once the class name is removed.</p>
<h3>Transitioning inner elements</h3>
<p>Finally, once the overlay opens, you want the form elements to transition in slightly later. This gives a more intentional appearance.</p>
<pre><code class="language-scss">.button-search {
  transition: 0.4s 0.6s ease-out;
}

.input-search {
  transition: 0.8s 0.3s ease-out;
}
</code></pre>
<p>I’ve chosen to make the button have a quicker overall transition, but a longer delay. This gives the search input a chance to appear.</p>
<p>The search input is delayed by <code>.3</code> seconds, which is inline with the <code>max-height</code> transition. The aim is so it begins to happen, as that the <code>max-height</code> transition is ending.</p>
<h2>JavaScript</h2>
<p>Here’s all the JavaScript to make this function. It’s broken down in to four parts. The variables which select the elements you need throughout. Two functions, the first, for adding focus to the search and the second, which will toggle the visibility. The event listeners to watch for clicks on the buttons.</p>
<pre><code class="language-javascript">// Keep search toggling out of the global scope
;(function (window, document, undefined) {
  // Variables
  var open = document.querySelector(&#39;.button-open&#39;)
  var close = document.querySelector(&#39;.button-close&#39;)
  var overlay = document.querySelector(&#39;.overlay&#39;)
  var search = document.querySelector(&#39;.input-search&#39;)

  // Focus on an element
  var focusOn = function (element) {
    // Only focus on the element if it contains the relevant
    // class name that means it’s actually visible
    if (overlay.classList.contains(&#39;showing&#39;)) {
      console.log(&#39;focus&#39;)
      element.focus()
    }
    // Otherwise remove the focus from the element
    else {
      element.blur()
    }
  }

  // Toggles a set of class names on an element
  var toggler = function () {
    // Add the active class to the element clicked/tapped
    // So if necessary the style can be changed
    this.classList.toggle(&#39;active&#39;)

    // Toggle the classes which set off the transition
    overlay.classList.toggle(&#39;hiding&#39;)
    overlay.classList.toggle(&#39;showing&#39;)

    // Once the overlay’s transition ends focus the search field
    overlay.addEventListener(&#39;transitionend&#39;, focusOn.bind(null, search), false)

    // Prevent the clicks from navigating away
    return false
  }

  // Add the event listener to the toggle
  open.addEventListener(&#39;click&#39;, toggler, false)
  close.addEventListener(&#39;click&#39;, toggler, false)
})(window, document)
</code></pre>
<p>Have a scan over the code and then I’ll cover it in more detail.</p>
<h3>Contain everything with an IIFE</h3>
<p>You’re containing all the code required in an ‘IIFE’. This means immediately invoked function expression. Which makes the code only accessible from within this to avoid code conflicting elsewhere.</p>
<pre><code class="language-javascript">// Keep search toggling out of the global scope
;(function (window, document, undefined) {
  // Code here
})(window, document)
</code></pre>
<p><a href="https://toddmotto.com/what-function-window-document-undefined-iife-really-means/">Todd Motto has a great explanation on his blog</a> of why this is approach is used.</p>
<h3>Variables</h3>
<p>The first step is to assign all the elements, that will have some change happen to them, to variables.</p>
<pre><code class="language-javascript">// Keep search toggling out of the global scope
;(function (window, document, undefined) {
  // Variables
  var open = document.querySelector(&#39;.button-open&#39;)
  var close = document.querySelector(&#39;.button-close&#39;)
  var overlay = document.querySelector(&#39;.overlay&#39;)
  var search = document.querySelector(&#39;.input-search&#39;)
})(window, document)
</code></pre>
<p>Both buttons, the overlay and search input are selected. Click event listeners will be assigned to both the <code>open</code> and <code>close</code> buttons. The <code>overlay</code> will have class names changed and the <code>field</code> will be focused once the transitions end.</p>
<h3>Assigning event listeners to the buttons</h3>
<p>Next, you want to assign click event listeners to both of the buttons.</p>
<pre><code class="language-javascript">// Keep search toggling out of the global scope
;(function (window, document, undefined) {
  // Variables
  var open = document.querySelector(&#39;.button-open&#39;)
  var close = document.querySelector(&#39;.button-close&#39;)
  var overlay = document.querySelector(&#39;.overlay&#39;)
  var field = document.querySelector(&#39;.input-search&#39;)

  // Add the event listener to the toggle
  open.addEventListener(&#39;click&#39;, toggler, false)
  close.addEventListener(&#39;click&#39;, toggler, false)
})(window, document)
</code></pre>
<p>With <code>addEventListener</code> you have a few parameters. The most important are the event to listen for, in this case <code>click</code>. The second parameter is to pass a function that you want to be called.</p>
<p>It’s important to note that you don’t write the function as <code>toggler()</code>. This is so the function is only called when you click on the relevant element.</p>
<p>The third parameter is more for <a href="https://stackoverflow.com/questions/17564323/what-does-the-third-parameter-false-indicate-in-document-addeventlistenerdev">backwards compatibility</a>. It doesn’t have much bearing here, so I’m not going to go into detail.</p>
<h3>Writing the ‘toggler’ function</h3>
<p>Now you need to write the <code>toggler</code> function. The aim for this is to <code>toggle</code> a couple of class names to make the search visible. Once the transitions have completed, it would also be ideal to focus on the search input. So the user can begin typing without any extra interaction.</p>
<pre><code class="language-javascript">// Keep search toggling out of the global scope
;(function (window, document, undefined) {
  // Variables
  var open = document.querySelector(&#39;.button-open&#39;)
  var close = document.querySelector(&#39;.button-close&#39;)
  var overlay = document.querySelector(&#39;.overlay&#39;)
  var search = document.querySelector(&#39;.input-search&#39;)

  // Toggles a set of class names on an element
  var toggler = function () {
    // Toggle the classes which set off the transition
    overlay.classList.toggle(&#39;hiding&#39;)
    overlay.classList.toggle(&#39;showing&#39;)

    // Once the overlay’s transition ends focus the search field
    overlay.addEventListener(&#39;transitionend&#39;, focusOn.bind(null, search), false)

    // Prevent the clicks from navigating away
    return false
  }

  // Add the event listener to the toggle
  open.addEventListener(&#39;click&#39;, toggler, false)
  close.addEventListener(&#39;click&#39;, toggler, false)
})(window, document)
</code></pre>
<h4>Toggle class names to keep things efficient</h4>
<p>Digging into the function now, the class names that set off the transition are toggled on the <code>overlay</code> variable. Clicking the <code>open</code> button means <code>&#39;hiding&#39;</code> will be removed and <code>&#39;showing&#39;</code> will be added.</p>
<p>Alternatively, when <code>close</code> is clicked <code>&#39;showing&#39;</code> will be removed and <code>&#39;hiding&#39;</code> will be added.</p>
<h4>Arguments are passed using bind</h4>
<p>You’ll notice <code>bind</code> following the <code>focusOn</code> function in the <code>transitionend</code> event listener.</p>
<p>The reason you use <code>bind</code> is to avoid the function being called too early. It’s still the case even when you pass arguments. So if you want to pass arguments, <code>bind</code> is one of the best solutions.</p>
<p>It’s important to note the first parameter of <code>bind</code> is what you want <code>this</code> to be assigned to. In this instance there isn’t any use for <code>this</code> so <code>null</code> is passed.</p>
<h3>Focusing on the input</h3>
<p>Finally, to complete your code is to add the <code>focusOn</code> function. This has one parameter <code>element</code>, which when it’s used the <code>toggler</code> function is the <code>search</code> variable.</p>
<pre><code class="language-javascript">// Keep search toggling out of the global scope
;(function (window, document, undefined) {
  // Variables
  var open = document.querySelector(&#39;.button-open&#39;)
  var close = document.querySelector(&#39;.button-close&#39;)
  var overlay = document.querySelector(&#39;.overlay&#39;)
  var search = document.querySelector(&#39;.input-search&#39;)

  // Focus on an element
  var focusOn = function (element) {
    // Only focus on the element if it contains the relevant
    // class name that means it’s actually visible
    if (overlay.classList.contains(&#39;showing&#39;)) {
      element.focus()
    }
    // Otherwise remove the focus from the element
    else {
      element.blur()
    }
  }

  // Toggles a set of class names on an element
  var toggler = function () {
    // Toggle the classes which set off the transition
    overlay.classList.toggle(&#39;hiding&#39;)
    overlay.classList.toggle(&#39;showing&#39;)

    // Once the overlay’s transition ends focus the search field
    overlay.addEventListener(&#39;transitionend&#39;, focusOn.bind(null, search), false)

    // Prevent the clicks from navigating away
    return false
  }

  // Add the event listener to the toggle
  open.addEventListener(&#39;click&#39;, toggler, false)
  close.addEventListener(&#39;click&#39;, toggler, false)
})(window, document)
</code></pre>
<p>The first part of the <code>focusOn</code> function is the <code>if</code> statement. This is looking at the <code>overlay</code> to check if it contains a class name. If this is true it will find the <code>element</code> and bring focus to it.</p>
<p>In the <code>else</code> you can assume that’s when the element is being closed and remove the focus by using <code>blur()</code>.</p>
<blockquote>
<p>Bringing focus to an element is hit and miss, it serves you well in desktop browsers. However, for mobiles it does focus, but doesn’t always bring up the keyboard. This is fine, but something to be aware of.</p>
</blockquote>
<h2>That’s it</h2>
<p>You should now have the complete overlay. If you’d like to take this a step further, the JavaScript could be made more reusable. The <code>toggler</code> function could be passed elements instead of referring to variables.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Visual design tips you can apply immediately</title>
      <link>https://iamsteve.me/blog/visual-design-tips-you-can-apply-immediately</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/visual-design-tips-you-can-apply-immediately</guid>
      <pubDate>Tue, 04 Jul 2017 11:51:00 GMT</pubDate>
      <description>Add a little extra polish to any of your designs with these tips.</description>
      <content:encoded><![CDATA[<p>When designing there are techniques for applying colour, typography, spacing, you can rely upon regardless of the situation. These are things which add extra polish, and are generally hidden to the untrained eye.</p>
<h2>1. Shadows respect their surroundings</h2>
<p>One of the most common issues with shadows I see is they don&#39;t respect the background they are on.</p>
<figure>
<img src="/images/blog/visual-design-tips-shadow-example@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>
The ‘bad’ shadow uses 20% opacity black. The ‘good’ shadow uses #DBA758 at 60% opacity.
</figcaption>
</figure>

<p>In the example, the ‘bad’ uses a black shadow. When a transparent black is placed on a coloured background, the overall colour appears muddier. Whereas if you take the background colour and make it darker and more saturated it will feel more intentional.</p>
<p>This is true of how real shadows behave, they&#39;re the absence of light. So while this is on a screen, it makes your design better if you remain true to this.</p>
<h3>How about blending modes?</h3>
<p>Alternatively, you may find a blend mode more accurate. Using a black shadow with an overlay or soft light blending mode can be equally effective.</p>
<figure>
<img src="/images/blog/visual-design-tips-shadow-example-blend-mode@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>
Shadow ‘A’ is a softened shadow using an overlay blend mode. Shadow ‘B’ isn’t softened to demonstrate the colour.
</figcaption>
</figure>

<p>In the example image, the shadows both use black with an overlay blending mode. This can be a great way to apply shadows which fit better. If you were to replicate this in CSS or without the need for a blending mode based shadow ‘B’ allows you to pick the colour and use it.</p>
<h2>2. Your shadows shouldn&#39;t look like a ‘glow’</h2>
<p>On to another shadow tip, which can be tricky to control, is when the shadow makes the object look like it’s glowing. It commonly happens with dark objects on a light background.</p>
<div className="article-image">
  <img src="/images/blog/visual-design-tips-shadow-glow@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>It can take a bit of tweaking but you need two shadows, both of the same colour. You should keep your original shadow, but reduce the opacity and increase the Y axis slightly. <strong>The idea is this shadow should be subtle</strong>.</p>
<p>Next, duplicate the layer to add a second shadow. This shadow is 0 x axis, 1px y axis and 1px blur shadow. The opacity should be higher, around 60%. Essentially you’re creating a border for some additional contrast.</p>
<h2>3. Gradients should feel harmonious</h2>
<p>When you want a light to dark transition of colour in a gradient, usually you&#39;ll take your base colour and make it darker. That&#39;s fine, but sometimes it can feel off. Why? You may wonder.</p>
<div className="article-image">
  <img src="/images/blog/visual-design-tips-gradient-example@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>


<p>This is similar to the earlier shadow tip. A gradient applied to an object is adding depth. So similar rules apply, when darkening a colour, don’t only add black.</p>
<div className="article-image">
  <img src="/images/blog/visual-design-tips-gradient-example-colours@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>In the image you can see a breakdown of the colours used. Comparing the examples the differences are more apparent. The good example uses a more saturated red.</p>
<h3>Use a different hue</h3>
<p>Saturation doesn’t work as well for some colours, in those instances it can work to adjust the hue. Here are a couple of examples using hue adjustment only.</p>
<div className="article-image">
  <img src="/images/blog/visual-design-tips-gradient-example-2@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>By adjusting the colour on the hue of the colour, by around 10–20 degrees you perceive the colour as being darker.</p>
<h2>4. Use hanging punctuation</h2>
<p>It’s not supported in many apps (aside from InDesign) and CSS (yet). However, it’s an important consideration for improving your reading experience.</p>
<h3>Bulleted lists</h3>
<div className="article-image">
  <img src="/images/blog/visual-design-tips-hanging-bullets@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>When you indent your bullets at the first level you remove the left edge of the content. Your reader will have to adjust to the bullet points then again. It’s important to keep the left side consistent for the best reading experience.</p>
<h3>Quotes</h3>
<div className="article-image">
  <img src="/images/blog/visual-design-tips-hanging-quotes@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>The same applies to pull quotes, as seen in the image. If you’ve ever felt like your text feels off with quotes, this is why. It’s a subtle improvement.</p>
<div className="article-image">
  <img src="/images/blog/visual-design-tips-hanging-website@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Of course your style may vary, and you may apply something more stylistic, as shown in the example for the design of this website.</p>
<h2>5. Text always has an ideal line length</h2>
<p>Having an ideal line length means content can be read easier. The eyes don’t have to work harder tracking from side to side.</p>
<p>Typically this is 55-75 characters, it depends on the typeface you use but this can be approximately 30em in CSS.</p>
<h2>6. Balance titles &amp; avoid widows/orphans</h2>
<p>To avoid widows and orphans this means when you have a paragraph or title you avoid short lines of text. In the instance of titles it would be to avoid a single word. It can be difficult to control on a website, but being aware of it helps.</p>
<div className="article-image">
  <img src="/images/blog/visual-design-tips-balance-titles@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>It’s considered bad in terms of typography, because it looks like there is excess white space. Excess whitespace can interrupt the flow of reading and balance of a particular area of your design.</p>
<h3>How to fix or prevent?</h3>
<p>When making a website there are a lot of variables to control this (eg: responsive). The best way I have found is to use <code>&amp;nbsp;</code> on the areas you can control.</p>
<p>The title in the example would look like the following:</p>
<pre><code>Illustrator quick tip: non destructive shape&amp;nbsp;editing
</code></pre>
<h2>7. Keep spacing consistent with using multiples</h2>
<p>This is something I&#39;m passionate about, using one multiple as a basis for all spacing. For example, using multiples of 8, this is a good number to use as it will divide/multiply and never hit a decimal placed number.</p>
<div className="article-image">
  <img src="/images/blog/visual-design-tips-consistent-spacing@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>There are a few good reasons you should be:</p>
<ul>
<li>Improves speed of designing</li>
<li>Improves decision making</li>
<li>Helps collaborating with developers</li>
<li>Improves consistency and hierarchy</li>
<li>Helps with maintaining a vertical rhythm</li>
</ul>
<blockquote>
<p>Having your <a href="/blog/pixel-perfect-templates-in-illustrator">Illustrator templates setup correctly</a> means this is a breeze to stick with.</p>
</blockquote>
<h2>8. Make sure icons and logos are pixel fitted</h2>
<p>A subtle but important aspect of design is ensuring your design  assets remain sharp. Sometimes you may feel like something is off with an icon or logo, it most likely it looks ever so slightly blurry.</p>
<p>This is quite the topic in itself, but pixel fitting your icons and logos is an important skill to acquire. It’s essentially hinting them to make sure they appear sharp and retain their original clarity.</p>
<figure>
<img src="/images/blog/visual-design-tips-pixel-fitting@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>Notebook icon from SS Standard</figcaption>
</figure>

<p>Take this notebook icon, the central rectangle is off the pixel grid. If you were to enable pixel preview <kbd><kbd>cmd</kbd> + <kbd>Y</kbd></kbd> and toggle it back and forth you would notice the fuzziness. <em>This is what I mean when making sure things are pixel fitted</em>.</p>
<p>You don’t see it in vector applications, but when you export and view it on screen normally you will see the difference.</p>
<h3>Making things pixel fitted</h3>
<figure>
<img src="/images/blog/visual-design-tips-pixel-fitting-transform@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>Open the transform panel by going to Window > Transform</figcaption>
</figure>

<p>With the transform panel open, you use the direct selection tool  <kbd>a</kbd> to select the individual points. Referring to the transform panel you will see which points are off a whole pixel.</p>
<p>You can either add or subtract the pixels after the decimal place. The main thing is the numbers should be whole eg: 16px. Not 16.5px or 16.12325px, you get the point.</p>
<blockquote>
<p>Make Pixel Perfect is a feature which was added in Illustrator 2017 (Nov 2016 update). Make sure snap to pixel is on by going to View &gt; Snap to Pixel and then select your object and go to Object &gt; Make Pixel Perfect. It’s not fantastic, but it does do some heavier lifting.</p>
</blockquote>
<h2>9. Use a type scale</h2>
<p>Like picking a consistent value to base spacing off; having a type scale is important too. A type scale means your font sizes are based upon a ratio.</p>
<p>I pick a scale that has the smaller font sizes you need and shows a clear difference with the larger sizes. As you need a variety at small sizes but more differentiation.</p>
<figure>
<img src="/images/blog/visual-design-tips-type-scale@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>Personally, I find a type scale of 1.125 to be ideal.</figcaption>
</figure>

<p>I would recommend using between 6–8 different type sizes. This should be more than enough for a website. Using more than this may make things feel inconsistent.</p>
<h3><a href="http://www.modularscale.com/?18,12&px&1.333">Modular Scale</a></h3>
<p>I recommend using this website to help determine your type scale. You can add multiple base values, this will give you a wider variety of smaller font sizes. It offers many sizes, but as mentioned I would select between 6–8.</p>
<h2>10. Use the correct quotes</h2>
<p>A simple one but using the correct quotes can make things look more elegant aside from being typographically correct. They vary in their look between typefaces, it could even be a factor in why you use that particular typeface.</p>
<div className="article-image">
  <img src="/images/blog/visual-design-tips-curly-quotes@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Straight quotes have very few if any uses outside of code. Some applications will automatically convert to them for you like Illustrator, Photoshop and some other text editors like iA Writer.</p>
<h3>Shortcuts</h3>
<p>On a Mac the shortcuts are fairly straightforward, Windows and Linux require more effort. A good reference website for all shortcuts and entities is <a href="http://smartquotesforsmartpeople.com">Smart Quotes for Smart People</a>.</p>
<h3>Markdown</h3>
<p>Markdown is a great way to write it’s simple to format text and one of the benefits of using markdown is the ability to enable quote conversion. If you write a lot in your CMS you may be able to enable it.</p>
<h2>11. Optical alignment — aligning for your eyes</h2>
<p>You’ve got a set of icons, you add a background colour in a circular shape, you align it and it looks off. The align tool isn’t broken surely?</p>
<p>It’s not broken, sometimes align tools don’t work in certain areas. The easiest way to get round this issue is to eyeball things, and that’s fine.</p>
<h3>The play icon</h3>
<p>This particular icon is the most common example used when demonstrating optical alignment. As it’s really clear what the issue is.</p>
<div className="article-image">
  <img src="/images/blog/visual-design-tips-optical-play@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<h3>Optical alignment comes in many forms</h3>
<p>I’m only covering this topic briefly, but it applies to typography too. Being aware of when something is mathematically correct, but feels off from an optical view, will allow you to make the subtle tweaks needed.</p>
<div className="article-image">
  <img src="/images/blog/visual-design-tips-optical-more@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>It’s a subtle, but noticeable difference, to the way things appear when aligned.</p>
<h2>12. Make sure your nested corner radius account for the outer radius</h2>
<p>When you have two rounded rectangles nested within each other you need the corner/border radius to feel consistent.</p>
<div className="article-image">
  <img src="/images/blog/visual-design-tips-nested-radius@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>There is a fairly simple calculation for this, the <code>outer radius - the space between = inner radius</code>. In the example above this would be <code>40px - 28px = 12px</code>. There’s <a href="http://joshnh.com/tools/get-your-nested-border-radii-right.html">a handy tool to help you calculate this</a>.</p>
<h2>That’s it</h2>
<p>Hopefully there are some tips you didn’t know here and they’re useful. I’d like to know have I missed any? Let me know on <a href="https://twitter.com/irsteve">twitter</a>).</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Overcoming design roadblocks</title>
      <link>https://iamsteve.me/blog/overcoming-design-roadblocks</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/overcoming-design-roadblocks</guid>
      <pubDate>Tue, 13 Jun 2017 06:30:00 GMT</pubDate>
      <description>It happens, sometimes you can be stuck starting a new design, here’s some tips that aim to help overcome the challenge.</description>
      <content:encoded><![CDATA[<p>When starting out on a new project or being newer to design, getting your ideas to be what you visualise can be difficult. Whether you’re new or are aiming to broaden your specialism you’ll find some things more challenging. In this post I’ll share some tips of how I approach these challenges.</p>
<h2>Starting a new skill requires patience</h2>
<p>I received a few emails which made me feel like this would be a good topic. It’s also a good reminder to myself to write this. As you can go through stages where you can’t quite create what you visualise.</p>
<p>When you find things being more challenging than you thought, it’s important to remember you’ll get somewhere in time. You can’t know everything and part of it is being comfortable knowing that. It’s through these challenges you learn and grow your experience. Without challenges it becomes boring.</p>
<h3>Use different constraints to help</h3>
<p>Some of the things I mention within will contradict each other, because you will need to approach things in a mixture of ways. Using different constraints and having patience can help see your vision through.</p>
<h3>Sometimes you don’t know what to learn</h3>
<p>There’s lots of reasons you can struggle. Being an aspiring illustrator and someone who wants to be better at art in general, you can find yourself not knowing what to learn or frustrated when things don’t go to plan.</p>
<h2>Slow down</h2>
<p>One of the most important things I can recommend is slowing down. You find difficulty because you want the instant gratification of designing something good. Slow down and let the time taken be what’s necessary.</p>
<p>If you’re new to designing, be it altogether or for a particular industry, it will take you longer. Your trial and error will take longer, there is nothing wrong with this, it’s the opportunity to learn.</p>
<blockquote>
<p>It’s important to reflect on your learnings. So note them down, keep your sketches, wireframes anything that shows progress.</p>
</blockquote>
<h2>Start somewhere</h2>
<p>It can sometimes feel overwhelming when starting out. However, getting something down is what you need to build momentum. It doesn’t have to be in a blank canvas, it can be as small as noting things down.</p>
<p>I have found it extremely helpful over the years to write notes. From what the main goal is, to what elements must be part of what I design, summarising research, what the brand image is, etc.</p>
<p><strong>Writing these initial thoughts (and repeating them) allows you to process them better</strong>. By having the thoughts on paper you don’t need to remember them. <strong>It frees up focus on producing the work</strong>.</p>
<h2>Don’t be afraid to start again</h2>
<p>This is one thing I will say is vital. You may have had a great idea in mind, but you can’t make it work. This may not be down to your skill, it might just be the idea doesn’t work.</p>
<h3>Consider the following</h3>
<ol>
<li>What are you trying to achieve?</li>
<li>Have you imposed a constraint that is too strict?</li>
<li>Is the use case different to what you expected?</li>
<li>What have you learnt so far?</li>
</ol>
<p>The reason I consider these questions are, for example, when I was making the new logo for this website, I wanted to also make it into an illustrated version. I was happy with the logo overall and reasonably happy with the illustrated approach.</p>
<p>However, when it came to placing it in the design in reference to the sketches I had done, it didn’t work. It didn’t work because the space felt awkward in the surrounding area. I recognised this and completely changed my approach and was happier for it.</p>
<p>Sometimes you need to see an idea as far as you can, but once you realise it’s not working, think about why. <strong>Again, document this as progress</strong>.</p>
<h2>Try things out and don’t be afraid to reevaluate</h2>
<p>With so many ideas floating around it can be difficult to choose which one to go with.</p>
<ul>
<li>List all ideas with detail for remembering</li>
<li>Start with any idea</li>
<li>Sketch a rough version of it</li>
<li>Note any key points</li>
<li>Move on to the next</li>
<li>Repeat</li>
</ul>
<p>The key is speed, you may repeat yourself and things not look too different. That’s fine, you&#39;re iterating and making progress.</p>
<p>Some ideas will be poorer than others, but you have to go through those to get to the good.</p>
<h2>Start small</h2>
<p>You’ve probably noticed there is an emphasis on sketching and notes. An artist doesn’t immediately embark on a full scale drawing of the scene they have in their mind. It would more often than not be wasteful.</p>
<p>They start with small sketches. Moving quickly, to figure out where all the main components of the scene go. If the drawing features people or objects they will try different compositions to figure out lighting, focus and proportions.</p>
<h3>Sketches can help you to understand where to head</h3>
<p>Equally you should have things you can rely on to get a better picture. It’s a way of visualising quickly, with a significantly lower time investment. Sketches allow you to visualise something without it being in your mind. You can throw ideas away without feeling like much has been lost if they don’t work.</p>
<h2>Jump about in your process</h2>
<p>The value in having a process is clear. It’s a set of steps you follow to ensure the best quality of work and nothing gets missed. However, with designing websites, you need to jump about the process to get a feel for your ideas.</p>
<p>If you want to experiment with some visual style or wireframes quickly, you should. It’s something I struggled with, you can see people who do great work and explain their process and feel like it always works.</p>
<p>This is down to two things; the way they present their work and it simply doesn’t always work out that way. It’s important having those steps, but you may need to revisit them and approach them in different ways.</p>
<h2>Become familiar with the details</h2>
<p>You can read about design techniques, styles or processes, but without intentionally designing using techniques you wish to understand better, it will be difficult to learn the intricacies.</p>
<p>It’s important to practice these techniques outside of your work. Use side projects and challenges for yourself to practice them. You’ll gain a greater understanding and be able to draw upon techniques quicker in the future.</p>
<h2>Don’t let inspiration rule you</h2>
<p>Inspiration can be both your best friend and worst enemy. It is a form of research, you can use to back up your initial options and inspire ideas. However, the one thing I’ve always disliked about inspiration is the things you’ll see are never going to be what you output. So you’ll always have some level of dissatisfaction, unless you separate yourself from it completely.</p>
<p>That’s the point here; inspiration shouldn’t rule you. Once you’ve got the inspiration needed you need to step back and forget it. Take a break and then come back to your work.</p>
<h2>Practice deliberately</h2>
<p>This is a topic in of itself, but taking the example you want to be better at a particular skill within design. For example, typography, there is a lot to understand. You can understand the rules and the principles behind good typography. Without practicing, learning from your mistakes and understanding what you need to improve from the repetition.</p>
<h2>Vectors are free</h2>
<p>Aaron Draplin says ‘vectors are free’ and that’s something to remember when designing. You start out making something and you’re going to change direction slightly. Duplicate it and work on it.</p>
<p>Now you can iterate in many directions without worry of being able to revert. It’s a simple mindset change, but it’s really helpful.</p>
<h2>Take a break</h2>
<p>Breaks are important, whether that’s a walk or sleeping on something. It’s important you come back to a design with fresh eyes. If you’re struggling with your vision, but have something almost there a break will be good for you.</p>
<p>There has been many times I’ve left a design and come back to it after a nights sleep to carry on and make improvements that I’m happier with.</p>
<p>Not only this, but prolonged breaks and recognising when you&#39;re pushing yourself too hard is key to your creativity.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Illustrator quick tip: export a colour palette quickly</title>
      <link>https://iamsteve.me/blog/illustrator-quick-tip-export-a-colour-palette-quickly</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/illustrator-quick-tip-export-a-colour-palette-quickly</guid>
      <pubDate>Tue, 09 May 2017 06:25:00 GMT</pubDate>
      <description>In Illustrator it appears more difficult than it needs to be to export a colour palette to hex values, here’s a quick way.</description>
      <content:encoded><![CDATA[<p>In Illustrator it seems to be more difficult than it needs to be to export a colour palette to hex values. Using swatches gives you access to everything except hex. It’s tedious to go through the usual object, click fill, copy and paste routine. Here’s a way to export your colours quickly.</p>
<h2>Have your colour palette ready</h2>
<p>You may be using swatches already, or have a bunch of shapes which are filled with the colours. If you don’t draw some shapes now with each of your colours.</p>
<figure>
<img src="/images/blog/colour-export-ready@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>A simple set of shapes is all that is needed.</figcaption>
</figure>

<h2>Select the objects and copy</h2>
<p>Next copy each of the objects. This will copy an SVG version of your colour palette to the clipboard.</p>
<h2>Open your text editor</h2>
<p>It doesn&#39;t matter what app you use here you need something to paste in what you&#39;ve copied.</p>
<pre><code class="language-html">&lt;!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In  --&gt;
&lt;svg
  version=&quot;1.1&quot;
  xmlns=&quot;http://www.w3.org/2000/svg&quot;
  xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot;
  xmlns:a=&quot;http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/&quot;
  x=&quot;0px&quot;
  y=&quot;0px&quot;
  width=&quot;546px&quot;
  height=&quot;98px&quot;
  viewBox=&quot;0 0 546 98&quot;
  style=&quot;enable-background:new 0 0 546 98;&quot;
  xml:space=&quot;preserve&quot;
&gt;
  &lt;style type=&quot;text/css&quot;&gt;
    .st0 {
      fill: #ff7e6d;
    }
    .st1 {
      fill: #553143;
    }
    .st2 {
      fill: #ffdb6d;
    }
    .st3 {
      fill: #09465c;
    }
    .st4 {
      fill: #27cba4;
    }
  &lt;/style&gt;
  &lt;defs&gt;&lt;/defs&gt;
  &lt;circle class=&quot;st0&quot; cx=&quot;48&quot; cy=&quot;48&quot; r=&quot;48&quot; /&gt;
  &lt;circle class=&quot;st1&quot; cx=&quot;162&quot; cy=&quot;48&quot; r=&quot;48&quot; /&gt;
  &lt;circle class=&quot;st2&quot; cx=&quot;274&quot; cy=&quot;48&quot; r=&quot;48&quot; /&gt;
  &lt;circle class=&quot;st3&quot; cx=&quot;386&quot; cy=&quot;50&quot; r=&quot;48&quot; /&gt;
  &lt;circle class=&quot;st4&quot; cx=&quot;498&quot; cy=&quot;50&quot; r=&quot;48&quot; /&gt;
&lt;/svg&gt;
</code></pre>
<p>Yours will resemble something similar to this code.</p>
<h2>Grab the CSS</h2>
<p>Copy the code between <code>&lt;style type=&quot;text/css&quot;&gt;</code> and <code>&lt;style&gt;</code>. Delete the rest, paste it back in and tidy it up so you have the hex codes left.</p>
<pre><code class="language-html">#FF7E6D #553143 #FFDB6D #09465C #27CBA4
</code></pre>
<h2>Each colour should correspond with Illustrator</h2>
<p>The order each colour is should be how you made them in Illustrator. That’s all you need to know, you’ve got your hex codes.</p>
<p>This is something I find less tedious than selecting the object, opening the fill window and pasting the value elsewhere. It’s a technique I consider to be one of those: “why didn’t I think of this sooner”.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Making patterns in Illustrator</title>
      <link>https://iamsteve.me/blog/making-patterns-in-illustrator</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/making-patterns-in-illustrator</guid>
      <pubDate>Tue, 11 Apr 2017 06:30:00 GMT</pubDate>
      <description>Learn how to create, change and duplicate patterns as swatches.</description>
      <content:encoded><![CDATA[<p>Patterns and textures were popular before flat design came along. As we seek the need for creativity in our designs things like patterns reemerge. This post shares what I&#39;ve learnt and how to make your own. It’s a technique once you remember you’ll be able to make patterns with ease.</p>
<h2>Your pattern can be anything</h2>
<p>A pattern is something that is repetitive, a piece of an image that can repeat over and over. It can be anything, so long as it&#39;s seamless.</p>
<div className="article-image">
  <img src="/images/blog/patterns-example@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>So if you have a set of icons, or shapes you would like to repeat, it can work. In the example throughout this post I will be using several icons I have made.</p>
<p>More importantly, it has to work for your design, which depends on the look and feel you’re going for.</p>
<h2>Initial setup</h2>
<p>Start a new document, with a 600x600 artboard. This will ensure you don’t make a huge tile, but still allow for a good repetition.</p>
<p>Now you want to turn on snap to pixels, you can find this under <code>View &gt; Snap to Pixel</code>. The idea is to try keep everything a whole pixel.</p>
<h2>Gather your objects</h2>
<p>Next, add each of the objects you want to be part of the pattern to the artboard.</p>
<div className="article-image">
  <img src="/images/blog/patterns-objects@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<blockquote>
<p>Make sure you keep the originals. This will help later with duplicating and positioning.</p>
</blockquote>
<h2>Place centrally working your way outwards</h2>
<p>The shape should kind of form a diamond. The reason for this will become clearer in the coming steps, but you’ll be adding objects manually to the centre.</p>
<div className="article-image">
  <img src="/images/blog/patterns-initial@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>You want a pattern to feel completely random, yet consistent at the same time. You create randomness through the objects used and consistency through spacing.</p>
<h2>Placing objects</h2>
<p>Resize, rotation and colour can all add to how random the pattern feels.</p>
<h3>Density</h3>
<p>If you pack the objects together it’s going to appear busier. So if you’re to overlay text on it, you may struggle unless the application is subtle.</p>
<p>If you space your objects out much more you’ll have freedom to overlay text easier. It will allow you to make it more striking as a result. As text will be less likely to blend in.</p>
<p>It’s all a balance, which is something to consider with your design.</p>
<h3>Repetition</h3>
<p>The repetition of the pattern can be difficult to make appear random. This is due to the amount of objects you may have, but don’t be afraid to place two similar, close to each other. It won’t be as obvious as you think.</p>
<p>This is where applying a different transform can really help.</p>
<h3>Transform each</h3>
<p>If this fits your pattern and look you’re going for transform each is great. To use transform each, select your objects and go to <code>Object &gt; Transform &gt; Transform Each</code>.</p>
<div className="article-image">
  <img src="/images/blog/patterns-transform-each@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>You can randomly change most things in this window. Make sure you check random, and tweak the values a few times as each time is different. You should be able to refine it to suit the pattern best.</p>
<div className="article-image">
  <img src="/images/blog/patterns-transform-each-pattern@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>As the image shows it works well to add more randomness to your pattern.</p>
<h3>Rotate, scale, reflect, etc.</h3>
<p>Transform each is great, it does the majority of the work quickly. There are instances where it may not be favourable or you need to keep things precise.</p>
<p>This is where the regular transform controls come in. An example may simply be to flip a search icon using reflect. All these options can be found under <code>Object &gt; Transform</code>.</p>
<h2>Preparing the pattern</h2>
<p>The next steps will finalise the pattern and make it be repeatable.</p>
<h3>Make sure the dimensions are whole numbers</h3>
<div className="article-image">
  <img src="/images/blog/patterns-half-pixel-dimensions@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>This step will generally make your life easier later. As you can see in the image above the dimensions are 376.001px x 411.314px. <strong>It would be nicer if this pattern was 376px by 412px, whole even numbers</strong>.</p>
<h3>Find the item that’s positioned on a half pixel</h3>
<p>This is a quick method I like to use to make a selection of objects a collectively have a whole pixel value.</p>
<div className="article-image">
  <img src="/images/blog/patterns-object-off-pixel@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Look at the width and height of all of them and look for a value, in this instance, around the <code>.314px</code> off. If you find that value nudge it to the next pixel value up or down. Then repeat the process to find any others.</p>
<h3>Change the transform origin and make it a whole pixel</h3>
<p>If I want to nudge an item to the right, I need to make sure the transform origin is also the right.</p>
<div className="article-image">
  <img src="/images/blog/patterns-transform-origin@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>In the transform panel you can see 9 squares in a grid like appearance. Where you click depends on where you want to move the object. If you wanted the object to be off the half pixel at the bottom, you would change the transform origin to the bottom.</p>
<p><strong>You should then select all your objects again and check if you have whole pixel values.</strong></p>
<h2>Break it up into quarters</h2>
<p>This is the most important step as this sets you up in the right way so the pattern will repeat.</p>
<h3>Duplicate 3 times</h3>
<ol>
<li>Select all your placed objects</li>
<li>Group with <kbd><kbd>cmd</kbd> + <kbd>g</kbd></kbd></li>
<li>Paste in place with <kbd><kbd>cmd</kbd> + <kbd>f</kbd></kbd> 3 times (so there are 4 in total)</li>
</ol>
<h3>Mask in quarters</h3>
<p>Take the dimensions of all your objects and divide that by two. In the case of this post, it’s 380x412, which makes 190x206.</p>
<div className="article-image">
  <img src="/images/blog/patterns-masked-quarters@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<ol>
<li>Draw a rectangle which is those dimensions (in my case 190x206)</li>
<li>Select both the rectangle and the top pattern layer</li>
<li>Click the pattern layer the selected area should change (aligning to key object)</li>
<li>In the align panel (in the menu Window &gt; Align)</li>
<li>Align to the top left</li>
<li>Press <kbd><kbd>cmd</kbd> + <kbd>7</kbd></kbd> to create a layer mask</li>
</ol>
<p><strong>Repeat this process 3 more times, except going to each corner of the pattern</strong>.</p>
<h3>Move each masked quarter to the diagonally opposite corner</h3>
<p>This is what makes the pattern repeatable, as at each of the corners it will join.</p>
<div className="article-image">
  <img src="/images/blog/patterns-diagonally-opposite-example@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>To do this quickly and accurately use the align panel and make sure you’re aligning to the artboard.</p>
<figure>
  <img src="/images/blog/patterns-diagonally-opposite-complete@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
  <figcaption>You should end up with the following.</figcaption>
</figure>

<p>Once you have them aligned correctly, select them and press <kbd><kbd>cmd</kbd> + <kbd>2</kbd></kbd> to lock them. This will ensure you don’t move them later.</p>
<h3>Fill in the remaining area</h3>
<p>There will be space in the centre, which you can fill in with the elements you used earlier. You don’t have to be too mindful of repetition here, it’s the consistency of spacing.</p>
<div className="article-image">
  <img src="/images/blog/patterns-fill-area-incomplete@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Start filling in round the edges working your way in. Once you’ve done this you can make further tweaks.</p>
<h2>Finalising the pattern</h2>
<p>The final steps will now make the pattern usable. You’ll need to expand and trim the objects that are masked, make it into a swatch and any final adjustments.</p>
<div className="article-image">
  <img src="/images/blog/patterns-complete@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<h3>Expand and trim the excess</h3>
<p>It’s the frustrating thing about masks in Illustrator, when you create a swatch it accounts for the excess masked with empty space.</p>
<ol>
<li>Expand appearance by going to <code>Object &gt; Expand Appearance</code></li>
<li>Expand the stroke and fill by going to <code>Object &gt; Expand</code></li>
<li>Open the pathfinder panel <code>Window &gt; Pathfinder</code></li>
<li>Under the ‘Pathfinders’ heading click ’Trim’</li>
</ol>
<p>You should notice a difference when selected.</p>
<h3>Add a background layer</h3>
<p>Draw a new rectangle with <kbd>m</kbd> and set it to be the size of the artboard. It can be transparent or have any fill of your choice.</p>
<p>Group together everything with <kbd><kbd>cmd</kbd> + <kbd>g</kbd></kbd>. Adding this layer helps keep the pattern correctly aligned.</p>
<h3>Make it into a swatch</h3>
<p>Open the swatches panel <code>Window &gt; Swatches</code> and drag your pattern to the swatches panel. It should appear as a usable swatch.</p>
<h3>Testing and identifying adjustments</h3>
<p>Now you’ve made the pattern into a swatch, you need to make sure it repeats nicely. Draw a large rectangle (at least 3 or 4 times larger than the pattern itself) with <kbd>m</kbd>.</p>
<p>Next, fill it with your pattern in the swatches panel. You’re now looking for mostly spacing issues that are apparent. It’s only at this stage you identify them.</p>
<h3>Applying adjustments</h3>
<p>You may have a few changes in mind, open the swatches panel and double click your pattern. You’re now in an isolated view to modify the pattern.</p>
<figure>
  <img src="/images/blog/patterns-modifying-pattern@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
  <figcaption>You will also be presented with a menu. This is quite helpful to see the results of your modifications.</figcaption>
</figure>

<p>Once you’re happy with the changes you can exit it by clicking ‘Save a Copy’ or ‘Done’ under the toolbar near the top. If you want to keep track of changes a copy may be beneficial.</p>
<h2>That’s it</h2>
<p>You should have a repeating pattern now. You can also duplicate the pattern swatch and modify the colour in the same way.</p>
<p>You can apply the technique to most patterns. The complexity depends on the type of pattern you want to make.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Kerning vs tracking: what they are and how to use them</title>
      <link>https://iamsteve.me/blog/kerning-vs-tracking</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/kerning-vs-tracking</guid>
      <pubDate>Tue, 07 Mar 2017 13:25:00 GMT</pubDate>
      <description>Understand the differences between kerning and tracking, along with how and when to use them.</description>
      <content:encoded><![CDATA[<p>When using kerning or tracking on your type it can help with legibility or correct the way type looks for a specific situation. It’s important to understand the differences and when to use them.</p>
<h2>What is kerning?</h2>
<p>Kerning is when you adjust the space between two individual letters. In the world of fonts, it’s the relationship between two letters. Making them feel like they were intentionally placed near each other.</p>
<div className="article-image">
  <img src="/images/blog/kerning-tracking-kerning-word@2x.png" alt="The word kerning with guides showing the space between each letter" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>In the image you’ll see on characters like ‘W’ that the guides go under the letter. This is an important benefit of kerning, which I will cover in more detail later in the post.</p>
<p>You’ll commonly use kerning for logo type, art directed pieces of design, and generally areas where you know the words are never going to change.</p>
<h3>Kerning is built in</h3>
<p>The vast majority of fonts will have their own kerning defined within. Letters where the space appears larger need what’s called optical adjustment. This is where the type foundry will define the way certain characters behave together. So where you have, for example, a capital ‘w’ before a letter the space will be adjusted accordingly.</p>
<h3>So why do it yourself?</h3>
<p>It’s not always perfect and it’s generally make or break for having a well-designed logo. You also have to consider the usage intentions of the typeface, as it may be more suited smaller or larger sizes. So while there is nothing stopping you from using a particular font how you wish, you will likely find undesirable spacing between letters.</p>
<div className="article-image">
  <img src="/images/blog/kerning-tracking-with-without-kerning@2x.png" alt="Comparing text with and without manual kerning applied" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>In the image there are two examples of text. The example without kerning, you can see less desirable distribution of spacing between many of the letters.</p>
<p>Particularly the ‘er’ pairing, there is too much space for the size of the type. The ‘rt’ pairing is an awkward combination, because they meet closely, but also have empty space below that. With that said they benefit from a tiny addition of space.</p>
<h3>Kerning applied to the font depends on the intended use</h3>
<p>In the example, large type was used and the kerning applied was to reduce the spaces between letters. Whereas, if I were to shrink the text down with the particular kerning applied, the spaces may need to be increased.</p>
<p>If you were to choose a display typeface the kerning will have been optimised for larger sizes. Alternatively, one for paragraph uses will be optimised for smaller sizes. Using each of these out of their intended uses will mean more adjustment is necessary.</p>
<p>A display typeface will have tighter kerning at smaller sizes, because it compensates for its use at larger sizes. A paragraph typeface will have looser kerning at larger sizes, because it compensates for its use at smaller sizes.</p>
<h2>What is tracking?</h2>
<p>Tracking is similar to kerning in the sense it adjusts the positions of letters. However, tracking adjusts all the spacing between letters by a specified amount. It disregards the relationship between letters.</p>
<figure>
<img src="/images/blog/kerning-tracking-with-tracking-kerning@2x.png" alt="Comparing the same text with tracking applied versus kerning applied" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>To spot the differences look closely at ‘rt’.</figcaption>
</figure>

<p>The differences are subtle, but important. If you compare both sets of type in the image you will notice where tracking is poorer in comparison to kerning.</p>
<h3>Tracking in CSS is similar to letter-spacing</h3>
<p>They essentially are the same. You can use the majority of measurements available to CSS, but it doesn’t take a unitless value like tracking.</p>
<p>The closest measurement to tracking is <code>em</code>. As this will make the spacing relative to the font size, which is how tracking works.</p>
<h3>How do I convert tracking to letter-spacing?</h3>
<p>The most accurate method to convert tracking for CSS, is using <code>em</code>. 100 tracking is the equivalent to <code>.1em</code>. 150 would be <code>.15em</code>, 200 <code>.2em</code> and so on.</p>
<p>Hopefully you can see the pattern that emerges for translating the two. It isn’t 100% precise, but it does match closely if you want to achieve consistency between all type on your website.</p>
<h2>How to kern in Illustrator</h2>
<p>It’s a simple task to carry out in Illustrator, however a bit trickier to master.</p>
<h3>Kern quickly with arrow keys</h3>
<div className="article-image">
  <img src="/images/blog/kerning-tracking-kerning.gif" alt="Kerning letters in Illustrator using the arrow keys" width="738" height="480" style="max-width: 100%; height: auto;" />
</div>

<ol>
<li>Press <kbd>t</kbd></li>
<li>Place your cursor between two letters</li>
<li>Hold <kbd>alt</kbd></li>
<li>Nudge with left and right arrow keys (use <kbd>shift</kbd> for larger jumps)</li>
</ol>
<h3>Precise kerning with the character panel</h3>
<div className="article-image">
  <img src="/images/blog/kerning-tracking-kerning@2x.png" alt="The kerning field in the Illustrator character panel" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<ol>
<li>Place your cursor between two characters</li>
<li>Enter a value into the box</li>
<li>Tweak until satisfied</li>
</ol>
<p>You can also use this dropdown to apply different types of kerning. For example, ‘optical’ applying this across the whole type should make the overall kerning better.</p>
<h2>How to distribute kerning space</h2>
<p>The techniques to master kerning take some time. As I mentioned earlier it’s making the space feel equal between all letters and natural. While it’s inefficient to kern whole blocks of text, doing so for logos and smaller type compositions can improve legibility as well as overall quality.</p>
<h3>Apply a little blur</h3>
<p>Doing this means you’ll see the type blur slightly. This can help identify areas where letters may merge poorly.</p>
<h3>Zoom out</h3>
<p>This has a similar effect to adding blur. Whilst it’s not an accurate representation of the way it will be read. It can help you identify poorer kerning.</p>
<h3>Optical alignment: nudge under capitals</h3>
<p>This is more of a tip. Where you have an uppercase letter like ‘T’, ‘Y’ or ‘P’ you’re usually better off nudging slightly under the letter.</p>
<div className="article-image">
  <img src="/images/blog/kerning-tracking-under-capitals@2x.png" alt="Nudging a lowercase letter under the overhang of an uppercase T" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>This may seem to go against the true bounds of the letterform, however, in the world of type, optical alignment nine times out of ten is better.</p>
<h3>Use ligatures</h3>
<p>A ligature is where two or more letters form one. They are very handy for creating a better relationship between two letters. But not every typeface has ligatures.</p>
<figure>
<img src="/images/blog/kerning-tracking-ligatures@2x.png" alt="Ligature examples showing ffl, fi and Th in regular and ligature forms" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>‘ffl’, ‘fi’ and ‘Th’ regular and ligature forms. Ligatures really help with kerning consistency.</figcaption>
</figure>

<p>The combinations in the image, show how the letters combine. It’s quite obvious and if this is new to you, it may appear worse. However, in the context of reading, your eyes only partially take in letterforms, so ligatures help with reading efficiency.</p>
<p>Ligatures improve readability because when you read and scan text you don’t take in every letterform. Ligatures can help make this more efficient by reducing awkward spaces. They are there to make things feel more natural and intentional.</p>
<h2>How to apply tracking in Illustrator</h2>
<p>Tracking requires the tweaking of one option, like kerning but controls all letters. To apply tracking it generally works in increments of 100. However, you can use any number necessary for more precise control.</p>
<div className="article-image">
  <img src="/images/blog/kerning-tracking-tracking@2x.png" alt="The tracking field in the Illustrator character panel" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<ol>
<li>Select your text layer or specific line of text</li>
<li>Open the character panel with <kbd><kbd>cmd</kbd> + <kbd>t</kbd></kbd></li>
<li>Set the value in the box by clicking the dropdown arrow or typing a number</li>
</ol>
<h3>Use cases</h3>
<p>There are a few use cases of tracking which are useful out of choosing to do so for style.</p>
<h4>Decrease tracking to titles</h4>
<p>When using a font size which is large you can increase readability by applying negative tracking.</p>
<figure>
<img src="/images/blog/kerning-tracking-tracking-titles@2x.png" alt="A heading with decreased tracking compared to the default" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>The slight decrease in tracking on large headings can help make it easier to read.</figcaption>
</figure>

<h4>Increase tracking to all/small caps</h4>
<p>When making something all capitals, usually at a small size it is stylistic. However it can usually benefit from a small increase to tracking.</p>
<figure>
<img src="/images/blog/kerning-tracking-tracking-titles-2@2x.png" alt="Small caps text with increased tracking for readability" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>The slight increase in tracking can help make it easier to read.</figcaption>
</figure>

<p>As all caps letters near each other may appear too close. Especially at a smaller size you will benefit.</p>
<h2>Recap: when to use kerning or tracking?</h2>
<p>When you have complete control over the content. Kerning only makes sense in places you can apply it quickly. It’s not possible to apply on a large scale.</p>
<p>A logo is the main use case, but you may have a one off image that you want to typeset and have ideal kerning. If you’re applying it to your own website, tracking (letter-spacing in CSS) is the better option. It’s highly inefficient and impractical to maintain kerning at that scale.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>A year in writing — 2016</title>
      <link>https://iamsteve.me/blog/a-year-in-writing-2016</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/a-year-in-writing-2016</guid>
      <pubDate>Tue, 03 Jan 2017 07:23:00 GMT</pubDate>
      <description>2016 was the second year I’ve written a post every week. This post is a summary of what’s happened over the year.</description>
      <content:encoded><![CDATA[<p>2016 was the second year I’ve written a post every week. This post is a summary of what’s happened over the year and a look back at some of the goals I had.</p>
<h2>Taking a break</h2>
<p>Firstly, it’s been challenging to write posts weekly and now feels like a good time to take a break. I want to focus on getting a solid portfolio completed and plan where this website should head. I also want to work on a few website improvements and make it more appealing long term to be subscribed to the newsletter (as I’ve been saying for months).</p>
<p>This is likely to take a couple of months, but not having to juggle it with writing a post each week allows me the focus.</p>
<h2>Thanks for reading</h2>
<p>Now on to the more positive stuff. I would like to thank you for reading and visiting this website. I have steadily begun to build a following and I’m thankful people actually find the things I write useful.</p>
<h2>Things I wanted to achieve in 2016</h2>
<p>I had several goals over the course of the year gone I wanted to achieve:</p>
<ul>
<li>Position myself a designer</li>
<li>Build my confidence</li>
<li>Become a better writer</li>
<li>Introduce higher quality content</li>
<li>Post featured images to dribbble</li>
<li>Explore the idea of screencasts</li>
</ul>
<h2>Positioning myself as a designer</h2>
<p>I’ve definitely worked on positioning myself as a designer. That has been helped by the redesign. The changes were really positive.</p>
<p>This was the most important goal, I want to be seen as a designer first. There&#39;s still a way to go and things to debate, like dropping anything code related altogether.</p>
<h3>Finding my design voice</h3>
<p>I feel more confident about posting things now, I used to have doubt. It’s still there, but I’m not as afraid to post about certain topics as I used to be.</p>
<p>I’m still working on finding my design voice. I admire the confidence and honesty of Eli Schiff, Armin Vit and Tobias Van Schneider. Each have a different approach to writing and critique.</p>
<p>They write about design without reliance on how a design meets a certain metric. We need more writing like this, but also more writing you can actually learn from. Particularly visually what makes good design. It’s a hard topic to teach.</p>
<p>This is something I still need to work on. As metrics and analytics don&#39;t stop you from designing things that look like crap.</p>
<h3>Twitter and dribbble are still an issue</h3>
<p>The main issue with twitter is I don’t tweet that much to begin with, so I don’t want it to be a self promotion feed.</p>
<p>Posting featured images (and work in general) to Dribbble is a confidence issue. I don’t think the featured images are high enough quality—so that’s something to work on over this next year. Expanding into the work I mentioned earlier with my portfolio.</p>
<h3>Explore the idea of screencasts</h3>
<p>I know the majority of my posts would work well as a video tutorial. It’s just a no brainer, but there is lengthier production times and I just never could persuade myself to do it. I recognise the importance, maybe I’ll convince myself in the future.</p>
<h3>Introduce higher quality content</h3>
<p>I was pleased with much of the content I wrote, I made a few series. Series of posts allowed me to pick something and see it through as a topic. They take a lot of planning and effort. They don’t receive a huge amount of attention.</p>
<p>It isn’t too off putting, but as the year went on I introduced the newsletter and it added to the workload. This is where things got difficult. It was hard to maintain the same quality I believe. It’s part of why I’ll be taking a break and evaluating the way I handle this.</p>
<h2>Site goals</h2>
<p>I didn’t have any make or break goals, it’s more: “if I hit this target, great.” Which I had two in mind:</p>
<ul>
<li>Achieve month on month traffic increase every month by 10%</li>
<li>40k visits per year <strong>done at the start of October</strong></li>
</ul>
<p>Growing month on month traffic by 10% was a more than ambitious goal. It scales exponentially, it was possible for a few months. The majority came very close with 8-9%.</p>
<figure>
<img src="/images/blog/year-in-writing-2016-yearly-overview@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>A graph of month by month views, compared to 2015.</figcaption>
</figure>

<p>Generally, each month traffic beat the previous month except April, August and December. April was due to a spike in March so it couldn&#39;t be matched. August and December were slower months due to the summer/holiday season.</p>
<p>Traffic continued to be strong from September through November, I almost reached the limit of the free plan in GoSquared. So that is a new problem to solve as £39/month isn’t something I can afford. Google Analytics is awful, I use it as more of a backup as I knew this day was coming.</p>
<p>It’s a shame as GoSquared is a great analytics platform for many reasons.</p>
<h2>Yearly stats</h2>
<p>Here are some of the stats from my analytics over the course of the year.</p>
<h3>Top 10 article</h3>
<ol>
<li><a href="/blog/horizontal-scrolling-responsive-menu">Creating a horizontal scrolling responsive menu</a></li>
<li><a href="/blog/creating-custom-stroke-width-profiles-in-illustrator">Creating custom stroke width profiles in Illustrator</a></li>
<li><a href="/blog/using-flexbox-for-horizontal-scrolling-navigation">Using flexbox for horizontal scrolling navigation</a></li>
<li><a href="/blog/enhancing-horizontal-scrolling-with-flickity-js">Enhancing horizontal scrolling with flickity.js</a></li>
<li><a href="/blog/flexbox-quick-wins">Flexbox quick wins</a></li>
<li><a href="/blog/get-up-to-speed-with-css-shapes">Get up to speed with CSS shapes</a></li>
<li><a href="/blog/a-guide-to-vertical-rhythm">A guide to vertical rhythm</a></li>
<li><a href="/blog/using-browsersync-and-safari-for-testing-your-responsive-website">Using BrowserSync and Safari for testing your responsive website</a></li>
<li><a href="/blog/remove-letter-spacing-from-last-letter">Remove letter-spacing from last letter</a></li>
<li><a href="/blog/using-srcset-with-the-post-thumbnail-in-wordpress">Using srcset with the_post_thumbnail() in Wordpress</a></li>
</ol>
<h3>Visits month by month</h3>
<p>A comparison table of visits in 2016 versus 2015.</p>
<table><thead><tr><th align="left">Month</th><th align="right">Visits 2016</th><th align="right">Visits 2015</th></tr></thead><tbody><tr><td align="left">January</td><td align="right">2784</td><td align="right">735</td></tr><tr><td align="left">February</td><td align="right">3140</td><td align="right">870</td></tr><tr><td align="left">March</td><td align="right">5124</td><td align="right">1122</td></tr><tr><td align="left">April</td><td align="right">3830</td><td align="right">1099</td></tr><tr><td align="left">May</td><td align="right">4324</td><td align="right">1229</td></tr><tr><td align="left">June</td><td align="right">4544</td><td align="right">1338</td></tr><tr><td align="left">July</td><td align="right">4655</td><td align="right">1473</td></tr><tr><td align="left">August</td><td align="right">4592</td><td align="right">1772</td></tr><tr><td align="left">September</td><td align="right">5855</td><td align="right">2110</td></tr><tr><td align="left">October</td><td align="right">6390</td><td align="right">2310</td></tr><tr><td align="left">November</td><td align="right">6939</td><td align="right">2488</td></tr><tr><td align="left">December</td><td align="right">5941</td><td align="right">2545</td></tr></tbody></table>

<h3>Visits by notable browser</h3>
<table><thead><tr><th align="left">Browser</th><th align="right">Visits 2016</th><th align="right">Visits 2015</th></tr></thead><tbody><tr><td align="left">Chrome</td><td align="right">38569</td><td align="right">12484</td></tr><tr><td align="left">Firefox</td><td align="right">7161</td><td align="right">2955</td></tr><tr><td align="left">Safari</td><td align="right">5295</td><td align="right">1530</td></tr><tr><td align="left">Mobile Safari</td><td align="right">2736</td><td align="right">659</td></tr><tr><td align="left">IE</td><td align="right">1027</td><td align="right">683</td></tr><tr><td align="left">Webkit-based browser</td><td align="right">486</td><td align="right">121</td></tr><tr><td align="left">Opera</td><td align="right">476</td><td align="right">148</td></tr><tr><td align="left">Chrome for iOS</td><td align="right">348</td><td align="right">113</td></tr><tr><td align="left">Edge</td><td align="right">219</td><td align="right">23</td></tr><tr><td align="left">Chromium</td><td align="right">202</td><td align="right">104</td></tr></tbody></table>

<h2>Yearly differences</h2>
<p>Traffic was up over 200% over the course of the year, a huge increase. This was down to more articles being picked up in search results and sharing happening.</p>
<h3>Found something that works? Run with it</h3>
<p>I have had a lot of success with the horizontal scrolling theme. So I have wrote 4 or so posts in relation, they have also seen a reasonable amount of popularity.</p>
<h3>Featured in CSS Layout News</h3>
<p>I was featured in CSS Layout News newsletter back in March for the <a href="/blog/get-up-to-speed-with-css-shapes">CSS shapes article I wrote</a>. That felt like the first kind of recognition. In turn directed a nice amount of traffic. It was picked up by <a href="https://blog.stephaniewalter.fr/en/pixels-of-the-week-march-18-2016/">Stephanie Walter</a> and <a href="http://heydesigner.com/css-shapes/">HeyDesigner</a> and a couple of other sites.</p>
<p>The three sources mentioned were the most significant influence.</p>
<h3>Notable tweets</h3>
<p>I wrote about <a href="http://tachyons.io/">tachyons</a> and one of the authors <a href="https://twitter.com/mrmrs_">Adam Morse (@mrmrs_)</a> tweeted it out a couple of times. This article was a positive review of tachyons, but I still didn’t expect much to come of it.</p>
<p>Many shares happened with the CSS shapes article too.</p>
<h3>Quieter through summer</h3>
<p>Things seemed quieter through July and August, versus last year where there was a significant boost. It is typically holiday season, so that&#39;s fine, come September there was a huge spike. It continued through October which was a surprise!</p>
<h3>Apple News</h3>
<p>I submitted the blog to Apple News, initially this didn’t really have an effect on traffic. However, once I had posted the case study for <a href="/blog/my-design-process-v6-case-study">version six</a>, it saw a fair amount of traffic.</p>
<p>An observation I made was ‘case study’ type posts saw more visits. Regular posts although with similar content saw much less traffic. I don’t know why this is.</p>
<h3>Overall continued growth</h3>
<p>I’ve been pleasantly surprised with the continued growth. It’s small in comparison to others, but to avoid comparison I’m pleased. However, the most important thing to me is to retain visitors, which is making progress.</p>
<h2>The redesign</h2>
<p>The biggest change to the website in 4 or so years. It has truly made a huge difference. I put the redesign live at the end of August.</p>
<p>The impact was better than I could have imagined. Page views per visitor have improved significantly. I&#39;ve already begun making many changes since and have many more in mind.</p>
<h2>On to the next year</h2>
<p>I&#39;m not going to set any goals within this post. I aim to evaluate them after I&#39;ve got my portfolio together and made some plans.</p>
<p>I hope you have a great year ahead.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Illustrator quick tip: non destructive shape editing</title>
      <link>https://iamsteve.me/blog/illustrator-non-destructive-shape-editing</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/illustrator-non-destructive-shape-editing</guid>
      <pubDate>Tue, 27 Dec 2016 07:30:00 GMT</pubDate>
      <description>You may have two shapes and want to combine them, but still want to refine the overall shape or save it for later. This post shows you two options.</description>
      <content:encoded><![CDATA[<p>Making anything in Illustrator involves using the shape tools more often than not. You combine shapes, using the various methods with pathfinder. You may have two shapes and want to combine them, but still want to refine the overall shape. This post shows you two options.</p>
<h2>There are two techniques</h2>
<p>The first technique combines two shapes but allows them to appear like one. This is handy for manipulating a shape that is transparent or refining in general. The second is a quick way of doing a clipping mask. This is handy for creating highlights and shadows, not having to worry about the outer shapes.</p>
<h2>Method one: non destructive pathfinder</h2>
<p>Pathfinder is one of the handiest tools within Illustrator which by default will combine shapes removing all knowledge of the previous state.</p>
<h3>Open the pathfinder</h3>
<p>You can do this by finding Window &gt; Pathfinder.</p>
<div className="article-image">
  <img src="/images/blog/non-destructive-pathfinder@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<h3>Draw your shapes</h3>
<p>Next the best way to demonstrate this is to draw two shapes, overlap them and reduce their opacity.</p>
<div className="article-image">
  <img src="/images/blog/non-destructive-opacity-shapes@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<h3>Select your shapes and hold alt using a pathfinder option</h3>
<p><strong>The important part is to hold alt</strong>, it will combine both shapes without destroying their paths.</p>
<div className="article-image">
  <img src="/images/blog/non-destructive-combined-shapes@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>After making using the pathfinder on the shapes, you’re free to change them as you like.</p>
<h3>Use the direct selection tool to edit further</h3>
<div className="article-image">
  <img src="/images/blog/non-destructive-move-shapes.gif" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>To select a shape press <kbd>a</kbd> to use the direct selection tool. You can also double click to isolate them, which can be easier to change the shape.</p>
<h2>Method two: choose a drawing mode</h2>
<p>Choosing a different drawing mode allows three options: normal, inside and behind. For this example you need inside.</p>
<h3>Select an object</h3>
<p>To be able to change drawing mode you need to select an object, so it can be used as a mask.</p>
<h3>Change to the inside drawing mode</h3>
<p>With the drawing mode, generally you will want to choose inside. This is a quick way to create a clipping mask out of any shape. The benefit is you can draw multiple shapes inside another shape and not worry too much about the remainder.</p>
<div className="article-image">
  <img src="/images/blog/non-destructive-toolbar@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>The icon can be found below the fill and stroke options in the toolbar.</p>
<h3>A dotted border should appear</h3>
<p>This is how you know when a different drawing mode is active. You’re free to draw shapes anywhere, however, parts will not be visible outside of the mask.</p>
<div className="article-image">
  <img src="/images/blog/non-destructive-drawing-inside@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<h3>To exit select normal drawing mode</h3>
<p>Once you’re done with drawing inside you can select the normal drawing mode.</p>
<h2>That’s everything</h2>
<p>These are two methods which allow you to combine shapes non destructively. Are there any that have been missed? <a href="https://twitter.com/irsteve">Let me know on twitter</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Let’s make a better icon system with SVG</title>
      <link>https://iamsteve.me/blog/lets-make-a-better-icon-system-with-svg</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/lets-make-a-better-icon-system-with-svg</guid>
      <pubDate>Tue, 20 Dec 2016 07:23:00 GMT</pubDate>
      <description>Icon fonts are used for their convenience, which generally can’t be matched by SVG. However, this post aims to guide you through the setup and get to a similar level of convenience.</description>
      <content:encoded><![CDATA[<p>Icon fonts are used for their convenience, which generally can’t be matched by SVG. However, they come with a huge performance downside, which SVG doesn’t have. I want to use this post as an opportunity for you to drop icon fonts and start using SVG. This post aims to guide you through the setup and get to a similar level of convenience.</p>
<h2>Icon fonts are just too convenient</h2>
<p>I saw a tweet recently from Brad Frost asking for posts that sold the use of SVG for icons. From my perspective, SVG is part of my workflow. When designing being wary of each asset that needs exporting is part of the job.</p>
<p>However, there exists the use of dropping in FontAwesome, relevant CSS and off you go. I’ve never really used FontAwesome, but I have used icon fonts and understand the speed and convenience they offer.</p>
<h2>SVG is more performant</h2>
<p>Like everything there are pros and cons. <strong>Icon fonts are at the mercy of page rendering significantly more so than SVG</strong>. You need to download the font, then the browser needs render it. <strong>In a ~3s on 3G world the icon font has to go</strong>.</p>
<h2>What SVG is up against</h2>
<p>Firstly, what are the benefits of an icon font? Listing them will provide the competition for the SVG icon system.</p>
<ul>
<li>Icon fonts can be recoloured easily</li>
<li>Hover/active states and change colour without a new image</li>
<li>Can have a simple markup and class based structure</li>
<li>Infinitely scaleable</li>
</ul>
<h3>A simple markup and class based structure is key</h3>
<p>This is the most important part. Those who write the code just want to be able to change a class name, get an icon and keep code readable.</p>
<pre><code class="language-html">&lt;button type=&quot;button&quot; class=&quot;btn btn-default btn-lg&quot;&gt;
  &lt;span class=&quot;glyphicon glyphicon-star&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt; Star
&lt;/button&gt;
</code></pre>
<p>This is the approach Bootstrap uses, so this is the benchmark to achieve. Icons should be able to be applied by changing class names eg: <code>.glyphicon-star</code> and size adjust with the sizing of an element eg: <code>.btn-lg</code>.</p>
<h2>Start with exporting</h2>
<p>So let’s say you want to use a different set of icons and start using SVG. Setup is the most significant step and is the primary reason you will be put off this approach. <strong>I’ll be using Illustrator for the next steps</strong>.</p>
<h3>Choose an icon set</h3>
<p>I’m going to use SS Standard, which was my go to icon font. <strong>The next steps are tedious, but they only have to be done once</strong>. This set has 172 icons, so not a small amount.</p>
<h3>Output all the icons</h3>
<p>Type out each icon, this depends on your icon font or set of icons. Either way, you need to fill a document with each icon.</p>
<div className="article-image">
  <img src="/images/blog/svg-vs-icon-fonts-typed-out-icons@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p><strong>Change the colour to something that isn’t black</strong>. This ensures on export everything will have a fill applied, for finding and replacing later. Black is the default colour so no fills will be applied.</p>
<h3>Expand them</h3>
<p>Select the icons in your type layer and expand them by going to Object &gt; Expand. This stops them from being a type layer (if they are).</p>
<h3>Add each icon to the Asset Export panel and name it</h3>
<p>By far the most tedious part, but a necessary step.</p>
<div className="article-image">
  <img src="/images/blog/svg-vs-icon-fonts-asset-export@2x.png" alt="" width="738" height="576" style="max-width: 100%; height: auto;" />
</div>

<h3>Exporting the icons</h3>
<p>Go to File &gt; Export for Screens.</p>
<div className="article-image">
  <img src="/images/blog/svg-vs-icon-fonts-export-for-screens@2x.png" alt="" width="738" height="576" style="max-width: 100%; height: auto;" />
</div>

<p>Click the little cog icon, next to ‘Android’.</p>
<div className="article-image">
  <img src="/images/blog/svg-vs-icon-fonts-inline-style@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Click SVG and change the ‘Styling’ option to ‘Inline Style’. This will make it easier to find and replace shortly. Finally, make sure responsive is unchecked, as when the icons are generated the fallback png will be larger.</p>
<h2>Find and replace the inline style</h2>
<p>Using the export method earlier to apply a fill to each icon, it makes it easier to find and replace. Your style attribute should look similar to <code>style=&quot;fill: #1a626e&quot;</code> in each icon file.</p>
<p>Find each inline style</p>
<pre><code class="language-html">style=&quot;fill: #1a626e&quot;
</code></pre>
<p>Replace with (or a naming convention you feel appropriate)</p>
<pre><code class="language-html">class=&quot;fill-currentcolor&quot;
</code></pre>
<p>Depending on which text editor you use this should be possible to do quickly.</p>
<p>Following the find and replace, you will need to add to your CSS:</p>
<pre><code class="language-css">.fill-currentcolor {
  fill: currentcolor;
}
</code></pre>
<h2>Method one: Use Grumpicon.com (no build tool)</h2>
<p>So now you have all your SVG files prepared, head over to <a href="http://www.grumpicon.com/">Grumpicon</a>.</p>
<h3>Upload the SVG and download the files</h3>
<div className="article-image">
  <img src="/images/blog/svg-vs-icon-fonts-grumpicon@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>After allowing Grumpicon to generate the necessary files, download them and it’s almost ready to go.</p>
<h3>Grab the script with the enhanceSVG addition</h3>
<p>Grumpicon hasn’t been updated to include the enhanceSVG option. So the loader script bundled with the download isn’t as useful. The enhanceSVG option is a crucial step in building this icon system. <strong>The script below includes enhanceSVG</strong>.</p>
<pre><code class="language-javascript">/*! grunt-grunticon Stylesheet Loader - v2.1.6 | https://github.com/filamentgroup/grunticon | (c) 2015 Scott Jehl, Filament Group, Inc. | MIT license. */
;(function (e) {
  function n(n, t, o, a) {
    &#39;use strict&#39;
    var i = e.document.createElement(&#39;link&#39;),
      r = t || e.document.getElementsByTagName(&#39;script&#39;)[0],
      d = e.document.styleSheets
    return (
      (i.rel = &#39;stylesheet&#39;),
      (i.href = n),
      (i.media = &#39;only x&#39;),
      a &amp;&amp; (i.onload = a),
      r.parentNode.insertBefore(i, r),
      (i.onloadcssdefined = function (e) {
        for (var t, o = 0; d.length &gt; o; o++)
          d[o].href &amp;&amp; d[o].href.indexOf(n) &gt; -1 &amp;&amp; (t = !0)
        t
          ? e()
          : setTimeout(function () {
              i.onloadcssdefined(e)
            })
      }),
      i.onloadcssdefined(function () {
        i.media = o || &#39;all&#39;
      }),
      i
    )
  }
  function t(e, n) {
    ;(e.onload = function () {
      ;(e.onload = null), n &amp;&amp; n.call(e)
    }),
      &#39;isApplicationInstalled&#39; in navigator &amp;&amp;
        &#39;onloadcssdefined&#39; in e &amp;&amp;
        e.onloadcssdefined(n)
  }
  var o = function (a, i) {
    &#39;use strict&#39;
    if (a &amp;&amp; 3 === a.length) {
      var r = e.Image,
        d = !(
          !document.createElementNS ||
          !document.createElementNS(&#39;http://www.w3.org/2000/svg&#39;, &#39;svg&#39;)
            .createSVGRect ||
          !document.implementation.hasFeature(
            &#39;http://www.w3.org/TR/SVG11/feature#Image&#39;,
            &#39;1.1&#39;
          ) ||
          (e.opera &amp;&amp; -1 === navigator.userAgent.indexOf(&#39;Chrome&#39;)) ||
          -1 !== navigator.userAgent.indexOf(&#39;Series40&#39;)
        ),
        c = new r()
      ;(c.onerror = function () {
        ;(o.method = &#39;png&#39;), (o.href = a[2]), n(a[2])
      }),
        (c.onload = function () {
          var e = 1 === c.width &amp;&amp; 1 === c.height,
            r = a[e &amp;&amp; d ? 0 : e ? 1 : 2]
          ;(o.method = e &amp;&amp; d ? &#39;svg&#39; : e ? &#39;datapng&#39; : &#39;png&#39;),
            (o.href = r),
            t(n(r), i)
        }),
        (c.src =
          &#39;data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==&#39;),
        (document.documentElement.className += &#39; grunticon&#39;)
    }
  }
  ;(o.loadCSS = n), (o.onloadCSS = t), (e.grunticon = o)
})(this)
;(function (e, n) {
  &#39;use strict&#39;
  var t = n.document,
    o = &#39;grunticon:&#39;,
    r = function (e) {
      if (
        t.attachEvent ? &#39;complete&#39; === t.readyState : &#39;loading&#39; !== t.readyState
      )
        e()
      else {
        var n = !1
        t.addEventListener(
          &#39;readystatechange&#39;,
          function () {
            n || ((n = !0), e())
          },
          !1
        )
      }
    },
    a = function (e) {
      return n.document.querySelector(&#39;link[href$=&quot;&#39; + e + &#39;&quot;]&#39;)
    },
    i = function (e) {
      var n,
        t,
        r,
        a,
        i,
        c,
        d = {}
      if (((n = e.sheet), !n)) return d
      t = n.cssRules ? n.cssRules : n.rules
      for (var s = 0; t.length &gt; s; s++)
        (r = t[s].cssText),
          (a = o + t[s].selectorText),
          (i = r.split(&#39;);&#39;)[0].match(/US\-ASCII\,([^&quot;&#39;]+)/)),
          i &amp;&amp; i[1] &amp;&amp; ((c = decodeURIComponent(i[1])), (d[a] = c))
      return d
    },
    c = function (e) {
      var n, r, a
      r = &#39;data-grunticon-embed&#39;
      for (var i in e) {
        a = i.slice(o.length)
        try {
          n = t.querySelectorAll(a + &#39;[&#39; + r + &#39;]&#39;)
        } catch (c) {
          continue
        }
        if (n.length)
          for (var d = 0; n.length &gt; d; d++)
            (n[d].innerHTML = e[i]),
              (n[d].style.backgroundImage = &#39;none&#39;),
              n[d].removeAttribute(r)
      }
      return n
    },
    d = function (n) {
      &#39;svg&#39; === e.method &amp;&amp;
        r(function () {
          c(i(a(e.href))), &#39;function&#39; == typeof n &amp;&amp; n()
        })
    }
  ;(e.embedIcons = c),
    (e.getCSS = a),
    (e.getIcons = i),
    (e.ready = r),
    (e.svgLoadedCallback = d),
    (e.embedSVG = d)
})(grunticon, this)
</code></pre>
<p>To keep this option build tool free is the reason I’ve added the script here. Ideally, I would link you to the source on Github, but it’s slightly different and doesn’t embed the SVG inline.</p>
<h3>Add the script and initialise grunticon</h3>
<p>Add the script to your website and additionally the initialisation of grunticon.</p>
<pre><code class="language-html">&lt;script src=&quot;grunticon.loader.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
  grunticon(
    [
      &#39;path/to/icons.data.svg.css&#39;,
      &#39;path/to/icons.data.png.css&#39;,
      &#39;path/to/icons.fallback.css&#39;,
    ],
    grunticon.svgLoadedCallback
  )
&lt;/script&gt;
</code></pre>
<p><strong>You will need to update each URL to match where your grumpicon generated files are located</strong>. Once you add an icon to your document in the next step this will ensure everything works as expected.</p>
<blockquote>
<p>You can add the <code>grunticon(…)</code> script to the <code>grunticon.loader.js</code> file and load it async for better performance.</p>
</blockquote>
<h2>Method two: with Gulp using Gulpicon</h2>
<p>Using a build tool will make this task easier in the long run. Assuming you’re already familiar with Gulp, I’ll get into the setup.</p>
<h3>Install Gulpicon and glob</h3>
<p>Navigate to where your gulpfile is stored in terminal and install gulpicon.</p>
<pre><code class="language-bash">cd ~/path/to/the/folder/gulpfile/is
</code></pre>
<p>These are the relevant npm scripts to get Gulpicon working.</p>
<pre><code class="language-bash">npm install -s gulpicon
npm install -s glob
</code></pre>
<h3>Setup the task in your gulpfile.js</h3>
<p>Adding the following to your gulpfile will make an <code>icons</code> task. In the <code>files</code> variable you may need to update this for where your SVG files are located.</p>
<pre><code class="language-javascript">var gulp = require(&#39;gulp&#39;)
var glob = require(&#39;glob&#39;)
var gulpicon = require(&#39;gulpicon/tasks/gulpicon&#39;)

// Use glob to get file paths
var files = glob.sync(&#39;./svg/*.svg&#39;)

// Set up the config object
config = {}

// Change the location
config.dest = &#39;images&#39;

// Enable inlining of SVG
config.enhanceSVG = true

// Setup the &#39;icons&#39; task
gulp.task(&#39;icons&#39;, gulpicon(files, config))
</code></pre>
<p>There are many other options you can customise, <a href="https://github.com/filamentgroup/gulpicon/blob/master/example/config.js">which can be found on Github</a>.</p>
<h2>Run the icons task</h2>
<p>With your gulpicon settings all done, all that’s left is to run the task.</p>
<h2>Using the icons</h2>
<p>To add an icon you add the relevant class, which can be found in the generated CSS file, eg: <code>icons.data.svg.css</code>. Adding the attribute <code>data-grunticon-embed</code> will allow the SVG to be inserted inline.</p>
<pre><code class="language-html">&lt;span class=&quot;icon-check&quot; data-grunticon-embed&gt;&lt;/span&gt;
</code></pre>
<p>This is all you need to add to get an icon to show.</p>
<h2>Make it reusable and flexible with colour and sizes</h2>
<p>To make your icon set more effective and more ‘bootstrap’ like you need colours and additional size classes. This is up to your preferences and website colour scheme.</p>
<pre><code class="language-css">.color-red {
  color: red;
}
.color-blue {
  color: blue;
}
.color-green {
  color: blue;
}
</code></pre>
<p>Colours don’t need to rely on using <code>fill</code>. Due to the class <code>fill-currentcolor</code> applied earlier, they will use the parent colour.</p>
<pre><code class="language-css">.icon {
  display: inline-block;
}

.icon-small,
.icon-small svg {
  width: 16px;
  height: 16px;
}

.icon-medium,
.icon-medium svg {
  width: 32px;
  height: 32px;
}

.icon-large,
.icon-large svg {
  width: 48px;
  height: 48px;
}
</code></pre>
<p>As mentioned earlier, the width and height dimensions were kept on the SVG. So the parent element of the SVG and the SVG itself both need dimensions adding.</p>
<p>For a nicer page load the parent element needs dimensions. Until the SVG is inserted, it doesn’t know the width or height.</p>
<h2>Usage now looks like this</h2>
<p>Add the relevant class names you desire and you’re good to go.</p>
<pre><code class="language-html">&lt;span class=&quot;icon icon-check icon-small color-red&quot; data-grunticon-embed&gt;&lt;/span&gt;
</code></pre>
<h2>Multicolour icons</h2>
<p>With SVG you can have multicoloured icons. Depending on your icon all you need to do is add additional class names to the individual paths. <em>This is a benefit icon fonts don’t have, you have direct control of the parts of an icon</em>.</p>
<p>It is possible to have multicolour icon fonts, in a roundabout way. This is far simpler.</p>
<h2>Reviewing against the check list</h2>
<p>To recap what was set out to be achieved:</p>
<ul>
<li>Icon fonts can be recoloured easily</li>
<li>Hover/active states and change colour without a new image</li>
<li>Can have a simple markup and class based structure</li>
<li>Infinitely scaleable</li>
</ul>
<p>Every point in the checklist has been met. Easy recolouring and states, as well as a simple one element markup structure and of course being SVG they are infinitely scaleable.</p>
<p>I hope this is a good enough argument for you to use SVG. A chunk of work is necessary, but, similar levels of work has gone into FontAwesome and Bootstrap to make your life easier. If you want to change icon set and have some uniqueness in your design, it’s a necessary step.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Monthly design roundup #2</title>
      <link>https://iamsteve.me/blog/monthly-design-roundup-2</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/monthly-design-roundup-2</guid>
      <pubDate>Tue, 13 Dec 2016 07:30:00 GMT</pubDate>
      <description>Monthly design roundup #2 — the best websites, illustration, branding, and articles I found this month, with a few notes on each.</description>
      <content:encoded><![CDATA[<p>The second in a monthly series where I roundup some of the best things in design I found over the course of the previous month. It aims to be a source of website, illustration and branding inspiration, as well as some articles that are a good read.</p>
<h2>Design</h2>
<p>There are some great websites I came across this month. Ueno have put out some great work recently, with their own rebrand and PrescribeWellness.</p>
<h3><a href="https://basecamp.com">Basecamp</a></h3>
<div className="article-image">
  <img src="/images/blog/monthly-roundup-02-basecamp@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>I really admire the approach of Basecamp as a company, and I feel like this design reflects them well. They aren’t afraid to do things differently. It’s a pleasant redesign and features a lot of illustration.</p>
<h3><a href="https://www.designinc.com">Design Inc.</a></h3>
<div className="article-image">
  <img src="/images/blog/monthly-roundup-02-designinc@2x.png" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>Design Inc. have been through a few iterations lately. The last version was better visually, but that could only go so far with the amount of services offered. This is a good fit and explains the what Design Inc. is well.</p>
<h3><a href="http://www.friendsandfools.be">Friends &amp; Fools</a></h3>
<div className="article-image">
  <img src="/images/blog/monthly-roundup-02-friends-fools@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>Big and bold design. There are some nice little details throughout the design and it’s a nice use of big type.</p>
<h3><a href="http://inturn.co">Inturn</a></h3>
<div className="article-image">
  <img src="/images/blog/monthly-roundup-02-inturn@2x.png" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>The animated illustrations help guide you through the page and it helps you to understand the service. However it could be a little more descriptive for the final point, but generally you get it.</p>
<h3><a href="https://ueno.co/">Ueno</a></h3>
<div className="article-image">
  <img src="/images/blog/monthly-roundup-02-ueno@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>Ueno are a constant source of inspiration and great work. I was curious to see what would come of their rebrand. I like how everything is nice and smooth as you scroll through.</p>
<h3><a href="http://www.thisisyoke.com/">Yoke</a></h3>
<div className="article-image">
  <img src="/images/blog/monthly-roundup-02-yoke@2x.png" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>Quite a minimalist design, but the illustrations add a bit of fun. Following that is a nice grid layout of content. Overall really well designed.</p>
<h3><a href="http://www.prescribewellness.com/">PrescribeWellness</a></h3>
<div className="article-image">
  <img src="/images/blog/monthly-roundup-02-prescribewellness@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>This certainly isn’t what you would think a healthcare website would look like. Scroll on through and there is smooth animations and little videos in the background. It makes for a surprisingly nice touch.</p>
<h3><a href="http://toi.io/">Toi</a></h3>
<div className="article-image">
  <img src="/images/blog/monthly-roundup-02-toi@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>The animated image combining real life with a ‘blueprint’ style over the top is really nice touch and adds a sense of uniqueness. It’s persisted throughout the design. Each slide and section throughout is well considered.</p>
<h2>Apps/Tools</h2>
<p>Here’s a few apps/tools I found over this month. Most notably Setapp, it seems like a great idea and beneficial to both parties where apps are concerned.</p>
<h3><a href="https://sparkmailapp.com/">Spark for Mac</a></h3>
<div className="article-image">
  <img src="/images/blog/monthly-roundup-02-spark@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>I’ve been using Spark for iOS for quite a while now. It’s been a reasonable replacement for Mailbox, and now it’s out for Mac. I was using Nylas N1 before this. I’m not completely sure it will replace Nylas, but I like I now have a cross platform mail app with snoozing again.</p>
<p>The main thing is I feel like Spark won’t suddenly disappear.</p>
<h3><a href="https://setapp.com/">Setapp</a></h3>
<div className="article-image">
  <img src="/images/blog/monthly-roundup-02-setapp@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>Setapp is a competitor to the Mac App Store. “Imagine having select applications, within easy reach whenever you need them. No stores. No ads. Just apps.” Currently in beta, but you can get an invite if you sign up. It aims to be a subscription service of apps. It looks really promising.</p>
<h3><a href="http://logominer.com/">Logo Miner</a></h3>
<div className="article-image">
  <img src="/images/blog/monthly-roundup-02-logominer@2x.png" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>If you need a logo this is the place to remember. It looks like a great source of logo files.</p>
<h3><a href="http://rightlight.nordwoodthemes.com/">Rightlight</a></h3>
<div className="article-image">
  <img src="/images/blog/monthly-roundup-02-rightlight@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>A free stock photography website, another to add to your collection to refer to. There’s some great photos, which I’m sure will be suitable for your projects.</p>
<h2>Articles</h2>
<p>Last months articles weren&#39;t very design focused, but this month the aim is to keep everything related to design.</p>
<h3><a href="https://medium.com/@andrewcouldwell/start-simple-e089d0039744#.g10tkqyid">The benefits of sketchbook work</a></h3>
<p>What this article made me think more about was the detail within sketches. Sketches can both be detailed and quick with less effort than a wireframe.</p>
<p>As lately I&#39;ve questioned the value of wireframes. They’re a time sink, for what can be little return value. It depends how you work and whether you feel they are beneficial. Over making a full design versus the discussion around them.</p>
<h3><a href="https://medium.com/@lewisplushumphreys/rethinking-message-notifications-on-ios-c201edea59a2">Rethinking message notifications on iOS</a></h3>
<p>On the face of it this looks like a small improvement, but it would be quite significant. It’s similarly frustrating to get a notification and you reply within the notification, but the other person sends additional replies.</p>
<p>This usually means you miss some messages or have to go in the app to make sure you haven’t. I could see this improving things like that.</p>
<h3><a href="http://www.vanschneider.com/beauty-vs-function">Beauty vs function</a></h3>
<p>It is seen as a crime in today’s design world to focus on making things look good. It always takes a back seat. I believe we’ll eventually come full circle and start designing things without the fear of focusing on aesthetics.</p>
<p>Tobias has posted many great articles over the past month, so I would highly recommend subscribing to his newsletter, if you haven’t already.</p>
<h3><a href="https://www.smashingmagazine.com/2015/10/space-yourself">Space yourself</a></h3>
<p>All the different spaces available to us. I’ve found this really helpful for understanding which should be used where.</p>
<h3><a href="https://boagworld.com/design/time-prioritize-visual-content/">Why it’s time to prioritise visual content</a></h3>
<blockquote>
<p>People will visit your website and scan the content in a matter of seconds. The images they see will determine the likelihood of them lingering on your website.</p>
</blockquote>
<p>It’s a fair point and a good reminder to try make content as appealing as possible. However, I don’t think you need the stock photography account recommended, there are plenty of free sites out there!</p>
<h3><a href="https://frontendcurated.com/top-monospaced-fonts-for-coding-a7d941a143fe">Top monospaced fonts for coding</a></h3>
<p>I found this a handy list to find some variety in monospaced fonts. They’re in fashion lately as well, outside of code, so it’s a useful list.</p>
<h2>That’s it for this month</h2>
<p>There has been some great web design found this month and I’m particularly excited to see where Setapp heads.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Christmas gift guide — 2016</title>
      <link>https://iamsteve.me/blog/christmas-gift-guide-2016</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/christmas-gift-guide-2016</guid>
      <pubDate>Tue, 06 Dec 2016 07:30:00 GMT</pubDate>
      <description>As it’s the festive time of year, I thought I would add to the lists of gifts that people are writing. December and Christmas in general is one of my favourite times of year.</description>
      <content:encoded><![CDATA[<p>As it’s the festive time of year, I thought I would add to the lists of gifts that people are writing. December and Christmas in general is one of my favourite times of year. Not just for the gift giving, but it&#39;s a time to relax and enjoy what surrounds Christmas. I’ve tried to gather a variety of things  from books, stationery and electronics.</p>
<p>The list is suitable for everyone, but does have that ‘for the designer’ edge. There’s a mix of things with varying price points to cover every range. I&#39;ve provided prices alongside them in the currency that the website uses. As exchange rates change so often, I thought this was the best approach.</p>
<p>Hopefully you find it handy, if like me you need ideas sometimes.</p>
<h2>Tombow ABT dual brush pen — £2.95</h2>
<figure>
<img src="/images/blog/tombow@2x.png" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
<figcaption>
Credit: Amazon
</figcaption>
</figure>

<p>I’ve used quite a few brush pens and I’m not the most skilled. However, with the limited practice I have had using them, I found this to be the easiest to use. The reason I find it easier is this particular Tombow has a sturdier brush.</p>
<p>It also helps that it comes in huge variety of colours. I like to use a cool grey, to then be able to outline in a black with more control. If you’re after more colours, it may be more cost effective to buy a set.</p>
<p><a href="https://www.amazon.co.uk/Tombow-ABT-Dual-Brush-Pen/dp/B005D6Q9VK/ref=sr_1_1?ie=UTF8&qid=1477142144&sr=8-1&keywords=tombow+brush+pen">View on Amazon</a></p>
<h2>DDC: Pretty much everything — £19.99</h2>
<figure>
<img src="/images/blog/ddc@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
<figcaption>
Credit: Amazon
</figcaption>
</figure>

<p>I’ve been learning much more about branding in recent times and I’ve bought a few books as a result. This being one of them. What made me buy this book was watching Aaron’s Skillshare classes, they are superb. He teaches with personality and enthusiasm, which makes his classes fly by.</p>
<p>I figured it would be true of the book and I wasn’t wrong. The book is inspirational like his classes and it has many great logos in it. Along with some personal stuff and you really get a feel for who Aaron is.</p>
<p><a href="https://www.amazon.co.uk/Draplin-Design-Co-Pretty-Everything-ebook/dp/B01DYIRDJK/ref=sr_1_1?ie=UTF8&qid=1477142541&sr=8-1&keywords=aaron+james+draplin">Buy on Amazon</a></p>
<h2>Logotype mini — £12.95</h2>
<figure>
<img src="/images/blog/logotype@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
<figcaption>
Credit: Amazon
</figcaption>
</figure>

<p>Similarly to the DDC book, this is another huge source of logos. It has a nice categorisation throughout so you can find similar logos, which may spark ideas for you. It lists the creators of the logos too, so you can go hunt out their websites and see what other work they have done.</p>
<p><a href="https://www.amazon.co.uk/dp/1780678576/ref=wl_it_dp_o_pC_nS_ttl?_encoding=UTF8&colid=3L1SY1AYVALIZ&coliid=IXK798N3X5N92">Buy on Amazon</a></p>
<h2>Let’s draw: Illustration school — £12.99</h2>
<figure>
<img src="/images/blog/lets-draw@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
<figcaption>
Credit: Amazon
</figcaption>
</figure>

<p>I bought this a few of months ago out of curiosity. I was drawn to the whimsical style. It’s a nice way to approach learning.</p>
<p>If you’re wanting to be better at drawing or want a good way to practice, this book will be suitable. It’s not just aimed at beginners.</p>
<p><a href="https://www.amazon.co.uk/Illustration-School-sketchpad-Sketchbook-Creatures/dp/1592539769/ref=sr_1_1?ie=UTF8&qid=1477141892&sr=8-1&keywords=illustration+school+lets+draw">View on Amazon</a></p>
<h2>Apple Watch – from £269</h2>
<figure>
<img src="/images/blog/apple-watch@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
<figcaption>
Credit: Unsplash
</figcaption>
</figure>

<p>I got an Apple Watch last Christmas, and I thought I wouldn’t want one. It’s a handy extension to the phone and has little conveniences. People generally expect you to use it most of the day, which is fair, but it’s the wrong assumption.</p>
<p>I definitely don’t, the most useful stuff for me is Apple Pay, passbook, timer, stand reminders and being able to see messages/reply. I have the notifications for only important stuff, that’s a thing that can be abused by apps so easily and is.</p>
<blockquote>
<p>The only thing I don’t recommend is getting a white colour strap. Mine got dirty very quickly!</p>
</blockquote>
<h2>Native Union Dock for Apple Watch – £50</h2>
<figure>
<img src="/images/blog/watch-dock@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
<figcaption>
Credit: Amazon
</figcaption>
</figure>


<p>Still with the watch theme, it’s somewhat necessary to have a stand for an Apple Watch. I like how the feature sold is that it’s weighted. It’s quite a frequent occurrence when my watch is charging that I can accidentally knock the cable, or it gets detached from the magnet.</p>
<p>As an aside, Native Union make some nice phone docks too.</p>
<p><a href="https://www.amazon.co.uk/Native-Union-DOCK-Apple-Watch-Slate/dp/B016CIW2CM?tag=mwgenius-21&SubscriptionId=AKIAID2HUF7VPZYSVYFQ&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B016CIW2CM&ascsubtag=-1&th=1">Buy on Amazon</a></p>
<h2>Skillshare subscription – $96 year</h2>
<div className="article-image">
  <img src="/images/blog/skillshare@2x.png" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>A yearly Skillshare subscription is affordable versus other websites. If like me you don’t always have the time to learn on a monthly basis it can become costly.</p>
<p>Not only because of cost, but I find that Skillshare has more design material. In general design being taught is an area to grow over the coming months and years. If you hunt around you could probably get it cheaper than the $96.</p>
<p><a href="https://www.skillshare.com/premium">Buy on Skillshare</a></p>
<h2>Present &amp; Correct stationery</h2>
<figure>
<img src="/images/blog/present-correct@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
<figcaption>
Credit: Present & Correct
</figcaption>
</figure>

<p>I didn’t pick anything specific from here as it’s too difficult. Everything has a distinct style, so it would be unfair to narrow it down to one thing. If you’re after any stationery, I recommend browsing.</p>
<p><a href="http://www.presentandcorrect.com/collections/write">Browse the website</a></p>
<h2>Sandqvist Hege Backpack — €220</h2>
<figure>
<img src="/images/blog/sandqvist@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
<figcaption>
Credit: Sandqvist
</figcaption>
</figure>


<p>A stylish backpack that’s not too small, but not too large and looks to cater to laptops. In last years guide I recommended a more travelling focused one. This is more suited for day to day.</p>
<p><a href="https://www.sandqvist.net/shop/hege-black">Buy on Sandqvist</a></p>
<h2>Umbra Toto Storage Caddy ~ £30</h2>
<figure>
<img src="/images/blog/umbra-caddy@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
<figcaption>
Credit: Amazon
</figcaption>
</figure>

<p>A really neat and tidy desk storage. I really like the compartment that opens.</p>
<p><a href="https://www.amazon.co.uk/Umbra-290239-048-Toto-Black-Walnut/dp/B01I58TH84/ref=sr_1_3?ie=UTF8&qid=1480934677&sr=8-3&keywords=Umbra+Toto+Storage">Buy on Amazon</a></p>
<h2>Ecooe teapot infuser — ~£16</h2>
<figure>
<img src="/images/blog/ecooe@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
<figcaption>
Credit: Amazon
</figcaption>
</figure>

<p>I’m more of a tea person over coffee. This looks like a handy way to make loose leaves go further due to the amount of water it can hold. It’s also stove friendly so it can be kept warm for longer.</p>
<p><a href="https://www.amazon.co.uk/Ecooe-Stainless-Infuser-Teapots-Stovetop/dp/B01DLIPISQ/ref=sr_1_fkmr0_2?ie=UTF8&qid=1478008007&sr=8-2-fkmr0&keywords=Ecooe+Glass+Teapot+24+Oz+Loose+Leaf+Tea+Maker+With+Stainless+Steel+Infuser+Stovetop+Safe+Tea+Kettle">Buy on Amazon</a></p>
<h2>Polaroid ZIP mobile printer – £99</h2>
<figure>
<img src="/images/blog/polaroid@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
<figcaption>
Credit: Amazon
</figcaption>
</figure>

<p>It seems to be gaining popularity small printers for printing pictures from phones. As no ink is required, just paper refills, they’re a nice way to make use of all the photos you take on your phone. The HP Sprocket is an alternative and similarly priced option to this.</p>
<p><a href="https://www.amazon.co.uk/Polaroid-Mobile-Printer-Printing-Technology/dp/B00TE8XKIS/ref=sr_1_4?s=electronics&ie=UTF8&qid=1480753318&sr=1-4">Buy on Amazon</a></p>
<h2>Fujifilm Instax mini 90 ~£119</h2>
<figure>
<img src="/images/blog/instax@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
<figcaption>
Credit: Amazon
</figcaption>
</figure>

<p>If you still want the polaroid style of camera and have the printing happen as you take the picture, this is a more modern take. There are a few variations, the mini 90 being the upper end. Polaroid do their own version too.</p>
<p><a href="https://www.amazon.co.uk/Instax-Mini-90-Camera-Shots/dp/B012CDT756/ref=sr_1_5?s=electronics&ie=UTF8&qid=1480931626&sr=1-5&keywords=instax+mini+90">Buy on Amazon</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Go2Golf logo case study</title>
      <link>https://iamsteve.me/blog/go2golf-logo-case-study</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/go2golf-logo-case-study</guid>
      <pubDate>Tue, 29 Nov 2016 07:30:00 GMT</pubDate>
      <description>I’ve been working on a recent branding project for a company called Go 2 Golf. It will be a website that will help people find golf courses across the UK. The first step for them was to have a logo made, this is the process I went through to make it.</description>
      <content:encoded><![CDATA[<p>I’ve been working on a recent branding project for a company called Go2Golf. It will be a website that will help people find golf courses across the UK. The first step for them was to have a logo made this is the process I went through to make it.</p>
<h2>Start with requirements</h2>
<p>The requirements for the logo were to be youthful and fresh. As a new company, it’s important to be recognisable too. I wanted the logo to convey golf, but still have a ‘smart’ element to the design.</p>
<div className="article-image">
  <img src="/images/blog/go2golf-casestudy-logo.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<h2>Get an understanding of the industry</h2>
<p>I set out to brush up on a little golf knowledge. As it’s not an area I’m overly familiar with, outside of the basics.</p>
<p>I was looking for an edge, to help my imagination. In turn, I found 2 under par is an eagle.</p>
<p>It was something to go off. An eagle is certainly recognisable and a strong mark. The golf crowd would know the link surely? However, on its own, you can’t immediately say ‘yes, this logo relates to golf.’</p>
<h3>Take an idea as far as you can</h3>
<p>I worked with other ideas, trying to play into the number two. Ultimately that was trying to force it. The reason I was quite set on this, is down to numbers in logotype specifically, being difficult to work with.</p>
<div className="article-image">
  <img src="/images/blog/go2golf-casestudy-sketches-1@2x.jpg" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>As time and ideas went on, aiming for something seemingly obvious. I thought more around Go2Golf is a place for finding golf course <em>locations</em>. So combining the ‘location’ symbol with a golf ball and tee.</p>
<h3>Recognise why an idea isn’t working</h3>
<p>It would be easy to go with the magnifying glass metaphor, but that’s not youthful. Nor can you really reinvent that, it would be the same as any icon.</p>
<h2>Present your ideas</h2>
<p>From my sketches, I was happy to present my explorations. I explained the strengths and weaknesses of each idea, and why I came to each idea. Some were more suitable than others.</p>
<div className="article-image">
  <img src="/images/blog/go2golf-casestudy-sketches-2@2x.jpg" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Taking the time to explain your thought process with the client early can make the process much easier when presenting a final design. Going forward with the strongest idea, the location pin and tee combination was well received.</p>
<h2>Execution</h2>
<p>Usually, I would bring the sketches into Illustrator. However, I didn’t feel it was necessary for this instance. The basic shapes would be built from what’s available in Illustrator’s tools.</p>
<div className="article-image">
  <img src="/images/blog/go2golf-casestudy-progress.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<h3>Relying too heavily on the sketches</h3>
<p>I used my sketched idea as a direct basis for creating the mark. More often than not this approach works, but this time it didn’t.</p>
<p>I made the mark a few times following sketches trying different proportions. It just wasn’t working. It was difficult, I had doubts about the idea.</p>
<h3>Leave it and come back to it</h3>
<p>Whenever you hit a roadblock it’s important to take a step back. Have a break, sleep on it, go for a walk. Anything that involves letting the idea be left alone.</p>
<p>So I came back and I gave a different approach a try. That was it.</p>
<h2>Choosing suitable type</h2>
<p>What kind of typeface can communicate golf, but meet the goals? Immediate thoughts were bold and geometric.</p>
<p>I settled upon ITC Avant Garde Gothic. Other options were the likes of Futura and Brandon Grotesque. In the end, it was to the differences in the very bold weights of Futura and Avant Garde that made the decision easier. Brandon Grotesque was a little too soft in appearance.</p>
<h2>Numbers can be quite clumsy in logos</h2>
<p>As mentioned earlier, they’re difficult to work with. Especially the number two. It has a lot of white space around it to make things feel awkward. My aim was to de-emphasise it slightly, by making it smaller. This was another factor in the type choices.</p>
<p>As a result, it adds some character and distinction to the type, whilst taking some of the attention away from it.</p>
<h2>Presentation is important</h2>
<p>I used Marvel to present the logo. At first, this may appear strange, as it&#39;s a prototyping tool.</p>
<p>However, I wanted it to be seen in the browser. While not completely in the right context, it’s always helpful to see things where it will be used most. It&#39;s also easiest to keep everyone involved on the same page.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Multiple level horizontal scrolling navigation</title>
      <link>https://iamsteve.me/blog/multiple-level-horizontal-scrolling-navigation</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/multiple-level-horizontal-scrolling-navigation</guid>
      <pubDate>Tue, 22 Nov 2016 07:30:00 GMT</pubDate>
      <description>With horizontal scrolling, submenus are quite challenging to make work. Due to the CSS you have to use, a CSS only solution isn’t viable. In this post I show you how to utilise JavaScript.</description>
      <content:encoded><![CDATA[<p>With horizontal scrolling, submenus are quite challenging to make work. Due to the CSS you have to use, a CSS only solution isn’t viable. In this post I show you how to utilise JavaScript.</p>
<h2>Getting into the example</h2>
<p>Firstly start out with what you&#39;ll end up with at the end of this post. Then onto why this solution was reached.</p>
<div style="margin: 2em 0;">
    <iframe
      height="378"
      style="width: 100%;"
      scrolling="no"
      title="Horizontal scrolling navigation with submenu"
      src="https://codepen.io/stevemckinney/embed/WowBWK?default-tab=result&theme-id=23161"
      frameborder="0"
      loading="lazy"
      allowtransparency="true"
      allowfullscreen="true">
    </iframe>
  </div>

<h2>It’s tricky</h2>
<p>The difficulty with making this function as a multilevel/submenu is purely based on how it’s achieved. If you follow the traditional markup pattern it’s not really possible without complex JavaScript.</p>
<h3>Overflow means typical methods don’t work</h3>
<p>Rightly so, you keep the related markup together using a list. Then positioning through CSS, means you can’t show the submenu. The overflow ensures it remains hidden.</p>
<div className="article-image">
  <img src="/images/blog/multilevel-scrolling-bad-example.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>As the example shows, the biggest problem is you won’t be able to get the correct width or positioning. <em>So how is it solved</em>?</p>
<blockquote>
<p>The approach unfortunately doesn’t cater too well to Wordpress. You’d have to set up a <code>wp_nav_menu</code> walker.</p>
</blockquote>
<h2>You need to use JavaScript</h2>
<p>Anyway less of the can’t, you will need to use JavaScript. Which isn’t a huge problem, you just need to ensure pages can be navigated to when it’s disabled.</p>
<h2>HTML setup</h2>
<p>You may have more submenus, but for the sake of brevity I have included the markup here for one.</p>
<pre><code class="language-html">&lt;header&gt;
  &lt;nav class=&quot;nav scroll&quot;&gt;
    &lt;a href=&quot;#&quot; class=&quot;logo&quot;&gt;Logo&lt;/a&gt;
    &lt;a href=&quot;#&quot; class=&quot;nav-item active&quot; data-id=&quot;blog&quot;&gt;Blog&lt;/a&gt;
    &lt;a href=&quot;#&quot; class=&quot;nav-item&quot;&gt;Portfolio&lt;/a&gt;
    &lt;a href=&quot;#&quot; class=&quot;nav-item&quot;&gt;Downloads&lt;/a&gt;
    &lt;a href=&quot;#&quot; class=&quot;nav-item&quot;&gt;About&lt;/a&gt;
    &lt;a href=&quot;#&quot; class=&quot;nav-item&quot;&gt;Contact&lt;/a&gt;
  &lt;/nav&gt;
  &lt;div class=&quot;submenu scroll&quot; id=&quot;blog&quot;&gt;
    &lt;a href=&quot;#&quot; class=&quot;nav-item&quot;&gt;All&lt;/a&gt;
    &lt;a href=&quot;#&quot; class=&quot;nav-item&quot;&gt;Design&lt;/a&gt;
    &lt;a href=&quot;#&quot; class=&quot;nav-item&quot;&gt;Illustrator&lt;/a&gt;
    &lt;a href=&quot;#&quot; class=&quot;nav-item&quot;&gt;Photoshop&lt;/a&gt;
    &lt;a href=&quot;#&quot; class=&quot;nav-item&quot;&gt;Development&lt;/a&gt;
    &lt;a href=&quot;#&quot; class=&quot;nav-item&quot;&gt;CSS&lt;/a&gt;
    &lt;a href=&quot;#&quot; class=&quot;nav-item&quot;&gt;JavaScript&lt;/a&gt;
  &lt;/div&gt;
&lt;/header&gt;
</code></pre>
<p>Adding an additional submenu means repeating the submenu div but changing the links to the relevant ones.</p>
<h3>The same markup pattern for the submenu</h3>
<p>As you can see, the submenu has to be separate from the actual navigation, but uses like for like markup.</p>
<p>You can use the exact same markup pattern for each submenu, so CSS doesn’t need to be different. It’s just lacking the semantic nesting that you would normally expect.</p>
<h3>data-id and id for JavaScript reference</h3>
<p>Each top level navigation item has a <code>data-id</code>. This is to reference the actual submenu which has an <code>id</code> later on with JavaScript.</p>
<h2>CSS setup</h2>
<p>The CSS required doesn’t need a huge increase to accommodate multiple levels. Each submenu will share the same scroll based CSS. The additions are for active states.</p>
<pre><code class="language-css">.scroll {
  white-space: nowrap;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  -ms-overflow-style: -ms-autohiding-scrollbar;
}

.nav-item.active {
  color: #fff;
  box-shadow: -1px 0 #727c87, 1px 0 #727c87;
  background-color: #727c87;
}

.submenu {
  height: 0;
  opacity: 0;
}

.submenu.active {
  height: auto;
  opacity: 1;
}
</code></pre>
<p><code>.scroll</code> controls the scrolling behaviour when needed. <code>.active</code> states for both navigation items and submenus. Importantly <code>.submenu</code> is hidden through the height.</p>
<p>This makes it have the ability to be transitioned, but I decided against it. The result is an ugly transition and to improve it, is out of the scope of this post.</p>
<blockquote>
<p>If you would like a more in depth understanding of this approach, <a href="/blog/horizontal-scrolling-responsive-menu">referring to the original horizontal scrolling post is best</a>.</p>
</blockquote>
<h2>JS setup</h2>
<p>The most important addition to making this work. Without JavaScript, your top level item will link through. So that should be a suitable alternative.</p>
<pre><code class="language-javascript">;(function (window, document, undefined) {
  &#39;use strict&#39;

  // Select nav items that have submenus
  var hasSubmenu = document.querySelectorAll(&#39;[data-id]&#39;)
  var active = &#39;active&#39;
  var i = 0

  // Show the submenu by toggling the relevant class names
  function showSubmenu(event) {
    // We lose reference of this when filtering the nav items
    var self = this

    // Select the relevant submenu, by the data-id attribute
    var submenu = document.getElementById(self.dataset.id)

    // Probably best to prevent clicks through
    event.preventDefault()

    // Referring to the submenu parentNode
    // find all elements that aren&#39;t the submenu and remove active class
    var otherSubmenu = Array.prototype.filter.call(
      submenu.parentNode.children,
      function (child) {
        if (child !== submenu) {
          removeChildClass(child)
        }
      }
    )

    // Referring to the the nav item parentNode
    // find all elements that aren&#39;t the submenu and remove active class
    var otherItem = Array.prototype.filter.call(
      self.parentNode.children,
      function (child) {
        if (child !== self) {
          removeChildClass(child)
        }
      }
    )

    self.classList.toggle(active)
    submenu.classList.toggle(active)
  }

  // Remove the active class
  function removeChildClass(el) {
    // Check if it exists, then remove
    if (el.classList.contains(active)) {
      el.classList.remove(active)
    }
  }

  // On clicks show submenus
  for (i = 0; i &lt; hasSubmenu.length; i++) {
    hasSubmenu[i].addEventListener(&#39;click&#39;, showSubmenu)
  }
})(window, document)
</code></pre>
<p>The summary of this code is to check for all elements with a <code>[data-id]</code> and loop through them. Adding an event listener that will use the <code>showSubmenu</code> function. This uses the <code>[data-id]</code> to find the element by ID. Finally, toggling the active class on the element and off any elements that may have it.</p>
<h2>In summary</h2>
<p>You must separate out the submenus from the item. This means breaking a setup you’re used to, but it’s really the only way. Otherwise, you would need to JavaScript to heavily manipulate things.</p>
<p>Then each navigation item needs to be related to the relevant submenu. You use JavaScript to tie that together and apply the relevant class names. Toggling the visibility of each submenu.</p>
<h2>Watch out for touch screen usability</h2>
<p>Dropdown menus on smaller screens aren’t hugely favourable. If your intention is to link to the top level item then a slightly different solution will be needed.</p>
<p>In the solution above you prevent clicks on the top level item. In terms of the blog submenu, you would have access to &#39;All&#39; as another way to get to the blog. That’s the easiest way to get round it and keep things clear.</p>
<h3>touchstart instead of click</h3>
<p>I’ve only accounted for clicks in this instance, but it should work equally as well here without the need for touchstart.</p>
<p>You would change the following line from</p>
<pre><code class="language-javascript">hasSubmenu[i].addEventListener(&#39;click&#39;, showSubmenu)
</code></pre>
<p>To the following</p>
<pre><code class="language-javascript">hasSubmenu[i].addEventListener(&#39;touchstart&#39;, showSubmenu)
</code></pre>
<h2>Accessibility issues</h2>
<p>I don’t know a huge amount about accessibility, but from my understanding it is possible using the correct aria attributes. I don’t have enough knowledge to fill the gap accurately.</p>
<h2>Example</h2>
<div style="margin: 2em 0;">
    <iframe
      height="378"
      style="width: 100%;"
      scrolling="no"
      title="Horizontal scrolling navigation with submenu"
      src="https://codepen.io/stevemckinney/embed/WowBWK?default-tab=result&theme-id=23161"
      frameborder="0"
      loading="lazy"
      allowtransparency="true"
      allowfullscreen="true">
    </iframe>
  </div>

<p>That’s everything, it’s possible that you could use a more regular setup and modify the source order with JavaScript. I didn’t want to get into that, but it may be something I revisit in the future.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Maintenance week #6</title>
      <link>https://iamsteve.me/blog/maintenance-week-6</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/maintenance-week-6</guid>
      <pubDate>Tue, 15 Nov 2016 07:30:00 GMT</pubDate>
      <description>Maintenance weeks are where detail website tasks, instead of a regular post. I spend time fixing bugs, updating grammar and posts in general, as well as adding featured images. It varies and this type of post details what’s been done.</description>
      <content:encoded><![CDATA[<p>Maintenance weeks are where detail website tasks, instead of a regular post. I spend time fixing bugs, updating grammar and posts in general, as well as adding featured images. It varies and this type of post details what’s been done.</p>
<p>So while it’s not a post that directly gives value, it helps me keep on top of the library of content that I am acquiring.</p>
<h2>Subscriber download update</h2>
<p>I’ve made the decision to go against coding it up. It’s something I’m figuring out between now and new year the direction for this website.</p>
<p>Code is hugely time consuming, for now, I’m working on making the Illustrator files better designed and more comprehensive. Thinking ahead to coding it up made me scale it back.</p>
<p>I feel like my aim should be by the end of the year, it’s a slow process. Even though it&#39;s not a huge amount of work. It&#39;s making time.</p>
<p>I want to make it something valuable and a worthwhile download. Whether that be from the structure of the document, to how I&#39;ve designed the UI kit. </p>
<h2>Search results spacing bug fix</h2>
<p>This was a fix I’d put off through stubbornness. I had to make an awkward code change to accommodate the search pages. It’s probably a CMS bug, but I’m not sure.</p>
<h2>Better font loading with font face observer</h2>
<p>I’d started things off right with the development of this site. The page load times are pretty good. However, I want to improve this further, and fonts are a huge burden on page load.</p>
<p>I&#39;ve used the <a href="http://fontfaceobserver.com">fontfaceobserver</a> technique. It makes sure the font is shown when it is downloaded and ready. It is the future for loading of fonts, from what I&#39;m aware.</p>
<h3>Speedtracker to monitor</h3>
<p>Which leads on to <a href="https://stevemckinney.github.io/speedtracker/">speedtracker</a>, which I setup recently. The rendering is certainly an area for improvement. When I was looking at the filmstrip it’s 1.5s before anything is shown.</p>
<p>Some of that comes from server connection (as it’s testing from the US and the server is UK based) so it would be ideal to get that ~1s and under 1s for UK. Hopefully the font load change improves things. This will help keep track of that.</p>
<h2>Exploring lazy loading gifs/images</h2>
<p>Many of my posts contain images now. This means that page weight goes up significantly. I’m looking for a lazy loading image library that is straightforward and accommodates a ‘no-js’ fallback. </p>
<p>I’ve used Google’s PageSpeed lazy load module before. While it was as simple as it gets, it doesn’t work with srcset and the <code>?noscript</code> parameter it adds is undesirable. <strong>If you’ve had any experience with this I would appreciate the heads up on <a href="https://twitter.com/irsteve">twitter</a></strong>.</p>
<h2>Two more hamburger alternatives</h2>
<p>Basecamp recently redesigned their website and Quartz is another I came across.</p>
<p><a href="https://basecamp.com"><img src="/images/blog/bottom-nav-basecamp.jpg" alt="Basecamp website navigation as a hamburger menu alternative" width="960" height="832" style="max-width: 100%; height: auto;" /></a></p>
<p><a href="http://qz.com"><img src="/images/blog/bottom-nav-quartz.jpg" alt="Quartz website navigation as a hamburger menu alternative" width="960" height="832" style="max-width: 100%; height: auto;" /></a></p>
<p>Both are great navigation examples. <a href="/blog/websites-using-alternatives-to-the-hamburger">View all the examples in the post</a>.</p>
<h2>That’s it</h2>
<p>Next week will be back to the normal schedule. Have a great week.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Monthly design roundup #1</title>
      <link>https://iamsteve.me/blog/month-design-roundup-1</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/month-design-roundup-1</guid>
      <pubDate>Tue, 08 Nov 2016 07:30:00 GMT</pubDate>
      <description>Monthly design roundup #1 — eight well-designed websites I found this month, with notes on what makes each one worth looking at.</description>
      <content:encoded><![CDATA[<p>This is the start of a monthly series of a roundup of well designed websites, and articles I found helpful. There is no particular theme, other than inspirational, which I hope you find is the case. I’ve added a few notes and summary to give my take.</p>
<h2>Starting with websites</h2>
<p>Here’s eight websites, there’s a lot of illustration and great use of colour throughout this set.</p>
<h3><a href="http://www.riyo.io/">Riyo</a></h3>
<div className="article-image">
  <img src="/images/blog/websites-monthly-1-riyo@2x.png" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>The top to bottom use of illustration, calming and soft colours used throughout make this a really nice design. It really builds a level of trust and reassurance. The main colour used is red, most people would get scared off using red, but it shows confidence.</p>
<h3><a href="https://www.nuageapp.com">Nuage</a></h3>
<div className="article-image">
  <img src="/images/blog/websites-monthly-1-nuage@2x.png" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>There is some stunning attention to detail throughout this website. It’s minimalism, done right. Lots of personality throughout. Great use of whitespace and clarity, which really sets itself apart from other domain vendors.</p>
<h3><a href="http://billdogg.com">Billdogg</a></h3>
<div className="article-image">
  <img src="/images/blog/websites-monthly-1-billdogg@2x.png" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>Simple straight to the point, and you know what you’re going to get without having to shove a massive image in the background. The colour choice is vibrant but not overwhelming. The illustration style really adds to the page. With little splashes of colour throughout the page it really ties it all together.</p>
<h3><a href="http://mplsmesshall.com/">Mess Hall</a></h3>
<div className="article-image">
  <img src="/images/blog/websites-monthly-1-messhall@2x.png" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>I particularly like the full viewport intro screen, that has a nice badge. It’s really well done. Which transitions smoothly into what it’s all about. There are some further nice transitions in the carousel just below.</p>
<h3><a href="https://www.tastingtable.com">Tasting Table</a></h3>
<div className="article-image">
  <img src="/images/blog/websites-monthly-1-tasting-table@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>I really like the way so much information is presented in this website. There’s a variety of ways to browse and scroll through content. It’s engaging and a refreshing design for today’s world.</p>
<h3><a href="https://waaffle.com">Waaffle</a></h3>
<div className="article-image">
  <img src="/images/blog/websites-monthly-1-waaffle@2x.png" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>Again another page without having to have a random stock photo as the background. The illustration and animations throughout are superb. I particularly like the logo, which also is used for the loading indicator.</p>
<p>I really like the use of purple, orange and yellow throughout—a tricky combination to use—which is pulled off nicely.</p>
<h3><a href="https://primeambassador.com/">Ambassador Watches</a></h3>
<div className="article-image">
  <img src="/images/blog/websites-monthly-1-ambassador@2x.jpg" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>If you’re looking for a way to communicate luxury, look no further. I like how the headings are using small caps, <em>but genuine small caps</em>. The website is spot on to match the style of the watches.</p>
<p>When I first viewed this website and to get through to a watch page, I was surprised at how little the watches cost. Great design throughout.</p>
<h3><a href="http://okmylo.com">Mylo</a></h3>
<div className="article-image">
  <img src="/images/blog/websites-monthly-1-mylo@2x.png" alt="" width="832" height="626" style="max-width: 100%; height: auto;" />
</div>

<p>Sometimes I think the huge type thing is overdone, but that’s probably because it’s done poorly. Mylo does it well. You really get a sense that you’ll be getting good fashion choices and what the app is all about. It details and presents the app really well <a href="https://twitter.com/jongold/status/694591217523363840">outside of the stereotypical page</a>, it is possible.</p>
<h2>Articles</h2>
<p>Here’s some articles that I have found a good read.</p>
<h3><a href="https://clientgiant.us/how-to-make-your-portfolio-actually-get-you-clients-f3dd1e82a93f">How to make your portfolio actually get you clients</a></h3>
<p>There’s some good advice in the article, but I’m not sure I agree with it all.</p>
<p>However, the main takeaway I gained was is there actually a good portfolio? I’ve read so many ‘do this, do that’ articles, which led me to: it depends on your situation. Are you trying to find a new job or get client work?</p>
<p>The way that you present the work if you&#39;re in either situation will be different. Then inside that there are ways you could tailor that further.</p>
<h3><a href="https://m.signalvnoise.com/ive-never-had-a-goal-c89219aedddf">I&#39;ve never had a goal</a></h3>
<p>I relate to this article in the sense I find it hard to set goals. I don’t know where exactly I want to be in 5 years. In fact over the past year or so, I’ve been more unsure than ever. I feel like you’re looked upon wrongly if you don’t.</p>
<p>I’m happy designing, writing this blog and learning. I have a rough idea of where I want things to go, but I mostly take it week by week.</p>
<h3><a href="https://medium.com/reallygoodemails/digging-into-abandoned-cart-emails-136b193cff8">Digging into cart abandonment emails</a></h3>
<p>Really Good Emails is a huge source of email knowledge. This is a great article on cart abandonment. Email is a valuable tool used right and this was an area of curiosity for me.</p>
<p>Marketing is something I know is skill I need to learn more about, as a designer it’s important. Without it you don’t sell things. I want to learn, but approach it by not being a forceful annoyance.</p>
<h3><a href="https://www.zachleat.com/web/comprehensive-webfonts/">Comprehensive guide to font loading</a></h3>
<p>I&#39;ve been looking into a way to load fonts better. Considering the flash of invisible/unstyled text, but maintaining performance.</p>
<p>I purposely load the body font asynchronously here as it slows down page load times dramatically. I want to improve this further as the sans serif, albeit less, still slows down things. This guide helps, but I&#39;m still wrapping my head round it!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Illustrator quick tip: workflow enhancing keyboard shortcuts</title>
      <link>https://iamsteve.me/blog/illustrator-keyboard-shortcuts</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/illustrator-keyboard-shortcuts</guid>
      <pubDate>Tue, 01 Nov 2016 07:30:00 GMT</pubDate>
      <description>The Illustrator keyboard shortcuts worth memorising. Not exhaustive, but the ones that save you from constantly clicking through panels and menus.</description>
      <content:encoded><![CDATA[<p>Memorising shortcuts of any application improves efficiency. Now I’m by no means the most efficient person in Illustrator, I’m generally just happy designing. However, there are shortcuts you absolutely must know, because it saves you tediously clicking through panels and menus.</p>
<h2>shift + x — Switch stroke and fill</h2>
<div className="article-image">
  <img src="/images/blog/illustrator-keyboard-shortcuts-key-1.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Switch fill to stroke, or stroke to fill. This should be a frequent occurrence, it is for me, I’m almost certain it will be for you.</p>
<h2>cmd + shift + h — Hide or show artboards</h2>
<div className="article-image">
  <img src="/images/blog/illustrator-keyboard-shortcuts-key-2.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Hide or show artboards with this shortcut. Sometimes artboards get in the way or you don’t really want to bother with one. Use this and Illustrator will hide them and turn your background white.</p>
<h2>cmd + 2 — Lock layer</h2>
<div className="article-image">
  <img src="/images/blog/illustrator-keyboard-shortcuts-key-3.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Lock layers with this shortcut. No more going into the layers panel.</p>
<h2>cmd + alt + 2 — Unlock all layers</h2>
<div className="article-image">
  <img src="/images/blog/illustrator-keyboard-shortcuts-key-4.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Unlock <strong>all</strong> layers with this shortcut. No more digging about in the layers panel wondering where the locked layer is. Even the most organised person will save a lot of time with this.</p>
<h2>cmd + y — Outline mode</h2>
<div className="article-image">
  <img src="/images/blog/illustrator-keyboard-shortcuts-key-5.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Outline mode is super handy for selecting overlapping paths or avoiding the background.</p>
<h2>cmd + shift + / — Menu search</h2>
<div className="article-image">
  <img src="/images/blog/illustrator-keyboard-shortcuts-key-6.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p><em>This is common to all applications</em>. Forget which menu ‘Offset Path’ is in? No problem, this shortcut reveals the menu search. Use the arrow keys to navigate then press enter and you don’t have to leave the keyboard.</p>
<h2>shift + o — Artboard tool</h2>
<div className="article-image">
  <img src="/images/blog/illustrator-keyboard-shortcuts-key-7.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Sometimes resizing and making artboards is quite a repetitive process. You can need to resize, duplicate and move frequently. Using this shortcut makes that a little quicker.</p>
<h2>cmd + g — Group</h2>
<div className="article-image">
  <img src="/images/blog/illustrator-keyboard-shortcuts-key-8.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Grouping things within Illustrator is common. It has many use cases, to help with alignment, help isolate appropriate objects and keep things more organised.</p>
<h2>cmd + shift + g — Ungroup</h2>
<div className="article-image">
  <img src="/images/blog/illustrator-keyboard-shortcuts-key-9.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Sometimes grouping can get out of control, it can be both a great and frustrating feature. Sometimes spamming this keyboard shortcut is the best approach.</p>
<p>I hope these shortcuts find their way into your workflow if they haven’t already. Many of these get around some of the tedious annoyances of daily work within Illustrator.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>My design process — v6 case study</title>
      <link>https://iamsteve.me/blog/my-design-process-v6-case-study</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/my-design-process-v6-case-study</guid>
      <pubDate>Tue, 25 Oct 2016 06:30:00 GMT</pubDate>
      <description>A case study of the v6 redesign of iamsteve. Covers the new logo, sketching, wireframes and the full design process from start to finish.</description>
      <content:encoded><![CDATA[<p>The redesign of this website has been needed for some time. Overall the website is quite small in terms of templates required. I wanted to put the effort into making the website feel like it is a growing source of content. There is much to cover in this, as I start with the new logo briefly, sketching, wireframes and design.</p>
<h2>Goals</h2>
<p>I needed to first determine what it was I was looking to improve with the previous design. In reality this was easy to determine:</p>
<ul>
<li>I want to be perceived as a designer</li>
<li>Design needs a stronger aesthetic</li>
<li>Reflect me as a person better</li>
<li>Make the blog more inviting</li>
<li>Encourage browsing of the website</li>
</ul>
<h3>How the goals will be addressed</h3>
<p>Some of these goals were achieved within the redesign. Some I will have to work at long term.</p>
<ul>
<li>Improve visual design</li>
<li>Introduce more colour</li>
<li>Add more images to posts</li>
<li>Have images in the post archive</li>
<li>Write more design content</li>
</ul>
<p>Essentially, when I looked at the website, in its current form, it felt embarrassing. Which is a good thing, I designed it 4–5 years ago.</p>
<p>It needed a stronger visual element to it. I need to come across as if I know what I&#39;m talking about, but also be fun, inviting and not too serious.</p>
<p>I want to teach that design should be fun as well as solving problems.</p>
<h2>The logo</h2>
<p>I started the process off small with <a href="/blog/iamsteve-a-new-logomark">a new logo</a> and tweaks to the website. It had its own set of requirements. It set the ground work for the redesign.</p>
<h2>Illustrations</h2>
<p>I have wanted to include a bit of illustration throughout my designs for a long time. For one reason or another I backed out. Usually down to the time and my skill level.</p>
<p>I’ve always liked the idea of a ‘mascot’. I’ve started small, but it allows me the opportunity to build upon these further as time goes on. I think it helps us to get past that all websites look the same feeling.</p>
<h3>Use side projects to challenge yourself</h3>
<p>I wanted to use this opportunity, to try something I don’t do often. I enjoy illustrating, but it isn’t my strongest skill. I reminded myself that it’s the only way to learn.</p>
<figure>
<img src="/images/blog/casestudy-v6-sketches-rio-osc@2x.jpg" alt="" width="738" height="1671" style="max-width: 100%; height: auto;" />
<figcaption>
Some of the sketches for both illustrations. Illustrator can be very forgiving in the overall outcome.
</figcaption>
</figure>

<h3>The final illustrations</h3>
<div className="article-image">
  <img src="/images/blog/casestudy-v6-final-illustrations.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>I’m really proud of these, it was a lengthy process of iterating on shading, and reshaping, to make them look right. I feel like I have made something good.</p>
<p>There are things I would redo and do differently, now that I’ve completed them. It’s these things that keep me going as a designer, something that is a genuine challenge and I always aim to have that with my side projects.</p>
<h2>Colour palette</h2>
<p>To begin with I always start with an initial colour palette that I iterate on during the design phase. The reason for picking initially is so that I have thought about what I want it to communicate. Iteration must happen due to the array of use cases.</p>
<p>The main goal towards usage of colour is to appear confident. When I look at other designers websites I admire, there is always great use of colour within those.</p>
<figure>
<img src="/images/blog/casestudy-v6-red-green.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>
Red is a confident colour. Green is more neutral, which evens things out.
</figcaption>
</figure>

<p>I was initially drawn to shades of red and green. Typically this is seen as a difficult colour combination to work with. Which is why I went for a green shade which had more blue feel, and a red that was more orange.</p>
<p>The relation to that was in the illustrations of the collars on my dogs. Which was down to it suits their fur colour, as strange as that may sound.</p>
<p>I paired that with yellow, dark purple and dark blue. These additional colours contrast, complement and give me a selection to work with for featured images and text.</p>
<div className="article-image">
  <img src="/images/blog/casestudy-v6-colour-palette.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>With those colours I broke them down into two complementary palettes that are tied together by a common yellow colour. Of course there are plenty of tints and shades to go along with that to use as and when necessary.</p>
<h2>Analysis and planning for the homepage</h2>
<p>Before going into the sketching I thought long about my understanding of how people use the website. The main focus is retaining new visitors. That&#39;s generally everyone’s struggle right?</p>
<p>The main idea I had was:</p>
<ol>
<li>Introduce</li>
<li>Latest content</li>
<li>Newsletter</li>
<li>Popular content within design and code categories</li>
</ol>
<p>The homepage isn’t the most visited area, it didn’t invite that. Again, the visual interest was lacking, and I believe ways to browse content.</p>
<p>I have a reasonable amount of articles with a level of popularity, this was something I wanted to bring in. As well as promote newer content. <strong>It’s important that the website is perceived as active</strong>.</p>
<h2>Analysis and planning for the articles</h2>
<p>Changing the layout dramatically here isn’t really possibly. Highly art directed articles can become a maintenance issue. They are nice, but not feasible. It’s something I want to explore over time.</p>
<p>The main issue I want to address is, increasing the amount people browse the website. The vast majority of users arrive by search. To do it without being annoying and maintaining a great reading experience.</p>
<p>My observations were:</p>
<ul>
<li>Keep a similar layout</li>
<li>Add a more editorial style where possible</li>
<li>Improve reading experience</li>
<li>Remove related articles</li>
<li>Replace with one highly relevant article</li>
<li>Allow for larger images where necessary</li>
</ul>
<h2>Sketching</h2>
<p>I had done so many sketches, settling on the idea that the introduction accompanied a latest post.</p>
<figure>
<img src="/images/blog/casestudy-v6-sketches-set-1.jpg" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>Early sketches kind of had the idea of a space theme.</figcaption>
</figure>

<p>Sketching serves as a way to explore themes and ideas that may fit the style of the website.</p>
<figure>
<img src="/images/blog/casestudy-v6-sketches-set-2@2x.jpg" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>The latest post idea emerging. A split screen with latest post and introduction too.</figcaption>
</figure>

<p>I progressed through the sketches considering the priority of the content. As mentioned earlier I did debate the value of an introductory area, which I’ve gone for. Along with the latest post it seemed the right thing to do. Following with more recent posts, the newsletter subscription and popular posts.</p>
<div className="article-image">
  <img src="/images/blog/casestudy-v6-sketches-set-3@2x.jpg" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Small screen and post versions were explored too at different stages.</p>
<h2>Wireframes, or designs without visual style</h2>
<p>I had a reasonably good idea what I wanted to do from the sketches and planning earlier. The ‘wireframes’ closely matched my sketches, for the layout and visual style to be iterated upon further.</p>
<div className="article-image">
  <img src="/images/blog/casestudy-v6-wireframe-home.png" alt="" width="738" height="1438" style="max-width: 100%; height: auto;" />
</div>

<p>I used Avant Garde throughout the wireframes. Usually I would decide typefaces early, but it can be expensive mistake if you get it wrong. I picked based upon what I had available to me already, that matched closely to the requirements. It turned out to be a good decision.</p>
<div className="article-image">
  <img src="/images/blog/casestudy-v6-wireframe-blog.png" alt="" width="738" height="1438" style="max-width: 100%; height: auto;" />
</div>

<p>I produced wireframes for only the homepage and blog/category pages.</p>
<p>The actual article page wasn’t necessary to wireframe. Many visual decisions are made within the articles which as a wireframe isn’t too helpful.</p>
<p>It was always in my mind for time saving that I focused on the core pages. As a better about and contact page can come later.</p>
<h2>Typography</h2>
<p>The specifics I wanted within typefaces aside from legibility were to fit in with the friendlier style I wanted.</p>
<h3>Headings</h3>
<p>I was looking for a sans serif, typeface that was something along the lines of, ITC Avant Garde Gothic, but not as geometric and a little softer.</p>
<div className="article-image">
  <img src="/images/blog/casestudy-v6-averta.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>I needed something that would be for the long term. I wanted to look at the choice objectively as possible. I eventually stumbled upon Averta from The Designers Foundry.</p>
<p>It has a nice variety of weights and true italics. This certainly helps longevity. It was extremely affordable and it matched everything I wanted.</p>
<h3>Paragraphs</h3>
<p>Paragraphs is more flexible in this regard, I had availability through Typekit and Cloud Typography. I ended up with Abril Text and Sentinel, as the choices.</p>
<p>They both have a relatively modern style, which pairs well with Averta. They’re both great for reading. The difficulty was choosing between them, they both worked great. In the end I settled with Sentinel.</p>
<p>Cloud Typography has really fine grained control of things like number style and ligatures. As the support for this with CSS is still limited, it’s a nice workaround.</p>
<h2>Design details</h2>
<p>After all the choices made earlier I built up the visual style. I wanted something that was light, inviting and colourful.</p>
<p>The header/navigation area I wanted to keep the overall style quite subtle. The focus would always be on the content. For new visitors, I want them to either read the introduction, or get into the latest article.</p>
<p>However, inside the articles it’s nice to have the navigation readily available at all times. It’s a balancing act, that’s why  the scroll to show/hide style has been so popular.</p>
<h3>Featured images</h3>
<p>I wanted to develop a system for featured images that worked well. So when it came to image sizes in different locations I could have featured images generate sharp sized images, from one size.</p>
<h4>The sizing of images</h4>
<p>This was too idealistic. As illustrations made at small sizes felt weird scaled up to the large size and vice versa. So I settled upon the three you see on the homepage.</p>
<p>I decided that they should try to follow screen aspect ratio, which is most commonly 1:1.6, but this felt too tall.</p>
<p>I decided upon 1:1.5, this worked well for trying to achieve vertical rhythm. It was a good basis for images within posts too. As I wanted to try have them feel consistent.</p>
<h4>My illustration style</h4>
<p>This is still a work in progress, but featured images were always going to be a challenge initially. The time to make them alongside writing and building up a style.</p>
<p>I’ve done a fair amount so far. I’ve done some I’m happy with and others not so much. The important thing is I feel like I’m making progress and developing a style. Hopefully you will see this if you browse the website.</p>
<h3>Type sizing</h3>
<p>Another tricky area to achieve balance with and variety. The idea that was prominent in my mind was type sizes are a pain to manage responsively.</p>
<figure>
<img src="/images/blog/casestudy-v6-type-sizing.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>I use 7 sizes, ranging from 48px to 14px.</figcaption>
</figure>

<p>I set about creating some rules, eg: type on small screens shouldn’t exceed 24px. I find in the majority of cases that websites overlook typography on the small screen. I didn’t want that to be the case.</p>
<p>During the development I was able to keep this nicely under control with the <a href="/blog/why-you-should-use-tachyons-to-make-css-easier">Tachyons style of writing CSS</a>. If there is one thing to use this approach for; it’s type sizing.</p>
<h2>Posts</h2>
<p>I wanted to try add some editorial ‘flair’ throughout. It’s hard to be creative with article pages in a sustainable way, so that was something to be wary of along the way.</p>
<h3>Image alignment</h3>
<p>Another part I could bring in the editorial spin was to extend the background out on the featured image.</p>
<p>All my images are generally solid colour backgrounds, so I knew I could use a bit of PHP to check the image and return the colour value. You’d never know that this is happening.</p>
<h3>Flexible image sizes</h3>
<p>Another part of the solution was to allow images to be flexible within them. As depending on the tutorial larger images may be beneficial. Then I can use that size throughout the post to keep consistency.</p>
<h3>Blockquotes</h3>
<blockquote>
<p>I use blockquotes quite frequently, to highlight key areas. I use them to ‘sign post’ things, so I figured why not do that. As you’ll see with this.</p>
</blockquote>
<h2>Archive, categories and search</h2>
<p>The main aim for these pages were to aid browsing. All the styles between them are pretty much like for like. So it builds a familiarity through navigating these pages. I kept it simple, as they aren’t the most visited or used pages.</p>
<p>I had three decisions. How many posts to display on a single page, the pagination style and the page title.</p>
<p>The answer to the how many posts to display is as many as you can get away with. I think it’s a fair balance. I wanted the page title to be small and compact.</p>
<p>The pagination at the bottom in particular I had to scale back a little. I initially wanted it to have the page numbers to navigate by. It was to do with the development making things tricky. Something I hope to find a solution for in the future.</p>
<h2>There’s still a good amount to do</h2>
<p>I’ve still got the about page to do. I’ve come round to the idea of hiring someone to write that for me, so I’m going to leave it until I have the content.</p>
<p>The contact page, the subscriber download, other improvements that build upon this redesign. It will go on. I’m motivated to get it all done.</p>
<h2>Final thoughts and reflection</h2>
<p>On reflection I’m happy with the outcome. On the brief time the redesign has been live, I’ve had a positive reaction. So far I’ve noticed positive trends in analytics data, a couple more months and it’s probably worthy of a post.</p>
<p>My main intentions were to get something out that was a strong start. As the homepage is a huge area for expansion, I’ve already been working on some improvements.</p>
<h3>On articles</h3>
<p>The same goes for articles, I’m happy with the readability. I will be adapting those as time goes on as I now have the time to invest in ideas. As mentioned earlier to make things sustainable but creative in design is tricky.</p>
<p>The biggest takeaway I gained from this was it’s important to ‘ship’ stuff you’re happy with, but pave a path for continual improvement.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Alternatives to Circular</title>
      <link>https://iamsteve.me/blog/alternatives-to-circular</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/alternatives-to-circular</guid>
      <pubDate>Tue, 18 Oct 2016 06:30:00 GMT</pubDate>
      <description>LL Circular is everywhere right now — Google, Airbnb and more. This post rounds up alternatives available on Typekit, Myfonts and Google Fonts at different price points.</description>
      <content:encoded><![CDATA[<p>Circular is very much in the spotlight at the moment. It has a distinct look to it that so many huge companies are using. From Google to airbnb, it’s everywhere. If you’re looking for alternatives — but similar — with an affordable price point for personal projects, or through a different service, this post is for you.</p>
<h2>Circular</h2>
<p>There is reason for its popularity outside of what Google has done for it. It’s a superb typeface that has many aesthetically pleasing features. So, what makes Circular distinctive?</p>
<div className="article-image">
  <img src="/images/blog/alternatives-to-circular-circular.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<ul>
<li>Low contrast</li>
<li>‘Circular’ features</li>
<li>Geometric style</li>
<li>Which retains friendliness</li>
<li>Good x-height</li>
<li>Versatile in use</li>
</ul>
<p>All these things are what I believe add up to it’s popularity. It’s modern and geometric, but friendly and approachable. It’s suitable for large and small text sizes. The alternatives that I have found try to fit that as closely as possible.</p>
<h2>myfonts.com (none are free)</h2>
<p>You could dig for ever on myfonts, there are a variety of price brackets and endless typefaces. I have found some really close matches here. It certainly is the best place for close alternatives.</p>
<h3><a href="http://www.myfonts.com/fonts/typemates/cera/">Cera</a></h3>
<div className="article-image">
  [<img src="/images/blog/alternatives-to-circular-cera.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />](http://www.myfonts.com/fonts/typemates/cera/)
</div>

<p>Possibly the closest match. It has a very similar double storey ‘a’, and similar features in contrast and geometry. However, at the same time ‘a’ having a less round bowl may detract from the similarity.</p>
<h3><a href="http://www.myfonts.com/fonts/rene-bieder/campton/">Campton</a></h3>
<div className="article-image">
  [<img src="/images/blog/alternatives-to-circular-campton.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />](http://www.myfonts.com/fonts/rene-bieder/campton/)
</div>

<p>What makes Campton a good choice is it’s reasonably similar geometry. Though not perfect as you have a single storey ‘a’, and the ‘c’ differs.</p>
<h3><a href="http://www.myfonts.com/fonts/fontfont/mark/">FF Mark</a></h3>
<div className="article-image">
  [<img src="/images/blog/alternatives-to-circular-mark.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />](http://www.myfonts.com/fonts/fontfont/mark/)
</div>

<p>FF Mark on its own is popular, it is a similar typeface. It has been used part of many bigger rebrands like mastercard. The weight, width and styles of the letters match closely.</p>
<h3><a href="http://www.myfonts.com/fonts/latinotype/texta/">Texta</a></h3>
<div className="article-image">
  <a href="http://www.myfonts.com/fonts/latinotype/texta/">
    <img src="/images/blog/alternatives-to-circular-texta.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
  </a>
</div>

<p>Texta is a good alternative because of its similar character width, double storey ‘a’, it’s not the best option but looks closer in lighter weights.</p>
<h3><a href="http://www.myfonts.com/fonts/radomir-tinkov/qanelas-soft/">Qanelas Soft</a></h3>
<div className="article-image">
  [<img src="/images/blog/alternatives-to-circular-quanelas.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />](http://www.myfonts.com/fonts/radomir-tinkov/qanelas-soft/)
</div>

<p>Qanelas Soft, as it is in the name, is possibly a little too soft to compare with Circular as precise as you would like. What stops me from suggesting <a href="https://www.myfonts.com/fonts/radomir-tinkov/qanelas/">Qanelas</a> itself is the closer match to Futura or Proxima.</p>
<h2>Google fonts</h2>
<p>Some of the matches here aren’t as close as I would like, but they do share some characteristics with Circular. Some have few weights and styles, but it’s expected for free fonts. Overall, there are a few alternatives.</p>
<h3><a href="https://fonts.google.com/specimen/Cabin">Cabin</a></h3>
<div className="article-image">
  [<img src="/images/blog/alternatives-to-circular-cabin.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />](https://fonts.google.com/specimen/Cabin)
</div>

<p>It’s a push to recommend Cabin, as the character width is narrower than Circular. However, it has quite a friendly feel to it.</p>
<h3><a href="https://fonts.google.com/specimen/Rubik">Rubik</a></h3>
<div className="article-image">
  [<img src="/images/blog/alternatives-to-circular-rubik.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />](https://fonts.google.com/specimen/Rubik)
</div>

<p>Rubik is a little bit of a weird example, and admittedly scraping the barrel for alternatives on Google Fonts. However, if you look past the softer edges of the characters and slight squareness, it&#39;s a reasonable match.</p>
<h3><a href="https://fonts.google.com/specimen/Montserrat">Montserrat</a></h3>
<div className="article-image">
  [<img src="/images/blog/alternatives-to-circular-montserrat.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />](http://www.myfonts.com/fonts/fontfont/mark/)
</div>

<p>Personally, this is the closest Google Font you will get to Circular. Montserrat has a good variety of weights, and it matches Circular well in x-height, weight and width.</p>
<h3><a href="https://fonts.google.com/specimen/Work+Sans">Work Sans</a></h3>
<div className="article-image">
  [<img src="/images/blog/alternatives-to-circular-work.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />](http://www.myfonts.com/fonts/fontfont/mark/)
</div>

<p>Work Sans is another good Google Fonts alternative, however, it is let down by the heavier weights. The contrast is noticeably higher at the heavier weights. It does have a friendly feel to it though.</p>
<h2>Typekit</h2>
<p>A reasonably wide variety can be found on Typekit, with plenty of weights and styles. I’m sure there will be others too. Some aren&#39;t the closest matches, but nonetheless share similar characteristics.</p>
<h3><a href="https://typekit.com/fonts/usual">Usual</a></h3>
<div className="article-image">
  [<img src="/images/blog/alternatives-to-circular-usual.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />](https://typekit.com/fonts/usual)
</div>

<p>A better example at lighter weights, like some of the others it loses its resemblance at heavier weights.</p>
<h3><a href="https://typekit.com/fonts/effra">Effra</a></h3>
<div className="article-image">
  [<img src="/images/blog/alternatives-to-circular-effra.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />](https://typekit.com/fonts/effra)
</div>

<p>A good example generally, however, it can be let down by the curves on letters like &#39;q&#39;, &#39;d&#39; and &#39;g&#39;. If you ignore those and look at the weight of characters and x-height, it shares similarity. Letter shapes like &#39;c&#39; also share similarity.</p>
<h3><a href="https://typekit.com/fonts/soleil">Soleil</a></h3>
<div className="article-image">
  [<img src="/images/blog/alternatives-to-circular-soleil.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />](https://typekit.com/fonts/soleil)
</div>

<p>Another good example where the weight and x-height of characters do match quite well. At lighter weights particularly it is a good match, when you get to the heavier weights, the characters are possibly a little narrow.</p>
<h3><a href="https://typekit.com/fonts/gibson">Gibson</a></h3>
<div className="article-image">
  [<img src="/images/blog/alternatives-to-circular-gibson.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />](https://typekit.com/fonts/gibson)
</div>

<p>Gibson on the face of things is a good match, it’s also a pretty solid alternative to the likes of Gotham.</p>
<h3><a href="https://typekit.com/fonts/europa">Europa</a></h3>
<div className="article-image">
  [<img src="/images/blog/alternatives-to-circular-europa.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />](https://typekit.com/fonts/europa)
</div>

<p>Europa is possibly one of the best alternatives you&#39;ll find in typekit. It has very similar geometry to Circular, making it a good match with the double storey &#39;a&#39;, single storey &#39;g&#39;. You also have the &#39;c&#39; which has a similar opening.</p>
<h3><a href="https://typekit.com/fonts/faricy-new">Faricy New</a></h3>
<div className="article-image">
  [<img src="/images/blog/alternatives-to-circular-faricy.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />](https://typekit.com/fonts/faricy-new)
</div>

<p>Faricy New has good geometry on the ‘a’, but potentially lacks the linear contrast that Circular has.</p>
<h2>Hopefully these provide suitable alternatives</h2>
<p>Circular is a popular typeface, but it comes with a significant price tag too. So for projects that don’t quite have the budget, these typefaces may provide alternatives.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Shop filter series: visual style completion</title>
      <link>https://iamsteve.me/blog/shop-filter-series-visual-style-completion</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/shop-filter-series-visual-style-completion</guid>
      <pubDate>Tue, 11 Oct 2016 06:30:00 GMT</pubDate>
      <description>In the last post the basis for the visual style was set. In this post it will continue with that to complete the filters. There are some challenging areas like colour selection, as it can look overwhelming.</description>
      <content:encoded><![CDATA[<p>In the last post the basis for the visual style was set. In this post it will continue with that to complete the filters. There are some challenging areas like colour selection, as it can look overwhelming and how to handle the closing of filters.</p>
<h2>Catch up</h2>
<p>To catch up with where this post is, <a href="https://iamsteve.me/blog/entry/shop-filter-series-visual-style">the files from the previous post are available</a>.</p>
<h2>Completed files</h2>
<p>If you’d like to skip ahead and <a href="https://www.dropbox.com/s/n6588ng7mux01b4/shop-filter-04.ai?dl=0">you can download the completed design files</a>.</p>
<h2>Colour reference</h2>
<p>I have numbered colours in the table for easy reference.</p>
<table>
<thead>
<tr>
<th align="left">Number</th>
<th align="left">Name</th>
<th align="right">Hex</th>
</tr>
</thead>
<tbody><tr>
<td align="left">1</td>
<td align="left">Light orange</td>
<td align="right">#fcfaf7</td>
</tr>
<tr>
<td align="left">2</td>
<td align="left">Orange</td>
<td align="right">#e8bba2</td>
</tr>
<tr>
<td align="left">3</td>
<td align="left">Dark blue</td>
<td align="right">#1d232e</td>
</tr>
<tr>
<td align="left">4</td>
<td align="left">Blue</td>
<td align="right">#2e323b</td>
</tr>
</tbody></table>
<h2>Highlight the open filter</h2>
<p>Starting with the filter bar, it was left completed, but without a way to highlight the current filter being open.</p>
<h3>Hiding the open filter icon in each artboard</h3>
<p>The first step to this is to use the direct selection tool by pressing <kbd>a</kbd>.</p>
<figure>
<img src="/images/blog/shop-filter-04-direct-selection.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>your paths should gain a blue outline when selected.</figcaption>
</figure>

<p>Then select the icon path for the current icon. Changing the fill to colour 3, the filter background colour.</p>
<p>You’ll notice that by doing this none of the other symbols update. This is because this was made as a dynamic symbol. Which allows the editing of fills.</p>
<p><strong>Repeat this for the other icons</strong>.</p>
<h3>Change the text colour</h3>
<p>Similarly to the icon, use the direct selection tool and select the text for each of the open filters.</p>
<p><strong>Change the fill to colour 1</strong>. This is beneficial in the long run, as you may want to tweak things further.</p>
<blockquote>
<p>You may need to expand your text to modify the colour by using either <kbd>cmd + e</kbd> or going to Object &gt; Expand. An unfortunate limitation of dynamic symbols.</p>
</blockquote>
<h3>Close icon</h3>
<p>At the start of this series <a href="https://www.dropbox.com/s/dvbi1mvp8w9ttsi/shop-tabbar-icons.ai?dl=0">I made some icons for download</a>. <strong>Using the larger ‘x’ icon or making your own will be necessary for the next step</strong>.</p>
<figure>
<img src="/images/blog/shop-filter-04-progress-1.png" alt="" width="738" height="630" style="max-width: 100%; height: auto;" />
<figcaption>Your artboards should resemble the following.</figcaption>
</figure>

<p>Copy the icon and paste it into the art board and place it above the text replacing where the previous icon was.</p>
<h2>Getting into the filters</h2>
<p>So the first few steps are ones that are pretty consistent across each filter.</p>
<h3>Transparent overlay</h3>
<p>The overlay is added to bring focus to the filters and add a layer of depth. It doesn’t currently fit in with the theme.</p>
<div className="article-image">
  <img src="/images/blog/shop-filter-04-progress-3.png" alt="" width="738" height="630" style="max-width: 100%; height: auto;" />
</div>

<p><strong>Change the fill to colour 3 and the opacity to 80%</strong>. The reason for the opacity change is to give a hint, as to what’s behind. When the transparency feels off it can make things look ‘muddy’ with the weird contrast it creates.</p>
<h3>All text to be colour 2</h3>
<p>Some quick colour changes can be made in the next couple of steps. <strong>Change all text that exists within the filters to colour 2</strong>. This will help legibility for the next step.</p>
<p>The quickest way to do this is by <strong>selecting a text object and going to Select &gt; Same &gt; Fill Color</strong>.</p>
<h3>White backgrounds to colour 3</h3>
<p>All the rectangles that have a white fill can be changed to colour 3. Excluding the size and colour filters, those will be done in a later step.</p>
<h2>Type and brand</h2>
<p>Both of these filters are very similar in style. In these steps you’re going to apply borders between the items, this will make things feel equally spaced and define boundaries.</p>
<figure>
<img src="/images/blog/shop-filter-04-progress-4.png" alt="" width="738" height="630" style="max-width: 100%; height: auto;" />
<figcaption>
A reference for the placement of the dividers.
</figcaption>
</figure>

<h3>Vertical divider</h3>
<p>Firstly draw a vertical line by pressing <kbd>/</kbd>. Then make the line span the height of the types, which is 280px.</p>
<p><strong>Change the stroke to colour 4 and the thickness to 2px</strong>. You should be able to copy and paste this in place on the brand artboard with <kbd>cmd + f</kbd>.</p>
<h3>Horizontal dividers</h3>
<p>Similarly to the vertical divider, draw a horizontal line. Same stroke weight and colour. Place them between each row of items.</p>
<h3>Overlapping dividers</h3>
<p>It’s likely the vertical divider is overlapping the filters. Select each of them and use <kbd>cmd + g</kbd> to group.</p>
<p>Then <kbd>cmd + [</kbd> to move backwards to the point where they no longer overlap.</p>
<h3>Increase font weight</h3>
<p>To give the names a little more legibility increase their weight. Depending on the font you’re using, semibold should be enough of an increase.</p>
<h2>Size</h2>
<p>Select all the size related things and use <kbd>cmd + g</kbd> to group them together. Double click the group, this should isolate the selection.</p>
<h3>Fill and stroke</h3>
<p>Highlight one of the rectangles that has a white fill and go to <strong>Select &gt; Same &gt; Fill and Stroke</strong>.</p>
<div className="article-image">
  <img src="/images/blog/shop-filter-04-progress-5.png" alt="" width="738" height="630" style="max-width: 100%; height: auto;" />
</div>

<p><strong>Change the stroke to colour 4, and the fill to colour 3</strong>.</p>
<h2>Changing the corner radius</h2>
<p>To change the corner radius you need to select the object and press <kbd>a</kbd>. This enables the ability to do that.</p>
<div className="article-image">
  <img src="/images/blog/shop-filter-04-corner-radius.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>In the toolbar you should see ‘corners’ change the value to 4px.</p>
<h3>Increase font weight</h3>
<p>Again like the type and brand increase the font weight to semibold.</p>
<h2>Price</h2>
<p>The price needs to draw most attention to the handles.</p>
<div className="article-image">
  <img src="/images/blog/shop-filter-04-progress-6.png" alt="" width="738" height="630" style="max-width: 100%; height: auto;" />
</div>

<h3>Handle fill &amp; shadow</h3>
<p>Select the handles and fill them with colour 2.</p>
<figure>
<img src="/images/blog/shop-filter-04-handle-dropshadow.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>A black shadow with 60% opacity. 0px X offset, 2px Y offset, 2px blur.</figcaption>
</figure>

<p>Select both of the handles, and go to the ‘fx’ menu and go to Stlylize &gt; Drop Shadow. Adding the shadow gives subtle depth.</p>
<h3>Range rectangle</h3>
<p>Select the rectangle that connects the handles, and change the fill to black #000, and add the consistent 2px stroke in colour 4.</p>
<h3>Increase font weight</h3>
<p>Finally, increase the font weight of the price text to semibold.</p>
<h2>Colour</h2>
<p>With price complete it moves on to colour, which is quite tricky. The shapes need a little adjustment and the colours need to have a subtlety about them. This is because it can look quite garish otherwise.</p>
<div className="article-image">
  <img src="/images/blog/shop-filter-04-progress-7.png" alt="" width="738" height="630" style="max-width: 100%; height: auto;" />
</div>

<h3>Make the text semibold</h3>
<p>Like previous steps each colour name can be made semibold.</p>
<h3>Resize the rectangles and make circular</h3>
<p>Change the width to 44px, the height is fine. Change the corner radius to 22px.</p>
<h3>Add a stroke and fill</h3>
<p>Each circle has a 2px border and the relevant fill but at 40% opacity. This gives enough of an indication, without it being overwhelmingly colourful.</p>
<p>With the dark background colours can be lower in saturation and darker. The background brings them out. I’ve referenced the colours used in the table.</p>
<table>
<thead>
<tr>
<th align="left">Name</th>
<th align="right">Hex</th>
</tr>
</thead>
<tbody><tr>
<td align="left">White</td>
<td align="right">#fff</td>
</tr>
<tr>
<td align="left">Black</td>
<td align="right">#000</td>
</tr>
<tr>
<td align="left">Red</td>
<td align="right">#bc464f</td>
</tr>
<tr>
<td align="left">Blue</td>
<td align="right">#5377aa</td>
</tr>
<tr>
<td align="left">Orange</td>
<td align="right">#e0913b</td>
</tr>
<tr>
<td align="left">Green</td>
<td align="right">#58ca74</td>
</tr>
<tr>
<td align="left">Grey</td>
<td align="right">#938a86</td>
</tr>
<tr>
<td align="left">Purple</td>
<td align="right">#9673c9</td>
</tr>
<tr>
<td align="left">Yellow</td>
<td align="right">#ffe05f</td>
</tr>
<tr>
<td align="left">Turquoise</td>
<td align="right">#26afaa</td>
</tr>
<tr>
<td align="left">Light blue</td>
<td align="right">#9bb8e8</td>
</tr>
</tbody></table>
<h3>Align the text centrally</h3>
<p>As the space has now increased between each item you want to make it feel more intentional.</p>
<p><strong>Centralise the text by selecting the circle and text object, then click the circle again</strong>. Then using the align panel horizontally align them.</p>
<p>Once they’ve individually been aligned, you can align them centrally to the artboard.</p>
<h2>That’s it</h2>
<p>It’s complete, from here it’s time to code, but that’s for another time. <a href="https://www.dropbox.com/s/n6588ng7mux01b4/shop-filter-04.ai?dl=0">Feel free to download the completed files</a>. One oversight I made during this process was a way to clear the filters. How would you solve that?</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Shop filter series: visual style</title>
      <link>https://iamsteve.me/blog/shop-filter-series-visual-style</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/shop-filter-series-visual-style</guid>
      <pubDate>Tue, 04 Oct 2016 06:30:00 GMT</pubDate>
      <description>The previous post in the series completed the wireframes. They’re a solid basis for adding visual style. The content and interface elements required are all there. Further layout refinements, colour choices, typography and clarity improvements will be made throughout this post.</description>
      <content:encoded><![CDATA[<p>Last in the series completed the wireframes. Now they&#39;re a solid basis for adding visual style. The content and interface elements required are all there. Further layout refinements, colour choices, typography and clarity improvements will be made.</p>
<h2>Catch up</h2>
<p>Previous to this was the completion of the &#39;wireframes&#39;. Setting the basis for the layout for applying the visual style in this post.</p>
<ul>
<li><a href="https://www.dropbox.com/s/vxpksfg4jbuvooh/shop-filter-02.ai?dl=0">Download the previous post files</a></li>
<li><a href="https://www.dropbox.com/s/rs71onlfjhmexqz/shop-filter-03-swatches.ai?dl=0">Download the colour palette swatches</a></li>
</ul>
<h2>Skip ahead</h2>
<p>If you&#39;d like to download the files to have a look and skip ahead feel free.</p>
<p><a href="https://www.dropbox.com/s/z65qulr5un5pmso/shop-filter-03.ai?dl=0">Download the designs for this post</a>.</p>
<h2>Where you’ll be at the end of this post</h2>
<p>At the end of this post the majority of the visual style will be applied, aside from on the filters themselves.</p>
<div className="article-image">
  <img src="/images/blog/shop-filter-03-progress-5.png" alt="" width="738" height="630" style="max-width: 100%; height: auto;" />
</div>

<h2>Colour palette</h2>
<p>Firstly it’s necessary to choose colour palette. This really sets the tone for how things move forward. Choosing this early on is ideal. For this design the intention is to have a luxurious feel.</p>
<div className="article-image">
  <img src="/images/blog/shop-filter-03-colour-palette.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<table>
<thead>
<tr>
<th align="left">Number</th>
<th align="left">Name</th>
<th align="right">Hex</th>
</tr>
</thead>
<tbody><tr>
<td align="left">1</td>
<td align="left">Light orange</td>
<td align="right">#fcfaf7</td>
</tr>
<tr>
<td align="left">2</td>
<td align="left">Orange</td>
<td align="right">#e8bba2</td>
</tr>
<tr>
<td align="left">3</td>
<td align="left">Dark blue</td>
<td align="right">#1d232e</td>
</tr>
<tr>
<td align="left">4</td>
<td align="left">Blue</td>
<td align="right">#2e323b</td>
</tr>
</tbody></table>
<p>I decided to go for a dark, ‘rose gold/copper’ palette. Keeping it reasonably monochrome it helps to meet the luxury criteria.</p>
<p>Things with a dark theme tend to be trickier to design, so this makes for a good challenge. There can be different considerations you need to make throughout.</p>
<h3>Opening swatches</h3>
<div className="article-image">
  <img src="/images/blog/shop-filter-03-import-swatches.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>If you downloaded the swatch palette earlier, open the swatches panel by going to Window &gt; Swatches. Then click the little icon at the top right of the panel. In that menu go to ‘Open Swatch Library’, then ‘Other Library’.</p>
<p>Navigate to the swatch file in this post and you should be good to go.</p>
<h2>Typeface</h2>
<p>I’m going to continue to use Averta, from The Designers Foundry. Alternatively Cabin or Work Sans on Google Fonts are similar free options.</p>
<p>The aim will be to continue to communicate the message through the design. Averta fits the luxury feel  and works well at the smaller sizes used throughout.</p>
<p>Low contrast sans serifs, or higher contrast serifs are good matches for the style.</p>
<h2>Remove close</h2>
<p>The more I thought about it the more it was the wrong decision to add this in the previous post. There are two reasons: aesthetically it is randomly placed and it would be difficult to reach.</p>
<p><strong>Remove each of the close elements</strong>. In the coming steps it will be replaced in a more reach friendly position.</p>
<h2>Filter bar</h2>
<p>In the first art board you’re using as the base. Double click the filter bar to edit the symbol.</p>
<h3>Set the background</h3>
<p>Select each of the background squares and fill them with colour 3.</p>
<h3>Fill the icons and text</h3>
<p>Select all the icons and text and change their fill to colour 2. You can do this quicker by going to Select &gt; Same &gt; Fill or Stroke.</p>
<h3>Add subtle dividers</h3>
<p>To add to the luxury feel add dividers between each filter.</p>
<ul>
<li>Draw a vertical line <kbd>/</kbd> that is 16px</li>
<li>Change stroke weight to 2px and colour 4</li>
<li>Drag it to the centre of the first and second rectangles</li>
<li>When it snaps let go</li>
<li>Align centrally</li>
<li>Duplicate for the other 3</li>
</ul>
<div className="article-image">
  <img src="/images/blog/shop-filter-03-progress-1.png" alt="" width="738" height="630" style="max-width: 100%; height: auto;" />
</div>

<h2>Header, logo &amp; icons</h2>
<p>Firstly, delete the white and transparent rectangle. This will make editing things easier and clearer.</p>
<p>Then, similarly to the filter bar, double click to edit the symbol. Make the background colour 3 and change the icon strokes to colour 2.</p>
<h2>Content</h2>
<p>Moving on to content, select the background layer and change the colour to number 4.</p>
<div className="article-image">
  <img src="/images/blog/shop-filter-03-progress-2.png" alt="" width="738" height="630" style="max-width: 100%; height: auto;" />
</div>

<h3>All text</h3>
<p>Change all the text colour to number 2.</p>
<h3>Images</h3>
<p>You can add actual placeholder images or change their background colour to 4. This will make things more realistic or more fitting.</p>
<div className="article-image">
  <img src="/images/blog/shop-filter-03-progress-3.png" alt="" width="738" height="630" style="max-width: 100%; height: auto;" />
</div>


<h2>Further building up visual style</h2>
<p>Now you have something that looks complete. However, you can add a little extra affordance by adding a shadow to the filter navigation.</p>
<h3>Add a drop shadow to the filters</h3>
<p>Copy one of the rectangles for a filter background. Paste it in place <kbd>cmd + f</kbd>. Make the width 320px by stretching it to the artboard or using the transform panel.</p>
<div className="article-image">
  <img src="/images/blog/shop-filter-03-dropshadow-menu.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Click the ‘fx’ icon and go to Stylize &gt; Drop Shadow.</p>
<div className="article-image">
  <img src="/images/blog/shop-filter-03-dropshadow-settings.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Add a black shadow with the settings 80% opacity 0px X and Y offset, 4px blur.</p>
<div className="article-image">
  <img src="/images/blog/shop-filter-03-progress-4.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Finally, move that layer backwards with <kbd>cmd + [</kbd>.</p>
<h3>Add a gradient to filters</h3>
<p>Now that the shadow has been added, it causes a bit of an undesirable blended appearance. To account for that you need to add a gradient to each of the rectangles. It’s kind of like a bevel highlight.</p>
<div className="article-image">
  <img src="/images/blog/shop-filter-03-progress-5.png" alt="" width="738" height="630" style="max-width: 100%; height: auto;" />
</div>

<p>Select each of the individual rectangles, and open the gradient panel, by going to Window &gt; Gradient. Click the gradient in the panel, which should change the fills, to a white to black gradient.</p>
<div className="article-image">
  <img src="/images/blog/shop-filter-03-filter-gradient.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Using colours 3 and 4 in the two gradient points. The first point at 92.5% and the other at 100% creates a subtle highlight.</p>
<p>Finally change the angle to 90°.</p>
<h2>That’s it for this part</h2>
<p>The aim for this post was to show you how to use a darker colour palette. There were limited colours, but it allowed all of them to be used purposefully.</p>
<p>Shadows can be difficult to convey well in a darker palette. The use of a highlight is valuable here.</p>
<p>All that’s left is to complete the visual style for the filters.</p>
<p>Again, here’s <a href="https://www.dropbox.com/s/z65qulr5un5pmso/shop-filter-03.ai?dl=0">the Illustrator files to download</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Maintenance week #5</title>
      <link>https://iamsteve.me/blog/maintenance-week-5</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/maintenance-week-5</guid>
      <pubDate>Tue, 27 Sep 2016 06:24:00 GMT</pubDate>
      <description>Maintenance week #5 — bug fixes, grammar improvements, and adding featured images to older posts. A rundown of what was done instead of a regular post.</description>
      <content:encoded><![CDATA[<p>Maintenance weeks are where detail website tasks, instead of a regular post. I spend time fixing bugs, updating grammar and posts in general, as well as adding featured images. It varies what I will do, and this posts serves as detailing what has been done.</p>
<p>So while it’s not a post that directly gives value, it helps me keep on top of the library of content that I am acquiring.</p>
<h2>Focusing on the newsletter</h2>
<p>It had become clear I wasn’t getting any closer to completing a download to go with subscribing to the newsletter. I spent this week working on this as much as I could.</p>
<figure><img src="/images/blog/maintenance-week-color.png" alt="" width="738" height="554" style="max-width: 100%; height: auto;" /><figcaption>Colour and icons</figcaption></figure>
<figure><img src="/images/blog/maintenance-week-breakdown.png" alt="" width="738" height="554" style="max-width: 100%; height: auto;" /><figcaption>Input fields make up the majority of forms, in slightly differing variations</figcaption></figure>
<figure><img src="/images/blog/maintenance-week-state.png" alt="" width="738" height="554" style="max-width: 100%; height: auto;" /><figcaption>Those fields have an individual state based on validation or focus</figcaption></figure>
<figure><img src="/images/blog/maintenance-week-checkbox.png" alt="" width="738" height="554" style="max-width: 100%; height: auto;" /><figcaption>Checkbox, radio & switch styles</figcaption></figure>
<figure><img src="/images/blog/maintenance-week-button.png" alt="" width="738" height="554" style="max-width: 100%; height: auto;" /><figcaption>Buttons with variety</figcaption></figure>

<p>Working on it infrequently was getting nowhere fast. As a subscriber it’s important that I repay that. So I am working on a form UI kit, it will be both Illustrator ready, and coded up for you to use. It will use much of the experience I’ve had with forms over the years to get a consistent style everywhere.</p>
<p>This is something I expect to expand upon over time, so I’m making it part of a git repository to keep track of what changes.</p>
<h2>Small layout change to entries</h2>
<p>I’ve moved the titles below the images, I feel like this is a better balance to the page. I want to adjust the title/image area quite a lot over the coming weeks to try add a more editorial/interesting spin on the layout.</p>
<h2>Portfolio</h2>
<p>/portfolio was originally where I had that, but recently I’ve begun to put one together on Adobe Portfolio at <a href="http://stevemckinney.net">stevemckinney.net</a>.</p>
<p>As a few visitors still somehow find their way there, I needed to put something to direct to the right place.</p>
<h2>A featured image for these posts</h2>
<p>Slowly but surely I’m getting into the rhythm of making these. I go back and forth with the style, but it’s a good way to practice illustrative styles.</p>
<h2>CMS updates</h2>
<p>It’s always important to keep your CMS up to date.</p>
<h2>It has been relatively bug free</h2>
<p>I’m surprised there hasn’t been more bugs. I’m aware of one with pagination, but that requires a frustrating rework. It’s an intermittent bug, so I’m not sure it’s worth the time investment.</p>
<p>There’s also some spacing issues in search results. This one again is tricky, as the search results share the same markup as the archive listing.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Shop filter series: completing the filters</title>
      <link>https://iamsteve.me/blog/shop-filter-series-completing-the-filters</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/shop-filter-series-completing-the-filters</guid>
      <pubDate>Tue, 20 Sep 2016 06:30:00 GMT</pubDate>
      <description>Continuing from the last post, which looked at the initial sketching and wireframe. This post will focus on the completion of each of the filters.</description>
      <content:encoded><![CDATA[<p>Continuing from the last post, which looked at the initial sketching and wireframe. This post will focus on the completion of each of the filters.</p>
<h2>Catch up</h2>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-progress-4.png" alt="" width="720" height="720" style="max-width: 100%; height: auto;" />
</div>

<p>This is where the post was left previously.</p>
<h3>File download</h3>
<p>There were two file downloads relating to the previous post.</p>
<ul>
<li><a href="https://www.dropbox.com/s/21r4djfbak0mj27/shop-filter-icons.ai?dl=0">Icons</a></li>
<li><a href="https://www.dropbox.com/s/21r4djfbak0mj27/shop-filter-icons.ai?dl=0">Illustrator file to catch up</a></li>
<li><a href="https://www.dropbox.com/s/vxpksfg4jbuvooh/shop-filter-02.ai?dl=0">Illustrator file to skip ahead</a></li>
</ul>
<h2>Sketch recap</h2>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-sketch-overview.jpg" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>The sketches for each of the filters are what will be referred to as a basis for this.</p>
<h2>Add an overlay</h2>
<p>Draw a rectangle by pressing <kbd>m</kbd> that’s 320x524px. Fill with a very dark grey colour, and change the opacity to around 60%.</p>
<p>Position that to the top of the artboard, so the filters are not obscured.</p>
<h2>Add additional rectangle</h2>
<p>On top of that draw another rectangle that is 320x236px. Positioning this time flush with the top of the filters so they are not obscured.</p>
<h2>Add an obvious way to close</h2>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-2-progress-1.png" alt="" width="738" height="632" style="max-width: 100%; height: auto;" />
</div>

<p>From the icons grab the small close icon. Paste it in the document and add a text layer with the word alongside. Using the content in the background as a guide, position it to the left and above the filters.</p>
<h2>Paste across all artboards</h2>
<p>Now that all the additional common elements are complete, select the additional elements. Press <kbd>⌫</kbd> backspace to delete, then press <kbd>cmd + shift + alt + v</kbd> (yep).</p>
<h2>Type</h2>
<p>The first step for the type section is to use split into grid to help make alignment easier.</p>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-2-type-grid.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>2 columns and 4 rows are added <strong>with the row total being increased to 272px</strong>. The reason it’s increased is to allow for affordance. It will overlap the filters, this is handy for now.</p>
<h3>Add types</h3>
<p>Type out 8 types of clothing, using a 16px font size. This will allow good space for items spanning two lines. Make sure that the text is centrally aligned too.</p>
<p><strong>Here’s a list of types to grab</strong>:</p>
<ul>
<li>Jeans</li>
<li>Tshirt</li>
<li>Coats</li>
<li>Shirts</li>
<li>Knitwear</li>
<li>Loungewear</li>
<li>Suits and blazers</li>
<li>Accessories</li>
</ul>
<h3>Align types</h3>
<p>Select a type, then click a rectangle to align it to. Click the rectangle again to use that as the basis to align to.</p>
<figure>
<img src="/images/blog/shop-tabbar-2-align-panel.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" /><figcaption>I have wrote a quick tip on <a href="/blog/illustrator-quick-tip-align-to-key-object">aligning to key object in Illustrator</a>, if you need extra help.</figcaption>
</figure>

<p>In the Align panel, horizontally and vertically align it.</p>
<h3>Select types and move backwards</h3>
<p>All the things that you have made now, select and group with <kbd>cmd + g</kbd>.</p>
<p>Finally select the filters below the types and move them forwards with <kbd>cmd + ]</kbd>.</p>
<h2>Brand</h2>
<p>Brand is similar to types, so delete the white background layer and copy the grouped types. Use <kbd>cmd + f</kbd> to paste in front. Again being at the front now means easier selection.</p>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-2-progress-3.png" alt="" width="738" height="630" style="max-width: 100%; height: auto;" />
</div>

<p>Rename, and then you should be able to select the filters at the back and move forwards with <kbd>cmd + ]</kbd>.</p>
<h2>Size</h2>
<p>Size is interesting, there are lots and it takes time to find  yours. It’s difficult to identify whether they relate to the type or not. Categorising headings should help this for those who choose to review by size first.</p>
<h3>Defining sizes</h3>
<p>First you want to draw a rectangle that is 272x44px. Align it to the horizontal centre of the artboard, positioning isn’t too important vertically right now.</p>
<p>With the rectangle still selected go to Object &gt; Path &gt; Split into Grid.</p>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-2-small-grid.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Adding 4 columns with an 8px gutter gives you a nice selection and reasonably flexible area to work with.</p>
<h3>Add a border, fill and duplicate</h3>
<p>Fill them with white and a grey border, to define their bounds.</p>
<ul>
<li>Add a type layer <kbd>t</kbd></li>
<li>Type out the first size ’S’</li>
<li>Press <kbd>cmd + enter</kbd></li>
<li>Eyedrop <kbd>i</kbd> the brand style</li>
<li>Duplicate the ’S’ layer to add additional sizes</li>
</ul>
<h3>Repeat this for chest and shoe</h3>
<p>Chest generally follows an inches measurement generally starting from 34 and going up incrementally in 2s. Shoe size, stick with the UK/US style, 6, 7, 8 etc.</p>
<ul>
<li>Copy</li>
<li>Paste in place <kbd>cmd + f</kbd></li>
<li>Nudge down to give plenty of space</li>
<li>Modify type layers</li>
</ul>
<figure>
<img src="/images/blog/shop-tabbar-2-progress-4.png" alt="" width="738" height="630" style="max-width: 100%; height: auto;" />
<figcaption>Things are a little rough on alignment, but this will be solved in the coming steps.</figcaption>
</figure>

<p>This has led to a very limited amount of sizes, <em>that’s fine</em>. You can see there is good room for sizes like XS, XL and more.</p>
<h3>Add categorised titles</h3>
<p>Type each title with a 12px font size, this is sufficient to break them up but not outweigh the selection.</p>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-2-progress-5.png" alt="" width="738" height="630" style="max-width: 100%; height: auto;" />
</div>

<p>Next will be to improve the alignment further.</p>
<h3>Better alignment</h3>
<p>Building upon the alignment that’s already been done, <strong>open the transform panel under Window &gt; Transform</strong>.</p>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-2-transform-example.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<ul>
<li>Select the ‘waist’ title and change Y to 312px</li>
<li>Select waist sizes and change Y to 338px</li>
<li>Select the ‘chest’ title and change Y to 402px</li>
<li>Select chest sizes and change Y to 424px</li>
<li>Select the ‘shoe’ title and change Y to 494px</li>
<li>Select shoe sizes and change Y to 516px</li>
</ul>
<p>Adjust the navigation placement with <kbd>cmd + [</kbd> or <kbd>cmd + ]</kbd> to bring forwards or backwards as necessary.</p>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-2-progress-6.png" alt="" width="738" height="630" style="max-width: 100%; height: auto;" />
</div>

<p>After all that alignment, you should have something similar to this.</p>
<h2>Price</h2>
<p>A range slider tends to be most convenient for choosing price. It’s the most flexible for users to get a somewhat accurate range.</p>
<h3>Add a rectangle</h3>
<p>Click and hold the rectangle to get the pop out menu. Add a rounded rectangle that is 272x12px, with a 6px radius.</p>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-2-align-panel.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>With the rectangle added, align it centrally to the white rectangle.</p>
<h3>Add a circle</h3>
<p>You need two circles for handles. Add a 24px circle by pressing <kbd>L</kbd>. Give it a white fill and grey border for now.</p>
<p>Duplicate this circle by copying and pasting in place <kbd>cmd + f</kbd>.</p>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-2-progress-7.png" alt="" width="738" height="630" style="max-width: 100%; height: auto;" />
</div>

<p>Align both circles centrally with the rounded rectangle, and one at either side.</p>
<h3>Add text to show range</h3>
<p>As the price will go from one to another. Adding a text layer that has ‘£10 to £120’ will indicate this.</p>
<p>Using the eyedropper tool to pick the type style from sizes earlier will help to keep a consistent style.</p>
<h3>Align range text</h3>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-2-progress-8.png" alt="" width="738" height="630" style="max-width: 100%; height: auto;" />
</div>

<p>Using the align panel to align it centrally, then nudge it up until it sits below the range slider. Not too close though.</p>
<h2>Colour</h2>
<p>Colour shares some similarity with size in terms of the shape size.</p>
<h3>Copy size rectangles</h3>
<p>Copy 4 of the rectangles from sizes, and place them over the final artboard. Using the transform panel, place the Y coordinate of all rectangles to 312px.</p>
<h3>Add titles below</h3>
<p>Copying ‘waist’, which is one of the size type headings for the basis.</p>
<ul>
<li>Duplicate it 4 times</li>
<li>Align each to the left of the rectangle</li>
<li>Then duplicate those 3 more times</li>
<li>Align nicely</li>
</ul>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-2-progress-9.png" alt="" width="738" height="630" style="max-width: 100%; height: auto;" />
</div>

<h2>A word on whitespace</h2>
<p>Much of this post has been based around alignment and whitespace. Generally it’s a tricky subject what the correct amount of whitespace is. It comes down to several points:</p>
<ul>
<li>Vertical rhythm or grid</li>
<li>What feels right based on that vertical rhythm</li>
<li>The space available</li>
<li>Tap/click targets</li>
<li>Importance of the element</li>
<li>Visual hierarchy</li>
<li>Readability/legibility</li>
</ul>
<h2>Completed wireframe download</h2>
<p>Feel free to download <a href="https://www.dropbox.com/s/vxpksfg4jbuvooh/shop-filter-02.ai?dl=0">the completed file</a>.</p>
<h2>That’s it for this part</h2>
<p>So now all the filters have been made in wireframe form, you know the layout is pretty accurate now. You can also see how helpful symbols can be for repetition.</p>
<p>There are other areas that symbols could be used certainly, particularly the close button.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Shop filter series: sketching &amp; starting wireframes</title>
      <link>https://iamsteve.me/blog/shop-filter-series-sketching-starting-wireframes</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/shop-filter-series-sketching-starting-wireframes</guid>
      <pubDate>Tue, 13 Sep 2016 06:24:00 GMT</pubDate>
      <description>Exploring a tab bar approach to shop filtering on small screens. Most filter UIs fall short on mobile — this post starts the series with sketches and wireframes.</description>
      <content:encoded><![CDATA[<p>Filtering is a huge part of online shops, it’s an effective form of navigation. In most cases it’s an area which is overlooked on small screens. I have seen some good implementations and many lack the ease of a larger screen. In this post series I want to explore the idea of it being a tab bar, starting with sketching &amp; wireframes.</p>
<h2>Introduction</h2>
<p>This post will be using Adobe Illustrator, but it could equally be done in others. You need to consider the most common options a user will need to filter by, but importantly the options to filter within them and presenting them.</p>
<p>This is the first part of this post, you’ll follow the design process, from sketch to wireframe, then onto visual design.</p>
<h2>Skip ahead</h2>
<p>Feel free to skip this entirely, if you would like to <a href="https://www.dropbox.com/s/2jphcoulgviqtox/shop-filter-01.ai?dl=0">download the files and take a look</a>.</p>
<h2>Download icons to follow along</h2>
<p>I’ve made a set of icons for this post. If you’d like to follow along <a href="https://www.dropbox.com/s/21r4djfbak0mj27/shop-filter-icons.ai?dl=0">you can download the icons</a>. Alternatively you can make your own or use a different icon set.</p>
<h3>Designing for a clothing company</h3>
<p>You&#39;re designing a website for a clothing company and at the stage of designing the small screen version of the shop page. The page where all products are listed, you have a few options to filter down the products.</p>
<p><strong>Type, size, brand, price and colour are filters which will allow you to refine your results best</strong>. A convenient way to clear filters needs to be considered also.</p>
<h2>Sketching</h2>
<p>With those types in mind and it being a ‘tab bar’ you’ll need to sketch several screens. Icons will be needed to provide a representation of what the filter is, you’ll pair this with text underneath the icon for clarity.</p>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-sketch-overview.jpg" alt="" width="960" height="864" style="max-width: 100%; height: auto;" />
</div>

<h3>Sketching icons</h3>
<p>The idea with sketching icons is to think of the best representation for that word, which is also the most simplest. Sketch as many ideas as you need to, get all the poor ideas out and see what happens.</p>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-sketch-focus-icons.jpg" alt="" width="960" height="576" style="max-width: 100%; height: auto;" />
</div>

<p>Each icon is based upon a 24x24px square. As their creation is somewhat out of the scope of this post, <a href="https://www.dropbox.com/s/21r4djfbak0mj27/shop-filter-icons.ai?dl=0">you can download ones I’ve made</a>.</p>
<h3>Sketching layouts</h3>
<p>A basic layout to get an idea of what you’re working with. Then going on to sketching each of the potential layouts for the filters and the icons they will need. Some will be trickier than others, such as size, as it’s different for different types of clothing.</p>
<p>For each filter I have selected a layout which occupies space well. Price and colour require different considerations to make them most effective. While size, type and brand will generally retain more list like appearance.</p>
<h2>Wireframing</h2>
<p>You’re going to start the process by wireframing everything. This will allow you to focus better on layout, then build up the visual style later.</p>
<h2>Start a new document</h2>
<p>First you need to get the basics in place. You need a document with 5 artboards sized 320x568, based upon the smaller iPhone.</p>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-new-document.png" alt="" width="640" height="528" style="max-width: 100%; height: auto;" />
</div>

<h3>Add a background layer</h3>
<p>Add a new rectangle by pressing <kbd>m</kbd>. Click the artboard and add the dimensions 320x568, so it fills the artboard and add  the fill colour <code>#f2f2f0</code>.</p>
<h3>Make a small grid</h3>
<p>Add a new layer in the layers panel and name it ‘grid’. Copy the background layer, and click the grid layer, so it’s selected. Then press <kbd><kbd>cmd</kbd> + <kbd>f</kbd></kbd>, this will paste it in place.</p>
<h3>Reduce the size</h3>
<p>With the layer still selected, open the transform panel, which can be found in the menu Window &gt; Transform.</p>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-grid-transform.png" alt="" width="640" height="420" style="max-width: 100%; height: auto;" />
</div>

<p>With a central reference point and constrain proportions unchecked, subtract 48px from the width. The layer should remain selected and be central</p>
<h3>Grid settings</h3>
<p>With the layer still selected, in the menu bar go to Object &gt; Path &gt; Split into Grid.</p>
<figure>
<img src="/images/blog/shop-tabbar-grid-settings.png" alt="" width="640" height="420" style="max-width: 100%; height: auto;" />
<figcaption>Add two columns with a 12px gutter.</figcaption>
</figure>

<p>Once you have added those settings, click ok. <strong>Copy those layers, then click the artboard next to it and paste in place</strong> <kbd><kbd>cmd</kbd> + <kbd>f</kbd></kbd>.</p>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-paste-in-artboards.gif" alt="" width="748" height="408" style="max-width: 100%; height: auto;" />
</div>

<p>Repeat this process for the other artboards. <strong>Then select all the  grid columns in each artboard and press</strong> <kbd><kbd>cmd</kbd> + <kbd>5</kbd></kbd>.</p>
<h3>Add rectangles for header and filters</h3>
<p>Add another two rectangles with the dimensions 320x44, fill them white. Align one to the top and one to bottom of the artboard.</p>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-progress-1.png" alt="" width="896" height="420" style="max-width: 100%; height: auto;" />
</div>

<h2>Header</h2>
<p>The wireframe is now coming together. Using the <a href="https://www.dropbox.com/s/21r4djfbak0mj27/shop-filter-icons.ai?dl=0">icons mentioned earlier</a>, copy the search and menu icons and paste them into the main document.</p>
<h3>Add icons</h3>
<p>Select the search icon and drag it to the left side of your guides, and repeat this for the menu icon, except to the right.</p>
<h3>Add a logo</h3>
<p>Next add a logo, which needs to be aligned to the horizontal centre of the header.</p>
<h3>Align the icons and logo</h3>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-align-panel.png" alt="" width="640" height="420" style="max-width: 100%; height: auto;" />
</div>

<p>Select the header background, the icons and the logo. Then click the header background again, to <a href="">align to a key object</a>. Next, go to Window &gt; Align to open the align panel.</p>
<figure><img src="/images/blog/shop-tabbar-progress-2.png" alt="" width="640" height="640" style="max-width: 100%; height: auto;" /><figcaption>You should have something which looks similar to this.</figcaption></figure>

<h2>Add content</h2>
<p>Towards the top, make two text layers. One with ‘Shop’ and the other ‘Browsing 84 styles’. With this the filter has an additional indication to show the page has updated.</p>
<p>I have made the title have an 18px font size. The styles counter is has a font size of 12px.</p>
<h3>Add products</h3>
<p>Now to add content in the way of products. Using a rectangle as a placeholder image, adding a title and price to make up a product.</p>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-progress-3.png" alt="" width="640" height="640" style="max-width: 100%; height: auto;" />
</div>

<p>Adding a 130x160 rectangle <kbd>m</kbd> and below a product title and price. Both the title and price have a 12px font size, with the title being bold.</p>
<p>Select those 3 items and group them together with <kbd><kbd>cmd</kbd> + <kbd>g</kbd></kbd>. Then copy, paste and align an additional three. Taking care to align them within the grid columns and have a consistent space above and below them.</p>
<h3>Making a symbol</h3>
<p>At this stage you’ve made the bulk of the reusable layout. Making it into a symbol is a good way to go. Open the symbols panel by going to Window &gt; Symbols.</p>
<p>Then you need to select all the elements except the bottom rectangle for filters. In the Symbols panel you should see the ‘New Symbol’ icon become active.</p>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-symbol-content.png" alt="" width="640" height="444" style="max-width: 100%; height: auto;" />
</div>

<p>Click the ‘New Symbol’ icon and enter a name. No other options here are really important.</p>
<p>After clicking ok, this will move everything to the top, move it to the back with <kbd><kbd>cmd</kbd> + <kbd>[</kbd></kbd>.</p>
<h2>Tab bar</h2>
<p>Now that the content is completed you can move on to the navigation.</p>
<h3>Split the rectangle into 5</h3>
<p>Select the bottom rectangle, then in the menu go to Object &gt; Path &gt; Split into Grid.</p>
<figure>
<img src="/images/blog/shop-tabbar-split-navigation.png" alt="" width="640" height="420" style="max-width: 100%; height: auto;" />
<figcaption>Split the rectangle into 5 columns, this now gives a good basis for aligning text and icons.</figcaption>
</figure>

<h3>Icons</h3>
<p>As mentioned earlier in the post I’ve made a set of icons for you to download. Or of course you can use your own.</p>
<p>Place the first 5 icons (including text) into the document nearby the rectangle. It’s not too important where, the alignment process doesn&#39;t depend on it.</p>
<h3>Aligning icons</h3>
<p>Making sure each icon and the text are grouped together <kbd><kbd>cmd</kbd> + <kbd>g</kbd></kbd>.</p>
<p>Select one rectangle and the grouped text and icon. Then click the rectangle again so that the border is thicker, <a href="">aligning to the rectangle as the key object</a>.</p>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-align-panel.png" alt="" width="640" height="420" style="max-width: 100%; height: auto;" />
</div>

<p>From earlier you should have the align panel open, if not go to Window &gt; Align. Now vertically and horizontally align the icons.</p>
<p>Then taking care to make sure all the text aligns evenly.</p>
<h3>Make it into a symbol</h3>
<p>The final step for this part of the tutorial is to make it into a symbol. Making sure it’s dynamic, this will be particularly useful in the next post.</p>
<h2>A good point to leave it</h2>
<div className="article-image">
  <img src="/images/blog/shop-tabbar-progress-4.png" alt="" width="640" height="640" style="max-width: 100%; height: auto;" />
</div>

<p>This is a good point to leave the post, the layout is essentially complete in terms of positioning. In the next post the individual filters will be made.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Pixel perfect templates in Illustrator</title>
      <link>https://iamsteve.me/blog/pixel-perfect-templates-in-illustrator</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/pixel-perfect-templates-in-illustrator</guid>
      <pubDate>Tue, 06 Sep 2016 06:30:00 GMT</pubDate>
      <description>How to set up Illustrator to stay pixel perfect. Using snap to grid and saving a template means you won’t accidentally export on half pixels for logos and icons.</description>
      <content:encoded><![CDATA[<p>Illustrator being a vector application means it can be easy to overlook the export process and making things pixel perfect. It’s easy to do, so you don’t notice it. It’s particularly important that you try to retain this for logos and icons.</p>
<h2>Why is it important?</h2>
<p>The importance comes down to the export process for assets that require crisp edges. If icons and logos aren’t pixel fitted, it can make them look poorer.</p>
<p><strong>Good logos and icons will already account for this. Sometimes. unintentionally you can knock things slightly out of alignment in Illustrator</strong>. Due to the vector nature of the application. You’re not as aware of things looking off.</p>
<h2>It starts with the right document setup</h2>
<p>However, once you have the document setup correctly in illustrator it&#39;s generally set and forget. It will also help you achieve a more consistently spaced design.</p>
<h3>Firstly, decide upon a grid</h3>
<p>This isn’t a traditional columned grid, it’s the overlay that is built into Illustrator.</p>
<div className="article-image">
  <img src="/images/blog/illustrator-pixel-perfect-gridlines.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Go to Illustrator &gt; Preferences &gt; Guides &amp; Grid. From here set a gridline as a multiple of 16, with the subdivisions to equal a whole number too.</p>
<h3>Why multiples of 16?</h3>
<p>Icons and screen resolutions typically scale up from values that are multiples of 16. 16, 32, 64, 128 for icons. 1024, 1280, 1680, 1920 for screen resolutions. <strong>I recommend you follow this</strong>.</p>
<p>Aside from this you can depend on the number to always be whole when divided by 2.</p>
<figure>
<img src="/images/blog/illustrator-pixel-perfect-guides-options.png" alt="" width="738" height="624" style="max-width: 100%; height: auto;" />
<figcaption>In this case you will have 4px squares. Change as necessary to get finer control.</figcaption>
</figure>

<blockquote>
<p>Generally people will default to multiples of 10. I would strongly advise against this, you can quickly end up with a number that isn’t whole. With a 16px grid you can divide by 2 until you’re at 1px.</p>
</blockquote>
<h3>Make a new document</h3>
<p>You can make any document size, as long as it falls within your gridline choice. In this instance it’s 16. If your document size follows screen resolution patterns, they will fall within the 16px grid.</p>
<div className="article-image">
  <img src="/images/blog/illustrator-pixel-perfect-new-document.png" alt="" width="738" height="624" style="max-width: 100%; height: auto;" />
</div>

<p>After adding your dimensions, click advanced and check ‘Align New Objects to Pixel Grid’.</p>
<p>This can be the reason you will have trouble doing this with an existing document. It’s for new objects.</p>
<h2>Enable snap to grid</h2>
<p>The next step and possibly most crucial is to enable snap to grid. You can find in the menu View &gt; Snap to Grid or the keyboard shortcut <kbd><kbd>cmd</kbd> + <kbd>shift</kbd> + <kbd>'</kbd></kbd> (single quote).</p>
<p>This will make aligning things much easier.</p>
<h2>Toggling the grid</h2>
<p>To toggle the grid you can do this with <kbd><kbd>cmd</kbd> + <kbd>'</kbd></kbd> (single quote).</p>
<h2>Things to be aware of</h2>
<p>With the accuracy you introduce within the document sometimes pasting items in that are not already a whole pixel will be troublesome to align. You will have to resize the object and align drag into place again.</p>
<p>You’ll likely be aware of ‘Snap to Point’ or come across it, I don’t recommend enabling this, as it’s very unpredictable. If you need to move things by the pixel change the grid settings.</p>
<h2>That&#39;s it</h2>
<p>If you’re a long time user of both Illustrator and Photoshop, but tend to use one more for designing websites, you’ll probably share similar frustrations to what I have. They’re both great, but they both miss things from each other, that would make life much easier.</p>
<p>From here you can set up a <a href="/blog/illustrator-quick-tip-grid-guides">regular grid using guides</a> and then save as a template for future documents.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>About version six</title>
      <link>https://iamsteve.me/blog/about-version-six</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/about-version-six</guid>
      <pubDate>Tue, 30 Aug 2016 06:30:00 GMT</pubDate>
      <description>I’ve finally done the redesign of this website! Version five lived for longer than I ever intended. This post is going to be a shorter summary of the changes. I’ll be posting a full case study over the coming weeks.</description>
      <content:encoded><![CDATA[<p>I’ve finally done the redesign of this website! Version five lived for longer than I ever intended. This post is going to be a shorter summary of the changes. I’ll be posting a full case study over the coming weeks.</p>
<h2>So what’s new?</h2>
<p>Aside from the visual changes, the focus is on the blog. This site will only serve as a blog for the foreseeable future. There was a portfolio, but this will be separate. It allows for quicker redesigns and not having to think about how it aligns with the rest of the site.</p>
<h2>Header</h2>
<p>The most important change to the header is the addition of search. There was search on the old version, just at the bottom. It wasn’t as helpful in the past due to the lack of content. Giving it more availability may increase searching.</p>
<h2>Homepage</h2>
<p>The homepage is the area I want to draw more people to. Previously it has been a single post, with the about section and dribbble, then moving into a list.</p>
<p>The aim has been to make content more discoverable and encourage browsing. From the introduction and latest post, through to the popular posts by category. Over time I want to evolve this further.</p>
<div className="article-image">
  <img src="/images/blog/about-v6-home.png" alt="A screenshot of the homepage of this website." width="738" height="1618" style="max-width: 100%; height: auto;" />
</div>

<h3>Illustration</h3>
<p>I’ve gone with a couple of illustrations of my dogs to serve as mascots throughout the homepage. They add to the friendliness I want to bring to the website. They were a big challenge, as I’m not a fantastic illustrator… yet.</p>
<p>This is something I hope to bring out more in the future as I iterate on this design.</p>
<h2>Newsletter</h2>
<p>I have started a newsletter, it’s in the aim of growing and retaining an audience. I’ll notify you when posts go out, this will be once a week.</p>
<p>I have plans for subscribers, and it’s where most of my efforts will go now the redesign is done.</p>
<p><a href="/newsletter">You should consider subscribing</a>.</p>
<h2>Posts</h2>
<p>Posts don’t have a dramatic overhaul in layout. However, I made some observations, that would make for a better reading experience.</p>
<ul>
<li>Ability to have more flexibly sized images within posts</li>
<li>Improve font sizing</li>
<li>Better readability</li>
<li>Improve the related post(s)</li>
</ul>
<p>I&#39;m happy with the improvements. I don&#39;t want to do anything to cause annoyance within them. You&#39;re here for the post.</p>
<h2>A better small screen experience</h2>
<p>Not very many people browse this website on their phones, 92% is considered desktop. Just over 1% of the remaining 8% is tablets and nearly 7% is phones.</p>
<p>Again, the reading experience is something I’m particularly happy with. I believe it’s a huge improvement. As well as just browsing through pages of posts and homepage both flow nicely.</p>
<div className="article-image">
  <img src="/images/blog/about-v6-small-screen.png" alt="Two screenshots of this website in Mobile Safari" width="896" height="736" style="max-width: 100%; height: auto;" />
</div>

<p>I’m pleased with the way the header area works, from showing the navigation to switching to the search. Although <a href="/blog/websites-using-alternatives-to-the-hamburger">I’m considering moving to a bottom navigation</a>.</p>
<h2>Going forward</h2>
<p>The priority going forward will be to add incentive to sign up to the newsletter. Everybody wants you to subscribe to their newsletter. Why would somebody subscribe to mine?</p>
<p>Having people subscribe to your newsletter is highly valuable. I wanted something in place before this redesign went live, but I decided not to wait. The about and contact pages, will follow the newsletter improvements.</p>
<p>I have a few things design wise I want to improve too. The doubt over the past couple of weeks, was what pushed me to get it live. This tweet by Jason Fried was timely.</p>
<blockquote className="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Danger of not shipping as soon as you can - second guessing creeps in. The longer you wait, the more doubt you cultivate…</p>&mdash; Jason Fried (@jasonfried) <a href="https://twitter.com/jasonfried/status/768088758457511936">August 23, 2016</a></blockquote>

<p>It’s something to always keep in mind. As I want to improve the homepage further.</p>
<h2>Bugs</h2>
<p>I&#39;m fairly sure there&#39;s going to be some bugs. As I&#39;ve been preparing this post, I&#39;ve been fixing and tweaking things. I’ve done my best to cover all angles. If you see anything major I would appreciate the heads up.</p>
<h2>That’s it</h2>
<p>Thank you for spending time on this website and reading the content I produce.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>How to evenly space objects in Illustrator</title>
      <link>https://iamsteve.me/blog/illustrator-quick-tip-equally-space-objects</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/illustrator-quick-tip-equally-space-objects</guid>
      <pubDate>Tue, 23 Aug 2016 06:30:00 GMT</pubDate>
      <description>‘How to distribute objects with equal spacing in Illustrator using align to key object. A quick tip that saves spacing things out one by one.’</description>
      <content:encoded><![CDATA[<p>It’s likely you know how to align things in Illustrator, but you can never remember how to distribute space between things equally, so you resort to the tedious way of spacing them individually. If you want to align objects with an equal space between them, this quick tip will show you how.</p>
<h2>Highlight your objects</h2>
<p>You have a set of unequally sized objects. Such as navigation items. Select them all.</p>
<div className="article-image flex center">
  <img src="/images/blog/space-equally-selected.png" alt="" width="640" height="420" style="max-width: 100%; height: auto;" />
</div>

<h2>Click any item without holding shift</h2>
<div className="article-image flex center">
  <img src="/images/blog/space-equally-key-highlight.png" alt="" width="640" height="420" style="max-width: 100%; height: auto;" />
</div>

<p>It doesn’t matter much which item as the items are having space put between them. After clicking, you should see that item highlight in a bolder blue. This chooses a <a href="/blog/illustrator-quick-tip-align-to-key-object">key object</a> and activates more align options.</p>
<div className="article-image flex center">
  <img src="/images/blog/space-equally-align-panel-distribute.png" alt="" width="640" height="420" style="max-width: 100%; height: auto;" />
</div>

<h2>Choose how to distribute the space</h2>
<p>You can distribute the space horizontally or vertically, and with any amount of spacing you like. Once you have entered a value to space the items by click the relevant way to distribute space.</p>
<div className="article-image flex center">
  <img src="/images/blog/align-objects-equally.gif" alt="" width="640" height="420" style="max-width: 100%; height: auto;" />
</div>

<h2>That’s it</h2>
<p>The beauty of this method is you can specify how many pixels you want between your items. Once it becomes second nature to do, you’ll find this method to be the quickest. It&#39;s such a common part of every day design, that the time savings will certainly add up!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Websites using alternatives to the ‘hamburger’</title>
      <link>https://iamsteve.me/blog/websites-using-alternatives-to-the-hamburger</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/websites-using-alternatives-to-the-hamburger</guid>
      <pubDate>Tue, 16 Aug 2016 06:30:00 GMT</pubDate>
      <description>A collection of websites using tab bar-style navigation as an alternative to the hamburger. Engagement improves when apps move away from hidden navigation.</description>
      <content:encoded><![CDATA[<p>It’s been proven as apps have shifted away from the ‘hamburger’ navigation, to a bottom bar, engagement and browsing metrics have increased. Over time these findings have an impact on the thought process of those designing websites. So I wanted to explore as an alternative for websites tab bar style navigation. I’ve detailed a list of websites that are using the tab bar navigation.</p>
<h2>Why the change?</h2>
<p>Usability research posts have found it improves engagement and exploration of a website. Which is something most people want to improve[^1]. In apps there is more freedom for implementation, as has long been part of iOS and as more recently Android.</p>
<p>However, it still remains elusive for websites, in the sense of the behaviour and experience in apps. For example, usability could be better on iOS and the potential clash with other UI elements, can make it difficult to use.</p>
<p>As phones have got larger and Google has started recommending it for Android, is the usability issue something to reconsider on websites and is it now a balance of trade offs? I’ve found several websites that haven’t been afraid to question this.</p>
<h2>ysdn2016.com</h2>
<div className="article-image">
  <a href="http://ysdn2016.com/">
    <img src="/images/blog/bottom-nav-ysdn.png" alt="" width="960" height="832" style="max-width: 100%; height: auto;" />
  </a>
</div>

<p>I like how this combines the navigation with the event details. You can scroll through the page and access that at any point as well as other areas of the website.</p>
<p>It hides on scroll, so it forces you to scroll up a bit at least to bring it back. This can get around the ‘double tap’ and gives you the ease of reaching the navigation.</p>
<h2>pitchfork.com</h2>
<div className="article-image">
  <a href="http://pitchfork.com/">
    <img src="/images/blog/bottom-nav-pitchfork.jpg" alt="" width="960" height="832" style="max-width: 100%; height: auto;" />
  </a>
</div>

<p>The Pitchfork website is probably one of the websites where I first realised ‘is it coming back into fashion?’ What I like about this navigation is it gives access to other features within the website, as well as the main navigation. It’s the potential to keep key features within reach at all times.</p>
<p>It also affords them the freedom to have a larger logo—not that I believe you need to do that—which means you don’t have to overwhelm that initial space.</p>
<h2>studiothick.com</h2>
<div className="article-image">
  <a href="http://www.studiothick.com/">
    <img src="/images/blog/bottom-nav-studiothick.jpg" alt="" width="960" height="832" style="max-width: 100%; height: auto;" />
  </a>
</div>

<p>This is a repositioning of essentially what would be a ‘hamburger’ menu without the icon, it’s clear and visible, without being distracting. It is in the region to avoid the double tap and nicely allows you to jump to the top of the page too.</p>
<h2>davidhellmann.com</h2>
<div className="article-image">
  <a href="https://davidhellmann.com">
    <img src="/images/blog/bottom-nav-david.png" alt="" width="960" height="832" style="max-width: 100%; height: auto;" />
  </a>
</div>

<p>The navigation would feel at home on iOS as much as it does apart of the website. So it’s easy to use and the way search can be utilised is a nice touch.</p>
<h2>joycewang.com</h2>
<div className="article-image">
  <a href="http://joycewang.com">
    <img src="/images/blog/bottom-nav-wang.jpg" alt="" width="960" height="832" style="max-width: 100%; height: auto;" />
  </a>
</div>

<p>Like the Studio Thick navigation, this uses an icon in the lower right avoiding the double tap in most instances. It works well and the style of this is interesting.</p>
<h2>roscoproduction.com</h2>
<div className="article-image">
  <a href="http://roscoproduction.com">
    <img src="/images/blog/bottom-nav-rosco.jpg" alt="" width="960" height="832" style="max-width: 100%; height: auto;" />
  </a>
</div>

<p>This is more of an obscure navigation, but it’s usable with one hand to give you access to the portfolio. I like the ease of use it offers generally, but I would have liked the logo pinned to the bottom to link to the homepage.</p>
<h2>whitehallinteriorsnyc.com</h2>
<div className="article-image">
  <a href="http://www.whitehallinteriorsnyc.com">
    <img src="/images/blog/bottom-nav-whitehall.jpg" alt="" width="960" height="832" style="max-width: 100%; height: auto;" />
  </a>
</div>

<p>A discrete navigation initially, which hides on scroll down and it reappears when you scroll up. It could equally have been fixed to the top, but it wasn’t.</p>
<h2>eventbrite.com</h2>
<div className="article-image">
  <a href="https://www.eventbrite.com">
    <img src="/images/blog/bottom-nav-eventbrite.jpg" alt="" width="960" height="832" style="max-width: 100%; height: auto;" />
  </a>
</div>

<p>This is an interesting one and a really good use of the space, the button to checkout is simply very easy to reach. As part of researching this post, I found that eventbrite uses a technique to ensure the browser chrome is always visible. This means they avoid the need for double tapping.</p>
<p>For an ecommerce experience this seems like a no brainer, make the checkout steps easy to reach and you’ll frustrate buyers less.</p>
<h2>Basecamp</h2>
<div className="article-image">
  <a href="https://basecamp.com">
    <img src="/images/blog/bottom-nav-basecamp.jpg" alt="" width="960" height="832" style="max-width: 100%; height: auto;" />
  </a>
</div>

<p>Basecamp have gone with their main call to action fixed to the bottom on scroll. This means it&#39;s always present whilst you&#39;re browsing. No need for repetition. Just one clear button.</p>
<p>I&#39;m sure this will emerge as a trend for pages of this type.</p>
<h2>Quartz</h2>
<div className="article-image">
  <a href="http://qz.com">
    <img src="/images/blog/bottom-nav-quartz.jpg" alt="" width="960" height="832" style="max-width: 100%; height: auto;" />
  </a>
</div>

<p>Quartz have an array of navigation and their bottom bar serves as a kind of filtering of their stories.</p>
<h2>Summary</h2>
<p>Many of the examples work very well, because of the ease that they can be reached. Some examples can bypass the double tap, due to their positioning, but others require it. I’ve found that while it is an inconvenience, it’s less so over trying to reach the top of the phone one handed.</p>
<p>This is definitely more of a reemerging trend, as I remember seeing other websites with it and trialling a bottom navigation in version three of this website. I removed it due to thinking there was potential for tapping the wrong parts of the browser UI. I believe that’s why it hasn’t been used more until now.</p>
<p>[^1]: <a href="http://www.lukew.com/ff/entry.asp?1945">Obvious Always Wins</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Maintenance week #4</title>
      <link>https://iamsteve.me/blog/maintenance-week-4</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/maintenance-week-4</guid>
      <pubDate>Tue, 09 Aug 2016 06:30:00 GMT</pubDate>
      <description>Maintenance week #4 — bug fixes, grammar improvements, and adding featured images to older posts. A rundown of what was done instead of a regular post.</description>
      <content:encoded><![CDATA[<p>Maintenance weeks are where detail website tasks, instead of a regular post. I spend time fixing bugs, updating grammar and posts in general, as well as adding featured images. It varies what I will do, and this posts serves as detailing what has been done.</p>
<p>So while it’s not a post that directly gives value, it helps me keep on top of the library of content that I am acquiring.</p>
<h2>Illustrator stroke profiles</h2>
<p>This has become a really popular post in recent weeks. It was one I wrote quite early on in this writing weekly thing and on inspecting it again, it’s quite poorly formatted in terms of the images. So I have improved some of them.</p>
<h2>Hero area series: selective refresh bug</h2>
<p>I spotted a bug within the template files — a simple, but crucial one really — to do with the refreshing background colour. It had stopped working, for whatever reason. I needed to  add <code>echo</code> to a function to make sure the style output. Strange, but annoying.</p>
<h2>Progress</h2>
<p>I spent the majority of this week sifting through posts and styling the various elements I use throughout. How they adapt with the screen and such.</p>
<p>I’m happy with the homepage, but I’m considering a rework of that as the current layout doesn’t adapt too well in the mid size range of screens, but I know I can do better. It’s just trying to think of a better solution.</p>
<h2>Preparations for the redesign</h2>
<p>I’m hoping to launch the redesign first week of September, which is a good time for me due to having a week off work. This means I’ve begun focusing my efforts much more on the redesign, <a href="/blog/redesign-progress-update">as I mentioned a few posts back</a>. It’s difficult to balance and progress suffers on both writing and the redesign.</p>
<p>I spent some time designing more featured images and tweaking posts.</p>
<h3>Preparation</h3>
<p>As I’ve been working on the website I’ve been trying to keep the database in sync locally, as I post and update images. As I have a couple of CMS addons that are not currently on this site, it causes an error every time.</p>
<p>I uploaded and enabled the addons here and other things round making sure when I put this live there is as few hiccups. Steps like this that don’t affect anything, just mean one less thing to rush and do.</p>
<h3>Horizontal scrolling responsive menu</h3>
<div className="article-image">
  [<img src="/images/blog/horizontal-scrolling-responsive-featured-image@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />](/blog/horizontal-scrolling-responsive-menu)
</div>

<h3>Custom stroke width profiles in Illustrator</h3>
<p>Along with a couple of images inside that post updated, I have added a featured image too.</p>
<div className="article-image">
  [<img src="/images/blog/illustrator-stroke-width-featured-image@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />](/blog/creating-custom-stroke-width-profiles-in-illustrator)
</div>

<h3>Get up to speed with CSS shapes</h3>
<div className="article-image">
  [<img src="/images/blog/css-shapes-featured-image@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />](/blog/get-up-to-speed-with-css-shapes)
</div>

<h3>A guide to vertical rhythm</h3>
<div className="article-image">
  [<img src="/images/blog/vertical-rhythm-featured-image@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />](/blog/a-guide-to-vertical-rhythm)
</div>

<h3>Photoshop generator syntax cheatsheet</h3>
<div className="article-image">
  [<img src="/images/blog/ps-generator-featured-image@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />](/blog/adobe-generator-syntax-cheatsheet)
</div>]]></content:encoded>
    </item>
    
    <item>
      <title>Stop headroom.js hiding when your navigation is open</title>
      <link>https://iamsteve.me/blog/stop-headroom-hiding-when-your-navigation-is-open</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/stop-headroom-hiding-when-your-navigation-is-open</guid>
      <pubDate>Tue, 02 Aug 2016 06:23:00 GMT</pubDate>
      <description>When using headroom.js, the fixed header can hide even when the navigation is open. This post shows how to prevent that using headroom&apos;s callbacks.</description>
      <content:encoded><![CDATA[<p>Headroom.js is a popular plugin for providing additional functionality in having a fixed header. It has a lot of additional callbacks and options, to make sure you can cover a variety of situations. One of those things is stopping it from hiding when your navigation is open. Which is what this post will cover, as this is something I had to do recently.</p>
<h2>The problem detailed</h2>
<p>You’ve got your header setup and working with headroom.js. Your navigation is revealed by tapping or clicking an icon (be that a hamburger or whatnot). When you scroll the header still hides despite the navigation being visible.</p>
<p>You may even have the navigation cover the whole viewport, but you can still trigger scroll events.</p>
<p>Using CSS only could probably solve this, but that isn’t ideal. As it can quickly become difficult to maintain, if you’re adding an additional state to the navigation.</p>
<h2>The solution</h2>
<p>To solve this you need to stop the navigation hiding, when it’s ‘open’ or ‘visible’.</p>
<h3>You may have this currently</h3>
<p>You will have initialised headroom, it may look similar, or you may have passed some options.</p>
<pre><code class="language-javascript">var header = document.getElementById(&#39;header&#39;);
var headroom = new Headroom(header);
headroom.init();
</code></pre>
<h3>Checking the state</h3>
<p>Firstly, it’s helpful to write a small function to check whether the nav is visible. This will make code more readable amongst the options.</p>
<pre><code class="language-javascript">function isNavVisible(nav) {
  return ( nav.classList.contains(&#39;visible&#39;) ? true : false );
}
</code></pre>
<p>So this function has a single argument, which when you come to use this function, will look something like <code>document.querySelector(&#39;.nav&#39;)</code>. It then returns a value of <code>true</code> or <code>false</code> whether the navigation contains the class <code>visible</code>.</p>
<p>You can change this visible class to be more in line with your naming convention.</p>
<h3>Using the onUnpin callback to disable hiding</h3>
<p>If you have your options set up already, then it will be a matter of taking the <code>onUnpin</code> callback and adding it to your existing options.</p>
<pre><code class="language-javascript">var header = document.getElementById(&#39;header&#39;);
var nav = document.getElementById(&#39;nav&#39;);

var options = {
  onUnpin: function() {
    if ( isNavVisible(nav) ) {
      this.elem.classList.remove(this.classes.unpinned);
      this.elem.classList.add(this.classes.pinned);
    }
    else {
      this.elem.classList.add(this.classes.unpinned);
      this.elem.classList.remove(this.classes.pinned);
    }
  }
};

var headroom = new Headroom(header, options);
headroom.init();
</code></pre>
<p>If you don’t have options, this essentially passes an extra parameter to the <code>headroom</code> variable. Inside the options object, the <code>onUnpin</code> callback uses the function from earlier to remove or add a class name using the <code>classes</code> object built into headroom.</p>
<h3>How the classes are chosen</h3>
<p>Using <code>this</code> gives you access to all the options. Specifically you need to access <code>elem</code> and <code>classes</code>.</p>
<pre><code class="language-javascript">this.elem.classList.remove(this.classes.unpinned);
</code></pre>
<p><code>this.elem</code> refers to the element you pass to headroom, in this case it’s the <code>header</code> variable. You can use this to look at the class list and use that to remove or add a class.</p>
<p>To remove the class that applies the unpinned state, you use <code>this.classes.unpinned</code>.</p>
<h3>You’re free to update class names</h3>
<p>This is useful because you may have an override in place for your own class names. You can also update them without the need to change this code later on.</p>
<h4>Toggling your navigation</h4>
<p>For the sake of completeness and clarity, I’ve included a basic navigation toggle.</p>
<pre><code class="language-javascript">var nav = document.querySelector(&#39;.nav&#39;);
var navToggle = document.querySelector(&#39;.nav-toggle&#39;);

navToggle.addEventListener(&#39;click&#39;, function() {
  nav.classlist.toggle(&#39;visible&#39;);
}, false);
</code></pre>
<p>This will listen for clicks on <code>.nav-toggle</code> and toggle a class on <code>.nav</code>.</p>
<h2>Final code</h2>
<p>To recap you&#39;ve got a function to detect visibility of your nav element. That function is used as part of the onunpin callback, where you add and remove class names based upon the state. The class names are found in the classes object.</p>
<pre><code class="language-javascript">function isNavVisible(nav) {
  return ( nav.classList.contains(&#39;visible&#39;) ? true : false );
}

var header = document.getElementById(&#39;header&#39;);
var nav = document.getElementById(&#39;nav&#39;);

var options = {
  onUnpin: function() {
    if ( isNavVisible(nav) ) {
      this.elem.classList.remove(this.classes.unpinned);
      this.elem.classList.add(this.classes.pinned);
    }
    else {
      this.elem.classList.add(this.classes.unpinned);
      this.elem.classList.remove(this.classes.pinned);
    }
  }
};

var headroom = new Headroom(header, options);
headroom.init();
</code></pre>
]]></content:encoded>
    </item>
    
    <item>
      <title>Designing a pricing table in code</title>
      <link>https://iamsteve.me/blog/designing-a-pricing-table-in-code</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/designing-a-pricing-table-in-code</guid>
      <pubDate>Tue, 26 Jul 2016 06:37:00 GMT</pubDate>
      <description>‘Coding up the pricing table designed in Illustrator. Flexbox handles the layout, keeping focus on matching the design and adding interactive button states.’</description>
      <content:encoded><![CDATA[<p>Following up from <a href="/blog/making-a-pricing-table-in-illustrator">the design in Illustrator post</a>, it’s time to code the design. Using flexbox to do the heavy lifting for the layout, the focus can be on matching the design and improving on it through being able to show the button state.</p>
<h2>Preview</h2>
<p>It may be better to view a larger version on CodePen.</p>
<div style="margin: 2em 0;">
    <iframe
      height="420"
      style="width: 100%;"
      scrolling="no"
      title="Pricing table"
      src="https://codepen.io/stevemckinney/embed/rLJNYV?default-tab=result&theme-id=23161"
      frameborder="0"
      loading="lazy"
      allowtransparency="true"
      allowfullscreen="true">
    </iframe>
  </div>

<h2>Add the font</h2>
<p>Work Sans is available for free on <a href="https://fonts.google.com/specimen/Work+Sans?query=work&selection.family=Work+Sans:300,400,600">Google Fonts</a>. There are 3 weights being used, light, normal and semi bold.</p>
<p>Here is the standard way of including the fonts, you may want to use an alternative.</p>
<pre><code class="language-css">&lt;link href=&quot;https://fonts.googleapis.com/css?family=Work+Sans:300,400,600&quot; rel=&quot;stylesheet&quot;&gt;
</code></pre>
<h2>Defining markup</h2>
<p>All items need a containing element <code>.boxes</code>, so that you can apply styles to restrict the width of the element.</p>
<p>Following that ‘package’ should be in it’s own <code>&lt;div&gt;</code> with a class <code>box</code> and a positional one <code>box-start</code>, <code>box-center</code>, <code>box-end</code>. As each will have a slightly different offset.</p>
<pre><code class="language-html">&lt;div class=&quot;container&quot;&gt;
  &lt;div class=&quot;boxes&quot;&gt;
    &lt;div class=&quot;box box-start&quot;&gt;
      &lt;h2 class=&quot;title&quot;&gt;Starter&lt;/h2&gt;
      &lt;div class=&quot;price&quot;&gt;
        &lt;span class=&quot;price-value&quot;&gt;£9&lt;/span&gt;&lt;span class=&quot;price-billed&quot;&gt;/mo&lt;/span&gt;
      &lt;/div&gt;
      &lt;ul class=&quot;features&quot;&gt;
        &lt;li&gt;Shared&lt;/li&gt;
        &lt;li&gt;512mb ram&lt;/li&gt;
        &lt;li&gt;20gb HDD&lt;/li&gt;
        &lt;li&gt;200gb bandwidth&lt;/li&gt;
        &lt;li&gt;
          &lt;s&gt;Choice of OS&lt;/s&gt;
        &lt;/li&gt;
        &lt;li&gt;
          &lt;s&gt;Host multiple sites&lt;/s&gt;
        &lt;/li&gt;
      &lt;/ul&gt;
      &lt;a href=&quot;#&quot; class=&quot;button&quot;&gt;Order starter&lt;/a&gt;
    &lt;/div&gt;
    &lt;div class=&quot;box box-center&quot;&gt;
      &lt;h2 class=&quot;title&quot;&gt;Developer&lt;/h2&gt;
      &lt;div class=&quot;price&quot;&gt;
        &lt;span class=&quot;price-value&quot;&gt;£18&lt;/span
        &gt;&lt;span class=&quot;price-billed&quot;&gt;/mo&lt;/span&gt;
      &lt;/div&gt;
      &lt;ul class=&quot;features&quot;&gt;
        &lt;li&gt;VPS&lt;/li&gt;
        &lt;li&gt;4gb ram&lt;/li&gt;
        &lt;li&gt;40gb SSD&lt;/li&gt;
        &lt;li&gt;1tb bandwidth&lt;/li&gt;
        &lt;li&gt;Choice of OS&lt;/li&gt;
        &lt;li&gt;Host multiple sites&lt;/li&gt;
      &lt;/ul&gt;
      &lt;a href=&quot;#&quot; class=&quot;button&quot;&gt;Order developer&lt;/a&gt;
    &lt;/div&gt;
    &lt;div class=&quot;box box-end&quot;&gt;
      &lt;h2 class=&quot;title&quot;&gt;Business&lt;/h2&gt;
      &lt;div class=&quot;price&quot;&gt;
        &lt;span class=&quot;price-value&quot;&gt;£36&lt;/span
        &gt;&lt;span class=&quot;price-billed&quot;&gt;/mo&lt;/span&gt;
      &lt;/div&gt;
      &lt;ul class=&quot;features&quot;&gt;
        &lt;li&gt;Dedicated&lt;/li&gt;
        &lt;li&gt;12gb ram&lt;/li&gt;
        &lt;li&gt;120gb SSD&lt;/li&gt;
        &lt;li&gt;1tb bandwidth&lt;/li&gt;
        &lt;li&gt;Choice of OS&lt;/li&gt;
        &lt;li&gt;Host multiple sites&lt;/li&gt;
      &lt;/ul&gt;
      &lt;a href=&quot;#&quot; class=&quot;button&quot;&gt;Order business&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
</code></pre>
<p>Exploring the markup further, the name of each package is using a <code>&lt;h2&gt;</code> they the price is broken up into two parts to apply the styling necessary. A unordered list is used for the features.</p>
<h2>Colours being used</h2>
<p>For reference here are all the colours used.</p>
<table><thead><tr><th align="left">Colour</th><th align="left">Hex</th></tr></thead><tbody><tr><td align="left">Red</td><td align="left">#eb6e5e</td></tr><tr><td align="left">Light yellow</td><td align="left">#fff6e5</td></tr><tr><td align="left">Dark blue</td><td align="left">#1a626e</td></tr><tr><td align="left">Green</td><td align="left">#4db898</td></tr><tr><td align="left">Light green</td><td align="left">#e1f7ee</td></tr><tr><td align="left">Green (transparent)</td><td align="left">rgba(77, 184, 152, 0.4)</td></tr></tbody></table>

<h2>Starting CSS</h2>
<p>A quick note on the CSS hereon, all examples exclude prefixes for brevity. The codepen example has all necessary prefixes through the use of autoprefixer. It’s debatable whether they are necessary, so that’s up to you.</p>
<h3>The container</h3>
<p>The container mostly exists so the background fills the width of the screen.</p>
<pre><code class="language-css">.container {
  padding: 10% 0;
  background-color: #e1f7ee;
}
</code></pre>
<pre><code class="language-css">.boxes {
  display: flex;
  align-items: center;
  max-width: 798px;
  margin: auto;
}
</code></pre>
<h3>Initial box styling</h3>
<p>The styling required for each box. Here you can define common things early, that can be inherited through to the other elements, like text alignment and the font.</p>
<pre><code class="language-css">.box {
  position: relative;
  flex: 1;
  font-family: Work Sans, sans-serif;
  border-radius: 4px;
  background-color: #fff;
  color: #1a626e;
  text-align: center;
  box-shadow: 0 2px 2px rgba(77, 184, 152, 0.4), 0 2px 12px rgba(77, 184, 152, 0.4);
}
</code></pre>
<p>The most important values aside from the more visual styles is the <code>flex</code> value, as this will ensure everything occupies an equal amount of space.</p>
<p>The visual styling reflects that in the design, particularly the <code>box-shadow</code> it closely mimics that of the Illustrator drop shadow.</p>
<h3>Specific box styling</h3>
<p>Each box is somewhat unique, as reflected in our HTML with the outer and inner class names.</p>
<pre><code class="language-css">.box-outer {
  padding: 60px 0;
}
</code></pre>
<p>The start and end boxes, require the same padding, where the centre box requires more padding to create the size difference.</p>
<pre><code class="language-css">.box-inner {
  padding: 72px 0;
  margin: 0 -12px;
  z-index: 1;
}
</code></pre>
<p>This is where the strength of flexbox as a layout tool helps. The <code>align-content</code> set earlier, means it all aligns nicely.</p>
<p>Finally, the negative margin ensures the overlap is as intended and the <code>z-index</code> means it will be above the other boxes.</p>
<h3>Title</h3>
<p>Now that the general layout is done, you can move onto the content styles, starting with the title.</p>
<pre><code class="language-css">.title {
  color: #eb6e5e;
  font-size: 36px;
  font-weight: 300;
  letter-spacing: -0.05em;
  margin: 0 0 18px;
}
</code></pre>
<p>The font weight is light, which is 300 for this particular typeface.</p>
<h3>Price</h3>
<p>The price is broken up into three parts. The background, price value and the billing period.</p>
<pre><code class="language-css">.price {
  padding: 12px;
  background-color: #fff6e5;
  color: #4db898;
  font-weight: 600;
  font-size: 18px;
}
</code></pre>
<p>Here you define the style of this area, and then move onto the specific differences for the value and billing period.</p>
<pre><code class="language-css">.price-value {
  font-size: 24px;
}

.price-billed {
  font-variant: small-caps;
}
</code></pre>
<p>Individually the value is larger than ‘/mo’, which is also small caps.</p>
<h3>Features</h3>
<p>The features is broken up into a few areas. The <code>&lt;ul&gt;</code>, which some browser defaults need to be undone. The padding adds a good space round the title and button area.</p>
<pre><code class="language-css">.features {
  margin: 0;
  padding: 24px;
}

.features s {
  color: #bed8d8;
}

.features li {
  line-height: 2;
  list-style: none;
}

.features li:first-child {
  font-weight: 600;
}
</code></pre>
<p>Moving on to more of the content, the <code>s</code> of <code>.features s</code> could be easily considered a mistake, but it’s not we’re making the strikethrough a lighter blue to deemphasise it.</p>
<p>Then each item is spaced using <code>line-height</code>, you don’t want anything to break onto a new line so <code>line-height</code> is an easy way to get consistent spacing. Finally, the first item is made bold.</p>
<h3>Button</h3>
<p>When styling unless you want them to fill the width of the container, they are best being <code>inline-block</code>.</p>
<pre><code class="language-css">.button {
  display: inline-block;
  background-color: #eb6e5e;
  color: #fff3f0;
  padding: 12px 24px;
  border-radius: 4px;
  text-decoration: none;
  font-weight: 600;
  transition: 0.3s;
}
</code></pre>
<p>The <code>transition</code> is important for the hover state. The <code>text-decoration</code>, makes sure the browser default is removed.</p>
<pre><code class="language-css">.button:hover,
.button:focus {
  color: #e1f7ee;
  box-shadow: inset 0 -44px #4db898;
}
</code></pre>
<p>The transition set earlier means that the shadow appears from the bottom, without that it would look like the background colour changes. It’s important to note the y value of the shadow needs to be the button height.</p>
<pre><code class="language-css">.button:active {
  transform: scale(0.95455);
}
</code></pre>
<p>The active state makes the button smaller, though the scale value may seem a little strange. The scale down needs to be subtle, so knowing the button height is 44px, scaling down to 42px is ideal. <code>42 ÷ 44</code> gives you <code>.95455</code>.</p>
<h2>All CSS</h2>
<p>That’s everything to be covered in terms of CSS, here is the full combined CSS, so it’s easier to copy.</p>
<pre><code class="language-css">/* Container */
.container {
  padding: 10% 0;
  background-color: #e1f7ee;
}

.boxes {
  display: flex;
  align-items: center;
  max-width: 798px;
  margin: auto;
}

/* Box */
.box {
  position: relative;
  flex: 1;
  font-family: Work Sans, sans-serif;
  border-radius: 4px;
  background-color: #fff;
  color: #1a626e;
  text-align: center;
  box-shadow: 0 2px 2px rgba(77, 184, 152, 0.4), 0 2px 12px rgba(77, 184, 152, 0.4);
}

.box-outer {
  padding: 60px 0;
}

.box-inner {
  padding: 72px 0;
  margin: 0 -12px;
  z-index: 1;
}

/* Title */
.title {
  color: #eb6e5e;
  font-size: 36px;
  font-weight: 300;
  letter-spacing: -0.05em;
  margin: 0 0 18px;
}

/* Price */
.price {
  padding: 12px;
  background-color: #fff6e5;
  color: #4db898;
  font-weight: 600;
  font-size: 18px;
}

.price-value {
  font-size: 24px;
}

.price-billed {
  font-variant: small-caps;
}

/* Features */
.features {
  margin: 0;
  padding: 24px;
}

.features s {
  color: #bed8d8;
}

.features li {
  line-height: 2;
  list-style: none;
}

.features li:first-child {
  font-weight: 600;
}

/* Button */
.button {
  display: inline-block;
  background-color: #eb6e5e;
  color: #fff3f0;
  padding: 12px 24px;
  border-radius: 4px;
  text-decoration: none;
  font-weight: 600;
  transition: 0.3s;
}

.button:hover,
.button:focus {
  color: #e1f7ee;
  box-shadow: inset 0 -44px #4db898;
}

.button:active {
  transform: scale(0.95455);
}
</code></pre>
<h2>Codepen preview</h2>
<div style="margin: 2em 0;">
    <iframe
      height="420"
      style="width: 100%;"
      scrolling="no"
      title="Pricing table"
      src="https://codepen.io/stevemckinney/embed/rLJNYV?default-tab=result&theme-id=23161"
      frameborder="0"
      loading="lazy"
      allowtransparency="true"
      allowfullscreen="true">
    </iframe>
  </div>]]></content:encoded>
    </item>
    
    <item>
      <title>CSS only iOS style ‘toggle’</title>
      <link>https://iamsteve.me/blog/css-only-ios-style-toggle</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/css-only-ios-style-toggle</guid>
      <pubDate>Tue, 19 Jul 2016 06:30:00 GMT</pubDate>
      <description>‘A CSS-only iOS-style toggle using a hidden checkbox and the :checked pseudo class with the adjacent sibling selector. No JavaScript required.’</description>
      <content:encoded><![CDATA[<p>Since they appeared in iOS it’s been a trend to recreate these using CSS only. The technique uses the adjacent sibling selector and a “hidden” checkbox to retain use of the <code>:checked</code> pseudo class. In this post I wanted to take a look at this myself and recreate the toggle style.</p>
<h2>Skip ahead</h2>
<p>Here&#39;s what will be explained in the coming paragraphs. Feel free to explore the code and skip ahead if necessary.</p>
<div style="margin: 2em 0;">
    <iframe
      height="368"
      style="width: 100%;"
      scrolling="no"
      title="CSS only iOS style toggle"
      src="https://codepen.io/stevemckinney/embed/bZYKYj?default-tab=result&theme-id=23161"
      frameborder="0"
      loading="lazy"
      allowtransparency="true"
      allowfullscreen="true">
    </iframe>
  </div>

<h2>Identifying elements in the design</h2>
<div className="article-image">
  <img src="/images/blog/ios-toggle-example.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>To understand what happens with this toggle, it’s more ‘faking’ the element. It’s still a regular checkbox, but to make the toggle work you need to retain the behaviour.</p>
<p>Depending on your stylistic choices it determines how you will setup your markup. As everything involved in this design changes with the checked state, it means careful consideration is needed.</p>
<h2>Markup</h2>
<p>Knowing that each part of the toggle style needs to change that means these elements will all need to follow the checkbox.</p>
<pre><code class="language-html">&lt;label class=&quot;label label-toggle&quot; for=&quot;night-mode&quot;&gt;
  &lt;div class=&quot;input-toggle&quot;&gt;
    &lt;input class=&quot;input-checkbox&quot; id=&quot;night-mode&quot; type=&quot;checkbox&quot; /&gt;
    &lt;span class=&quot;input-toggle-handle&quot;&gt;&lt;/span&gt;
  &lt;/div&gt;
  Night mode
&lt;/label&gt;
</code></pre>
<p>The markup follows a common pattern for using checkbox inputs. It’s contained within the label, to increase the area it can be interacted with.</p>
<p>A span for the styling must follow the checkbox, this will become clearer once you get on to CSS. These elements are then contained by a <code>div</code>, this will be used for positioning and spacing.</p>
<h2>Get some basics in place</h2>
<p>The basics here are what allow you to get the correct positioning, alongside label text and the correct positioning of the checkbox.</p>
<pre><code class="language-css">.input-toggle {
  position: relative;
  display: inline-block;
  vertical-align: middle;
}
</code></pre>
<p>Next is to position the checkbox to fill the toggle area, and remove its visibility with opacity. This is the ‘faking’ part.</p>
<pre><code class="language-css">.input-toggle input {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  opacity: 0;
}
</code></pre>
<h2>Toggle background</h2>
<p>For the background it needs to be fixed in width and height. It’s got to contain the area clearly, and invite interaction. As there is going to be a transition in the background, the styles need to be applied to <code>.input-toggle-handle</code>.</p>
<pre><code class="language-css">.input-toggle-handle {
  display: block;
  width: 84px;
  height: 44px;
  transition: 0.4s ease;
  background-image: linear-gradient(#51c2d7, #51dacf);
  border-radius: 10em;
  box-shadow: inset 0 1px rgba(0, 0, 0, 0.15), inset 0 0 0 1px rgba(0, 0, 0, 0.15),
    inset 0 1px 2px rgba(0, 0, 0, 0.15), inset 44px 44px #fff;
}
</code></pre>
<p>All styling here can be tweaked to your own liking, except for the <code>box-shadow</code> and <code>background-image</code>. They’re crucial to this particular style, as later on the line with <code>inset 44px 44px #fff</code> will transition out the to reveal the gradient. If you want to modify it this is something to consider.</p>
<h2>Toggle handle</h2>
<p>As you’ve had to use the class to form the background, now you’re left with using a pseudo element to make the handle.</p>
<pre><code class="language-css">.input-toggle-handle:before {
  content: &#39;&#39;;
  position: absolute;
  z-index: 1;
  top: 6px;
  left: 8px;
  width: 32px;
  height: 32px;
  transition: 0.4s ease;
  border-radius: 10em;
  background: #fff;
  box-shadow: inset 0 -1px rgba(0, 0, 0, 0.2), inset 0 0 0 1px rgba(0, 0, 0, 0.15),
    0 1px 2px rgba(0, 0, 0, 0.1), 0 6px 12px rgba(0, 0, 0, 0.1);
}
</code></pre>
<p>The positioning values are based upon the size of the toggle and what fits best within the background area. The <code>box-shadow</code> and background can be tweaked as necessary. You may want to tweak the transition values too.</p>
<h2>The :checked state</h2>
<p>In the next steps it becomes clearer why the checkbox is positioned the way it is. As the only way to change the appearance of the toggle is to use the <code>:checked</code> pseudo class.</p>
<h3>Reveal the background</h3>
<p>If the input is checked, style the adjacent sibling (~). Essentially the element that follows this one, this is why source order is crucial.</p>
<pre><code class="language-css">.input-toggle input:checked ~ .input-toggle-handle {
  box-shadow: inset 0 1px rgba(0, 0, 0, 0.15), inset 0 0 0 1px #31a2a8;
}
</code></pre>
<p>Firstly, some adjustments to the <code>box-shadow</code>, this makes for a nice transition from white background to gradient. The choice of colour reflects the gradient, as <code>#31a2a8</code> is a darker shade of blue.</p>
<h3>Move the toggle over</h3>
<pre><code class="language-css">.input-toggle input:checked ~ .input-toggle-handle:before {
  left: 44px;
  box-shadow: inset 0 -1px rgba(0, 0, 0, 0.2), inset 0 0 0 1px #31a2a8,
    0 1px 2px rgba(0, 0, 0, 0.1), 0 6px 12px rgba(0, 0, 0, 0.1);
}
</code></pre>
<p>Finally, move the toggle over and adjust the <code>box-shadow</code>. The <code>left</code> value here is subject to tweaking, if you change the size of the elements.</p>
<blockquote>
<p>It would be ideal to use pseudo elements on the input itself, but it’s necessary to use <code>appearance</code> to be able to. Which works in different ways in different browsers, that makes this approach the most practical.</p>
</blockquote>
<h2>Improving clarity</h2>
<p>Generally with these types of toggles you have to make the shift in state very clear. The position of the toggle and colour certainly indicate this. It’s not ideal to rely only upon colour in your interface, if the action is something critical.</p>
<pre><code class="language-css">.input-toggle:before {
  content: &#39;on&#39;;
  left: 0;
  color: #fff;
}

.input-toggle:after {
  content: &#39;off&#39;;
  right: 0;
  color: #1a626e;
}

.input-toggle:before,
.input-toggle:after {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  padding: 12px 16px;
  font-size: 12px;
  z-index: 0;
}
</code></pre>
<p>The bonus of the containing element allows you to add the state text on this element. Using both <code>:before</code> and <code>:after</code> you add the relevant content, and both need positioning similarly.</p>
<p>The important property here is the <code>z-index</code> ensuring that it remains positioned behind the toggle at all times. This means each transition will nicely hide the relevant text.</p>
<p>The <code>padding</code>, <code>font-size</code> and <code>color</code> can be tweaked here.</p>
<h2>Demo</h2>
<p>Again, here is the complete demo, I recommend forking it on CodePen and having a look around.</p>
<div style="margin: 2em 0;">
    <iframe
      height="368"
      style="width: 100%;"
      scrolling="no"
      title="CSS only iOS style toggle"
      src="https://codepen.io/stevemckinney/embed/bZYKYj?default-tab=result&theme-id=23161"
      frameborder="0"
      loading="lazy"
      allowtransparency="true"
      allowfullscreen="true">
    </iframe>
  </div>]]></content:encoded>
    </item>
    
    <item>
      <title>Designing a pricing table in Illustrator</title>
      <link>https://iamsteve.me/blog/making-a-pricing-table-in-illustrator</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/making-a-pricing-table-in-illustrator</guid>
      <pubDate>Tue, 12 Jul 2016 06:37:00 GMT</pubDate>
      <description>A tutorial on designing a pricing table in Illustrator. The focus is on clarity and visual style — choosing colours, typefaces, and using Illustrator effectively.</description>
      <content:encoded><![CDATA[<p>Pricing tables are reasonably common for various types of services, they serve as a way to give the user an anchor. Generally meaning that you’ll be able to direct the customer into the package the company really wants to sell most of. While this post won’t cover the psychological side of that, it will focus on clarity and visual style. It’s an interesting website element to take a look at, so let’s start.</p>
<h2>What you’re making and download</h2>
<figure><img src="/images/blog/pricing-table_progress-6.png" alt="" width="1024" height="768" style="max-width: 100%; height: auto;" /><figcaption><a href="https://www.dropbox.com/s/a2ukapy2ra9ql84/illustrator-pricing-table-download.ai?dl=0" style={{textDecoration: 'underline' }}>Feel free to download the finished files</a>.</figcaption></figure>

<h2>Choose your content</h2>
<p>You may have a real world use, which I would suggest using, but I’m going to use a fictional web hosting service as an example, with developers/designers with the ability to host side projects on different domains.</p>
<table>
<thead>
<tr>
<th align="left">Starter</th>
<th align="center">Developer</th>
<th align="right">Business</th>
</tr>
</thead>
<tbody><tr>
<td align="left">£9/mo</td>
<td align="center">£18/mo</td>
<td align="right">£36/mo</td>
</tr>
<tr>
<td align="left">Shared</td>
<td align="center">VPS</td>
<td align="right">Dedicated</td>
</tr>
<tr>
<td align="left">512mb ram</td>
<td align="center">4gb ram</td>
<td align="right">12gb ram</td>
</tr>
<tr>
<td align="left">20gb HDD</td>
<td align="center">40gb SSD</td>
<td align="right">128gb SSD</td>
</tr>
<tr>
<td align="left">200gb bandwidth</td>
<td align="center">1tb bandwidth</td>
<td align="right">10tb bandwidth</td>
</tr>
<tr>
<td align="left"><s>Choice of OS</s></td>
<td align="center">Choice of OS</td>
<td align="right">Choice of OS</td>
</tr>
<tr>
<td align="left"><s>Host multiple sites</s></td>
<td align="center">Host multiple sites</td>
<td align="right">Host multiple sites</td>
</tr>
<tr>
<td align="left">Order starter</td>
<td align="center">Order developer</td>
<td align="right">Order business</td>
</tr>
</tbody></table>
<p>I’ve added a line through parts of the service that are not available in others. This will be important for clarity later.</p>
<h2>Design decisions</h2>
<p>A 3 column layout is a must, so that offers an immediate constraint. The decisions to be made are round highlighting the most important features. All the information is important in the table but the deciding factors would likely be based around price and what type of server.</p>
<div className="article-image">
  <img src="/images/blog/pricing-table_sketches.jpg" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Initially I tried a couple of smaller sketches, and decided the name being larger is the best route. This is a common practice simply because price is always a hurdle, an important part, but you don’t want to emphasise it too much. The developer plan will have attention drawn to it through a slightly different size. The reason for this is the intention for it to be the most popular package.</p>
<h2>Choose a typeface</h2>
<p>To get into more design choices, through the typeface, I’m going to use Work Sans. It offers good legibility and has a good options at the bolder and lighter ends of the scale.</p>
<figure><img src="/images/blog/pricing-table_example.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" /><figcaption>Here’s a quick usage example.</figcaption></figure>

<p><a href="https://www.google.com/fonts/specimen/Work+Sans">You can find it on Google Fonts</a>, however, <a href="/blog/how-to-choose-a-typeface-for-paragraphs">you may like to make your own choice</a>.</p>
<h2>Choose a colour palette</h2>
<p>If you want to <a href="/blog/colour-series-picking-your-palette">choose your own palette</a>, I encourage you to, however this is the one I will be using.</p>
<div className="article-image">
  <img src="/images/blog/pricing-table_colour-palette.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<table>
<thead>
<tr>
<th align="left">Colour</th>
<th align="left">Hex</th>
</tr>
</thead>
<tbody><tr>
<td align="left">Red</td>
<td align="left">#eb6e5e</td>
</tr>
<tr>
<td align="left">Light yellow</td>
<td align="left">#fff6e5</td>
</tr>
<tr>
<td align="left">Dark blue</td>
<td align="left">#1a626e</td>
</tr>
<tr>
<td align="left">Green</td>
<td align="left">#4db898</td>
</tr>
<tr>
<td align="left">Light green</td>
<td align="left">#e1f7ee</td>
</tr>
</tbody></table>
<h2>Position the content</h2>
<p>For this particular element it makes sense to get the rough layout defined by type only. This will allow for the sizes of each of the containing rectangles to be determined easily and changed less.</p>
<div className="article-image">
  <img src="/images/blog/pricing-table_progress-1.png" alt="" width="1024" height="768" style="max-width: 100%; height: auto;" />
</div>

<p>Start by typing out in separate type layers, spacing the items and groups, in the following order:</p>
<ul>
<li>Title</li>
<li>Price</li>
<li>Features</li>
<li>Button text</li>
</ul>
<h2>Content styles</h2>
<p>The majority of the styles applied will be through using the character panel. This may be open by default, but if not go to <code>Window &gt; Type &gt; Character</code> or press <kbd>cmd</kbd> + <kbd>t</kbd></p>
<h3>Title</h3>
<p>For the title of each I have chosen to make them red, as they will be quite relatable for the user and size them appropriately.</p>
<h3>Price</h3>
<p>The price doesn’t need to be too emphasised, but it allows you the opportunity to provide some good visual separation, between the title and details.</p>
<div className="article-image">
  <img src="/images/blog/pricing-table_small-caps.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>For now make the value semibold and increase the size to 24px. Next change the ‘/mo’ to small caps keeping that at a regular weight and increasing the font size to 18px.</p>
<p>The small caps in comparison to numbers aren’t very small, hence the choice to decrease the size.</p>
<p>Finally make change the colour to <code>#4db898</code>.</p>
<h3>Features</h3>
<p>For the features, the server type is the most important factor. With a little knowledge you can immediately work out the quality you’ll get. So to add emphasis here is ideal, increase the weight to semibold.</p>
<div className="article-image">
  <img src="/images/blog/pricing-table_leading.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Change the colour to <code>#1a626e</code> and increase the leading to 32px. This will give sufficient space between each item.</p>
<h4>Reducing emphasis on features not included</h4>
<p>The final step for the features is to have a way to show that they’re not included. For this select in starter the ‘choice of OS’ and ‘Host multiple sites’ and change the colour to <code>#bed8d8</code>.</p>
<h3>Button</h3>
<p>The button text should be semibold and have a red background. Add a rounded rectangle, select it by finding the rectangle in the toolbar. Click and hold to reveal the extra items.</p>
<div className="article-image">
  <img src="/images/blog/pricing-table_button-dimensions.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>For the ‘Order starter’ dimensions will be 132 width by 42 height. The corner radius will be 4px. Repeat this process for the other buttons, keeping the same height.</p>
<h4>Button text colour</h4>
<p>Finally, as the text colour won’t be very readable on this background colour change it to #fff3f0. It’s not quite white, but a very light shade, this creates a nicer contrast.</p>
<h2>Check in</h2>
<p>Now that you’ve applied all the text styles, and a background for the buttons you’re not far from complete.</p>
<div className="article-image">
  <img src="/images/blog/pricing-table_progress-2.png" alt="" width="1024" height="768" style="max-width: 100%; height: auto;" />
</div>

<h2>Making each section clear</h2>
<p>In these next steps you’ll make each section clearer. Firstly, select everything and press <kbd>cmd</kbd> + <kbd>g</kbd> and then open the align panel from Window &gt; Align. Next change ‘Align to:’ to Align to Artboard.</p>
<div className="article-image">
  <img src="/images/blog/pricing-table_align-window.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Align everything to the vertical centre, this sets everything up nicely for later alignment.</p>
<h3>Background</h3>
<p>Press <kbd>m</kbd> to select the rectangle tool, click the artboard and draw a rectangle the size of the artboard. Following that cut it <kbd>cmd</kbd> + <kbd>x</kbd>, and paste it in the background <kbd>cmd</kbd> + <kbd>b</kbd>.</p>
<p>Now change the background to <code>#e1f7ee</code>. With the layer still selected press <kbd>cmd</kbd> + <kbd>2</kbd>, this should lock the layer. This will ensure you don’t select it later as there is no further changes needed.</p>
<h3>Sectioning</h3>
<p>Find the rounded rectangle tool, then click the artboard and add dimensions 266px width by 516px height with a 4px radius.</p>
<div className="article-image">
  <img src="/images/blog/pricing-table_progress-3.png" alt="" width="1024" height="768" style="max-width: 100%; height: auto;" />
</div>

<p>Once in place, press <kbd>cmd</kbd> + <kbd>[</kbd> until it has gone to the back of the text.</p>
<h4>Alignment</h4>
<p>With the shape still selected using the align window from earlier, align it both horizontally and vertically on the artboard.</p>
<p>Things will be a little out of place with the central column, select everything in the central column, and align to the horizontal centre.</p>
<h4>Add a shadow</h4>
<div className="article-image">
  <img src="/images/blog/pricing-table_dropshadow-menu.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Next with the shape still selected, in the menu go to Effect &gt; Stylize &gt; Drop Shadow.</p>
<div className="article-image">
  <img src="/images/blog/pricing-table_dropshadow-settings.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>With the drop shadow window open, add the following settings:</p>
<table>
<thead>
<tr>
<th align="left">Setting</th>
<th align="left">Value</th>
</tr>
</thead>
<tbody><tr>
<td align="left">Mode</td>
<td align="left">Normal</td>
</tr>
<tr>
<td align="left">Opacity</td>
<td align="left">40%</td>
</tr>
<tr>
<td align="left">X Offset</td>
<td align="left">0</td>
</tr>
<tr>
<td align="left">Y Offset</td>
<td align="left">2px</td>
</tr>
<tr>
<td align="left">Blur</td>
<td align="left">12px</td>
</tr>
<tr>
<td align="left">Color</td>
<td align="left">#4db898</td>
</tr>
</tbody></table>
<h4>The shadow colour</h4>
<p>When choosing a shadow colour it should take on some of the colour around it. Hence why the shadow is a darker green, if you were to use black, it&#39;s less true to how shadows behave. Ideally it would be different colours for the central column, this is something that is for a post of it&#39;s own as it&#39;s difficult to achieve without multiple layers.</p>
<h4>Add a different shadow</h4>
<p>Copy your original shadow layer, paste it in place with <kbd>cmd</kbd> + <kbd>shift</kbd> + <kbd>v</kbd>.</p>
<p>In the appearance panel, which can be found under Window &gt; Appearance, click the drop shadow to modify it. Change the shadow blur to 2px, and move it behind the text layers with <kbd>cmd</kbd> + <kbd>[</kbd>.</p>
<h4>Group and duplicate the shadows</h4>
<p>Select both of the shadow layers and group them with <kbd>cmd</kbd> + <kbd>g</kbd>.</p>
<h4>Duplicate</h4>
<div className="article-image">
  <img src="/images/blog/pricing-table_progress-5.png" alt="" width="1024" height="768" style="max-width: 100%; height: auto;" />
</div>

<p>With the group still selected, paste in place <kbd>cmd</kbd> + <kbd>shift</kbd> + <kbd>v</kbd>. Then nudge across until it lines up nicely at the side. Repeat this process again.</p>
<h4>Resize</h4>
<p>Now you should have two rectangles at either side. Select both of them and subtract 24px from their height.</p>
<div className="article-image">
  <img src="/images/blog/pricing-table_transform-reference.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Making sure your reference point is in the centre, and constrain width and height proportions is off.</p>
<h4>Send to back and more alignment</h4>
<p>Using <kbd>cmd</kbd> + <kbd>[</kbd>, send the two resized rectangles to the back. Now at this stage some alignment may be off, select each column and click the rectangle layer. The line should become bolder, now in the align panel use ‘Horizontal Align Center’.</p>
<p>This is <a href="/blog/illustrator-quick-tip-align-to-key-object">aligning to a key object</a>, repeat the process for the other side. Then take each side individually and nudge it in 12px.</p>
<h2>Adding visual separation to the price</h2>
<div className="article-image">
  <img src="/images/blog/pricing-table_progress-6.png" alt="" width="1024" height="768" style="max-width: 100%; height: auto;" />
</div>

<p>After getting this far, there is only improving the visual separation of the price. Add a rectangle that is 266px width by 54px height, with the fill colour <code>#fff6e5</code>. Place it roughly behind the price, then using the align to key object technique</p>
<h3>Duplicate and align in each section</h3>
<p>Copy, paste in place and then position it with the other price. Repeat this process for the third column and you&#39;re done.</p>
<h2>Final thoughts</h2>
<p>There are ways to build upon this add further dimension to buttons and such things. To keep the tutorial shorter I opted against this.</p>
<p><a href="https://www.dropbox.com/s/a2ukapy2ra9ql84/illustrator-pricing-table-download.ai?dl=0">Feel free to download the finished files</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Wordpress functions to help make your life easier</title>
      <link>https://iamsteve.me/blog/wordpress-functions-to-help-make-your-life-easier</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/wordpress-functions-to-help-make-your-life-easier</guid>
      <pubDate>Tue, 05 Jul 2016 06:30:00 GMT</pubDate>
      <description>As part of using Wordpress, and any other part of making a website, for that matter, you acquire reusable parts. As well as discover functions that aren’t shouted about. In this post I’ve shared a few with usage.</description>
      <content:encoded><![CDATA[<p>As part of using Wordpress, and any other part of making a website, for that matter, you acquire reusable parts. As well as discover functions that aren’t shouted about. In this post I’ve shared a few with usage.</p>
<h2>Wordpress: wp_trim_words()</h2>
<p>I’m fairly certain that one of the most Google’d terms for Wordpress, would be around the truncation of excerpts. I know I have done it multiple times, but Wordpress has it’s own function.</p>
<pre><code class="language-php">wp_trim_words( $text, $num_words = 55, $more = null ); 
</code></pre>
<p>It takes three parameters, the text, number of words and what to append to the text should it be trimmed.</p>
<pre><code class="language-php">$content = wp_trim_words( get_the_content(), 40, &#39;…&#39; ); 
echo $content;
</code></pre>
<h2>Wordpress: get_template_directory_uri()</h2>
<p>Being new or experienced to Wordpress can leave you wondering what’s the best way to get the URL to something? There are a few different ways but the way that never fails, is <code>get_template_directory_uri()</code>. Remember that and you’ll be ok.</p>
<pre><code class="language-php">&lt;img src=&quot;&lt;?php echo get_template_directory_uri() ?&gt;/images/logo.svg&quot;&gt;
</code></pre>
<h2>Wordpress: home_url()</h2>
<p>Equally if you have a particular URL in mind, but just want to ensure the correct domain is used transitioning between local and live, the <code>home_url()</code> function is what you need.</p>
<p>It takes two parameters, the URL and the scheme. Building on the <code>get_template_directory_uri()</code> example from before.</p>
<pre><code class="language-php">&lt;a href=&quot;&lt;?php echo home_url(); ?&gt;&quot;&gt;
  &lt;img src=&quot;&lt;?php echo get_template_directory_uri() ?&gt;/images/logo.svg&quot;&gt;
&lt;/a&gt;
</code></pre>
<p>Alternatively, if you wanted to link to a particular page using https.</p>
<pre><code class="language-php">&lt;a href=&quot;&lt;?php echo home_url( &#39;blog&#39;, &#39;https&#39; ); ?&gt;&quot;&gt;Blog&lt;/a&gt;
</code></pre>
<p>Or output the relative URL eg: ‘/blog’.</p>
<pre><code class="language-php">&lt;a href=&quot;&lt;?php echo home_url( &#39;blog&#39;, &#39;relative&#39; ); ?&gt;&quot;&gt;Blog&lt;/a&gt;
</code></pre>
<h2>Wordpress: wpautop()</h2>
<p>This is a particularly smart function built into Wordpress, it will add paragraphs round the content passed to it. If the content does contain paragraphs, it won’t. It’s quite handy for excerpts, if they are to span multiple paragraphs or to save you from having to do it manually.</p>
<pre><code class="language-php">echo wpautop(get_the_excerpt());
</code></pre>
<h2>Custom: link_to()</h2>
<p>This isn’t a Wordpress function by default, but if you’ve ever just wanted to get the page by it’s title (alternatively name). It involves a couple of steps, and this can get quite repetitive and difficult to remember.</p>
<pre><code class="language-php">function link_to( $title )
{
  return get_page_link( get_page_by_title( $title )-&gt;ID );
}
</code></pre>
<p>It was somewhat inspired by Rails, hence the naming <code>link_to</code>. Although it isn’t quite as powerful as the Rails version, it’s still a valuable addition to your Wordpress setup, for when you need to speedily get a link to a page.</p>
<pre><code class="language-php">echo link_to( &#39;Contact&#39; );
</code></pre>
<h2>Custom: add excerpts to pages</h2>
<p>Sometimes you’ll want to add an introduction to a page, or have some descriptive text separate from <code>the_content()</code>. You can do this for posts with ease, but for pages it’s trickier. You shouldn’t have to set up a custom field of sorts, it should be simpler, which adding excerpts to pages is. <strong>Add both of these functions to functions.php</strong>.</p>
<pre><code class="language-php">function iamsteve_page_excerpt()
{
    add_post_type_support( &#39;page&#39;, &#39;excerpt&#39; );
}
add_action( &#39;init&#39;, &#39;iamsteve_page_excerpt&#39; );
</code></pre>
<p>After adding support for excerpts, you want to build a function to use it. As mentioned earlier, this is a handy place to use <code>wpautop()</code>, for automatic paragraphs.</p>
<pre><code class="language-php">function get_page_excerpt()
{
  global $post;
  $page_excerpt = get_page( $post-&gt;ID )-&gt;post_excerpt;

  if ( $page_excerpt )
  {
    return wpautop( $page_excerpt, false );
  }
}
</code></pre>
<p>The function then uses the global <code>$post</code> variable to gain access to the excerpt. This ensures that it will be accessible without needing a loop. Check if it exists, pass that through <code>wpautop()</code>, the second parameter can defaults to true to preserve line breaks <code>&lt;br&gt;</code>. You may or may not want this.</p>
<h2>That’s it</h2>
<p>These are the instances I have found myself Googling a lot for and to know that some of the functionality already exists within Wordpress is helpful. Is there anything you’d add to this list?</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Redesign progress update</title>
      <link>https://iamsteve.me/blog/redesign-progress-update</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/redesign-progress-update</guid>
      <pubDate>Mon, 27 Jun 2016 06:27:00 GMT</pubDate>
      <description>A progress update on the v6 redesign — balancing writing with redesign work. Includes early iterations of designs and illustration from the process.</description>
      <content:encoded><![CDATA[<p>One of my aims during redesigning this website is to keep the seamlessness between content output and redesign. It’s not the easiest of tasks, as any time spent writing, is time taken away from the redesign or vice versa.</p>
<p>It also means every post I work on, the redesign release gets pushed back, or it takes away from a potential queue addition. As I don’t want to stop the weekly output, I think it’s worth posting a progress update to think some things through.</p>
<h2>Why redesign</h2>
<p>As I haven’t announced in great detail that I’m doing a redesign (why would it matter?) I want to reflect on that. This site was last redesigned early 2012, which was the year I graduated from University. I prepared a portfolio, and setup the site to be very focused on getting a job. Now I’ve been in the industry for nearly 5 years, much has changed for me professionally, but this website has remained the same.</p>
<p>There is a level of complacency that happens with having a job. You get comfortable and don’t really update your portfolio, which can really leave you lagging behind. As a result of this I eventually removed the portfolio and made some tweaks. They were focused on moving the website in a direction of having an active blog. This made sense, as it was something I proved to myself, that I could do regularly.</p>
<h3>A new logo then redesign the site</h3>
<p>As mentioned in the <a href="/blog/iamsteve-a-new-logomark">logo redesign post</a>, the full redesign is something I originally started in around 2013. I made good progress with the design, but the design world shifted to flat and what I made was heavily ‘skeuomorphic’. I was put off by that, I didn’t want to appear outdated. It had a negative effect, I wasn’t motivated to start again. I just couldn’t get behind ‘flat’ and the amount of time it takes to redesign a website in your personal time.</p>
<p>On more recent reflection that design still met criteria of a redesign, but the shift in direction means, that much of it in terms of layout, would need to change.</p>
<h3>The scrapped design</h3>
<p>I explored several other ideas, within a similar style. Some of these versions at the time were testing my skills of visual design. It was a fun design process.</p>
<figure><img src="/images/blog/redesign_iteration-1@2x.png" alt="" width="900" height="820" style="max-width: 100%; height: auto;" /><figcaption>I wanted to explore different navigation styles. There is also some awkward spacing between the about and dribbble shots.</figcaption></figure>

<figure><img src="/images/blog/redesign_iteration-2@2x.png" alt="" width="900" height="820" style="max-width: 100%; height: auto;" /><figcaption>Compacting the layout here was probably the right balance between adventurous and difficulty.</figcaption></figure>

<figure><img src="/images/blog/redesign_iteration-3@2x.png" alt="" width="900" height="820" style="max-width: 100%; height: auto;" /><figcaption>I simplified much further, because I kept thinking ‘is it too much?’</figcaption></figure>

<p>I tried various routes, and eventually reigned in the approach as I tried to balance the visual design with content and not make it too intense.</p>
<h2>On to the actual redesign</h2>
<p>I’ve mostly kept quiet about the process of the redesign as I’m documenting it along the way. A write up will follow with the redesign. I’m currently at a stage where I’m not too far away from completion. The homepage is done, and I’m working on the blog related pages.</p>
<p>Following my process, I identified a set of problems. These were as simple as the website is outdated and that I don’t feel as if I’m perceived as a designer. After that, I outlined a brief, to make a new ‘brand’ for this website, improve the blog, bring back a portfolio and bring focus to me being a designer.</p>
<h3>Taking an idea and improving it</h3>
<p>Getting into the design, I revisited what I had made previously in making a new logo and came up with a new solution. I visited wireframes and sketches briefly, whilst applying some illustration to the logo. I realised this wasn’t working and scrapped that idea.</p>
<h3>Reworking an idea further</h3>
<p>Determined to include illustration I went back to the drawing board and changed the idea. I tried to force them to be very closely based on the logo. Which was fine, it worked, but not with the layout. So I made them with a view to fit them in the design.</p>
<figure><img src="/images/blog/redesign_mascot-logos@2x.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" /><figcaption>These are the unused Illustrations. I was going for a ‘space’ type theme, it didn’t quite work out.</figcaption></figure>

<p>The illustrations are an area I spent most time. It’s an area I’m not as confident with, as I’m by no means an illustrator or good at drawing. It’s something I’m working on and I was determined to make it work.</p>
<p>Following finalising the illustrations, I made initial colour and typeface choices, alongside sketching ideas and moving on to wireframes. I made wireframes for the homepage and blog. Which then I designed. I made the decision quite early on to stagger the approach, and have left the portfolio until a later date. I have since got around 70% of the way with coding. With the homepage complete and the blog pages a good way through.</p>
<h2>The plan from here</h2>
<p>The priority is to get to finish the blog related pages, finish off the download for the newsletter and an extremely simple contact page. Finally some testing and make it public.</p>
<p>From there I have a list of things to do to build up on the blog:</p>
<ul>
<li>Contact improvements</li>
<li>Performance improvements</li>
<li>Series highlighter</li>
<li>About</li>
<li>Design system</li>
<li>Portfolio</li>
</ul>
<p>Regarding the portfolio, it’s a really intense task to do right. I am considering using the likes of Adobe Portfolio, as it’s purely about the process and work. This service exists for a reason, so I believe it’s a good choice. I want to take my portfolio more seriously, and be able to keep it updated easily.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Efficient table creation in Illustrator</title>
      <link>https://iamsteve.me/blog/efficient-table-creation-in-illustrator</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/efficient-table-creation-in-illustrator</guid>
      <pubDate>Tue, 21 Jun 2016 06:47:00 GMT</pubDate>
      <description>Tables are tedious to make in Illustrator, but there’s a quicker way. This post shows how to create an accurate table efficiently using Illustrator’s built-in tools.</description>
      <content:encoded><![CDATA[<p>Tables in general are something I naturally avoid doing in design applications, they’re frustrating to make. They are easily to overlook due to this and that they can be quite uncommon in use. Let’s say you wanted to design a table in Illustrator, and you wanted a quick and accurate way to do so. This post will show you how.</p>
<h2>What we will end up with</h2>
<p>At the end of the post you’ll end up with something that looks like this, if you would like to skip ahead you can download the file.</p>
<h2>Make a new document</h2>
<p>The first step is to setup a new document, the size isn’t too important, but I’ve made an 1200⨉800 web artboard.</p>
<h2>Getting the initial row layout</h2>
<p>The first step is to get the necessary elements in place to begin to build up the table. Select the line tool using <kbd>\</kbd>.</p>
<div className="article-image">
  <img src="/images/blog/table_initial-line.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Then click the artboard and you’ll be presented with a window. The length should be 840px and the angle should be 0°.</p>
<h3>Duplicate the line</h3>
<p>The next step is to duplicate the line and paste in place. Copy the line with <kbd>cmd</kbd> + <kbd>c</kbd> then paste in place with <kbd>cmd</kbd> + <kbd>shift</kbd> + <kbd>v</kbd>.</p>
<div className="article-image">
  <img src="/images/blog/table_y-coordinate.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>With the line still selected, open Window &gt; Transform. Click to the end of the y coordinate and type &#39;+256&#39; this will add 8 rows worth of space at 32px each to the y coordinate.</p>
<h2>Using the blend tool to make additional lines</h2>
<figure>
<img src="/images/blog/table_progress-1.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>You should have something similar to this. Two lines positioned 252px apart.</figcaption>
</figure>

<p>Select both of your lines, then press <kbd>cmd</kbd> + <kbd>alt</kbd> + <kbd>b</kbd>, or in the menu go to Object &gt; Blend &gt; Make. After doing this you may have what appears to be a filled box.</p>
<p>Next, in the menu go to Object &gt; Blend &gt; Blend Options. This is where you can customise the blend. In spacing select ‘Specified Steps’ and put in 6. Click ‘OK’ and you have the cells.</p>
<div className="article-image">
  <img src="/images/blog/table_blend-options.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<h2>Alternating row colour</h2>
<p>Now you’re going to use split into grid to make rows to use for the background colour.</p>
<h3>Add a rectangle</h3>
<p>Press <kbd>m</kbd>, click the artboard and add the values 840px by 252px. So that the rows will be covered.</p>
<div className="article-image">
  <img src="/images/blog/table_rectangle-rows.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Next, fill the rectangle with any colour, purely for visibility.</p>
<h3>Align the rectangle</h3>
<p>Select both the rectangle and the lines that have been blended. Then open the align panel, which can be found under Window &gt; Align.</p>
<div className="article-image">
  <img src="/images/blog/table_align-panel.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Now using ‘Align to Artboard’ click both horizontal and vertical align centre.</p>
<h3>Make the rows</h3>
<figure><img src="/images/blog/table_progress-2.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" /><figcaption>You should have something similar to this, a background layer and a blended object.</figcaption></figure>

<p>Next is to select your rectangle then go to Object &gt; Path &gt; Split into Grid.</p>
<div className="article-image">
  <img src="/images/blog/table_rows.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Add 7 to the row count and click ok. The rectangle will be the top most layer, so press <kbd>cmd</kbd> + <kbd>[</kbd> until the rectangle is behind the lines.</p>
<h3>Alternating row colour</h3>
<p>I would recommend that you don’t delete rows to get the alternating row colour. This will make alignment trickier later for each row. <strong>Instead, fill them with the main background colour</strong>.</p>
<h3>Expand</h3>
<p>If you want to apply different stroke widths to change the style, it will be ideal to expand the blend. To do this you can press <kbd>cmd</kbd> + <kbd>e</kbd>, or by going to Object &gt; Expand in the menu.</p>
<h2>Add some content</h2>
<p>At this stage now is ideal to add content, that way you can determine column length. Then add the vertical lines, if this is your preference. I would recommend a manual approach as column width isn’t easy to determine.</p>
<div className="article-image">
  <img src="/images/blog/table_progress-3.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Once you have your content entered, you can think better about alignment. Everything is likely to be placed pretty well, but some things will be off.</p>
<h3>Row alignment</h3>
<p>Using align to key object you can align each row reasonably quickly.</p>
<div className="article-image">
  <img src="/images/blog/table_align-row.gif" alt="" width="880" height="408" style="max-width: 100%; height: auto;" />
</div>

<p>Using <a href="/blog/illustrator-quick-tip-align-to-key-object">align to key object</a> is important because it makes sure nothing nudges out of place by a few pixels.</p>
<h3>Column alignment</h3>
<p>As mentioned a little earlier I recommend aligning these manually. Changing text alignment where you see fit and that should be it.</p>
<div className="article-image">
  <img src="/images/blog/table_progress-4.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<h2>Define your style</h2>
<div className="article-image">
  <img src="/images/blog/table_progress-5.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>That’s it, I’ve defined some simple styling, to keep the tutorial short, but you can very much build up on this. The techniques learnt within this post can really help tasks like this much more efficient.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>How to align to key object in Illustrator</title>
      <link>https://iamsteve.me/blog/illustrator-quick-tip-align-to-key-object</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/illustrator-quick-tip-align-to-key-object</guid>
      <pubDate>Tue, 14 Jun 2016 06:27:00 GMT</pubDate>
      <description>Aligning to a key object in Illustrator is one of the most useful alignment options. If you’ve ever been frustrated with aligning objects centrally, then everything nudges over a few pixels. This is where align to key object comes in, read on for how to.</description>
      <content:encoded><![CDATA[<p>Aligning to a key object in Illustrator is one of the most useful alignment options. If you’ve ever been frustrated with aligning objects centrally, then everything nudges over a few pixels. This is where align to key object comes in, read on for how to.</p>
<h2>When and why</h2>
<p>The most common use case I can think of is making buttons. You’ve got a rectangle, above that is some text, which you want to align centrally. The rectangle is positioned correctly, your text isn’t. <strong>You use the alignment tools and everything is now off by a few pixels</strong>. This is the perfect use case for align to key object.</p>
<h2>How to</h2>
<div className="article-image">
  <img src="/images/blog/align-button.gif" alt="Animated demonstration of aligning objects to a key object in Illustrator" width="738" height="420" style="max-width: 100%; height: auto;" />
</div>

<p>To align to key object you must select two items and then change the ‘Align To’ option to Align to Key Object. <strong>The crucial part is then clicking the item you want to use to for aligning to</strong>.</p>
<h2>Quicker for axis alignment</h2>
<figure><img src="/images/blog/align-axis.gif" alt="" width="738" height="420" style="max-width: 100%; height: auto;" /><figcaption>In the making of this post I discovered you could click the key object without having to choose the align to method.</figcaption></figure>

<p>Using align to key object is a quick method for aligning horizontally or vertically. Using the same method it will help save time.</p>
<h2>That’s it</h2>
<p>I do wish there was a way to somehow default this behaviour. Taking the item in the back as the key object, this would work well. Anyway, I felt this was a necessary quick tip to highlight, as I’ve found it valuable.</p>
<p>Once you’re comfortable with this, it’s also the key to <a href="/blog/illustrator-quick-tip-equally-space-objects">evenly spacing objects</a> with a precise pixel value.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Why you should use tachyons to make CSS easier</title>
      <link>https://iamsteve.me/blog/why-you-should-use-tachyons-to-make-css-easier</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/why-you-should-use-tachyons-to-make-css-easier</guid>
      <pubDate>Tue, 07 Jun 2016 06:30:00 GMT</pubDate>
      <description>‘The tachyons approach to CSS makes sense, particularly for spacing and font sizes. This post explains the benefits and how to adapt it to how you already write CSS.’</description>
      <content:encoded><![CDATA[<p>I’ve been aware of <a href="http://tachyons.io">tachyons.io</a> for a while, it was one of those things to get shared on twitter and such. I acknowledged it as an approach to CSS, but never looked into it in detail, until recently. As I’ve spent time understanding the approach, it really makes sense for most CSS. Particularly spacing and font sizes. In this post I’m going to explain; why you may want to use this approach, and how to adapt it to your style of writing CSS.</p>
<h2>Why the tachyons approach?</h2>
<p>Websites are ever growing in size and complexity and tachyons aims to bring some control to that in a performant way. It gives you the power to make websites with as little CSS as possible.</p>
<p>Just think of the amount of times you define and tweak at different screen sizes font size, margin and padding. It’s probably a significant amount, and if you’re like me you’ll want to keep it consistent. However, this is very difficult to keep track of.</p>
<p>It’s a struggle to keep these particular properties consistent and maintain how your design looks. It’s frustrating to see something out of alignment, or a font size too large. To write the extra CSS to fix it feels annoying. This is what tachyons solves.</p>
<h2>Getting started</h2>
<p>The approach is very easy to customise to your kind of setup. It’s applying the same rules across multiple breakpoints, which allows you to write your HTML towards that.</p>
<h3>You may have something that looks like</h3>
<p>So traditionally you may apply some basic styling to your headings and paragraphs, then get more specific as and when.</p>
<pre><code class="language-css">h1, h2, h3, h4, h5, h6 { … }
h1 { … }
h2 { … }
p { … }

.content-title { … }
.some-other-content-title { … }
.more-content-title { … }

@media (min-width: 800px) {
  .content-title { … }
  .some-other-content-title { … }
  .more-content-title { … } }
</code></pre>
<p>This is just a vague example. If you have separate margins and font sizes in all of those rules, that are very similar. The tachyons approach means you don’t redefine these styles over and over. Instead you apply the class in your HTML.</p>
<p>It takes the worry of CSS being off at a certain media query. It’s about having one area to rely upon, if a margin needs to be smaller at a breakpoint, add a class.</p>
<h3>Using font sizing as an example</h3>
<p>So let’s get on to the replacement. Within your design you will have a set of font sizes, that follow a type scale or a pattern, gather all these up. Each property is defined in a class.</p>
<pre><code class="language-css">.f1 {
  font-size: 30px;
}
.f2 {
  font-size: 24px;
}
.f3 {
  font-size: 21px;
}
.f4 {
  font-size: 18px;
}
.f5 {
  font-size: 16px;
}
.f6 {
  font-size: 14px;
}
</code></pre>
<p>You repeat this process in media queries, except apply a suffix to them. In this example I use <code>-b</code> and <code>-d</code>. I use these letters, because in Sass, I have variables assigned to each breakpoint, so I know what it’s tied to.</p>
<pre><code class="language-css">@media (min-width: 600px) {
  .f1-b {
    font-size: 30px;
  }
  .f2-b {
    font-size: 24px;
  }
  .f3-b {
    font-size: 21px;
  }
  .f4-b {
    font-size: 18px;
  }
  .f5-b {
    font-size: 16px;
  }
  .f6-b {
    font-size: 14px;
  }
}

@media (min-width: 800px) {
  .f1-d {
    font-size: 30px;
  }
  .f2-d {
    font-size: 24px;
  }
  .f3-d {
    font-size: 21px;
  }
  .f4-d {
    font-size: 18px;
  }
  .f5-d {
    font-size: 16px;
  }
  .f6-d {
    font-size: 14px;
  }
}
</code></pre>
<p>Tachyons also has a slightly different breakpoint setup. It uses ns (not small), m (medium) and l (large). It’s entirely up to you.</p>
<h3>Using the classes</h3>
<p>Now you may wonder what’s the point in defining the same sizes with slightly varied naming, in different media queries. That’s the beauty of this, once you understand you have a lot of control over your design, very quickly.</p>
<pre><code class="language-html">&lt;h1 class=&quot;f3 f2-b f1-d&quot;&gt;My title&lt;/h1&gt;
</code></pre>
<p>With the markup you go from font size 3 up to font size 1. This makes it quick to apply any font size in your type scale.</p>
<h2>Misunderstanding the approach</h2>
<p>I did initially misunderstand the approach, I tied it too closely to specific situations.</p>
<pre><code class="language-css">.f1 {
  font-size: 21px;
}

@media (min-width: 600px) {
  .f1-b {
    font-size: 24px;
  }
}

@media (min-width: 800px) {
  .f1-d {
    font-size: 30px;
  }
}
</code></pre>
<p>The misunderstanding I had was having <code>.f1</code> be one size and each of the media query variants be different sizes too. I seen it as I wouldn’t ever use this font size at this screen width, so I’ll just resize it here.</p>
<p>That causes the same problems with consistency and maintenance. It’s important to know that each font size is the same just a different suffix. If you need another font size then create a new class set.</p>
<h2>Naming, yes it may be ugly</h2>
<p>After all that, yes, it is considered an ugly approach. So is the repetitive nature of applying font sizes and spacing.</p>
<pre><code class="language-html">&lt;h1 class=&quot;size-small size-medium-b size-large-d&quot;&gt;My title&lt;/h1&gt;
</code></pre>
<p>There is also nothing stopping you from using your own naming pattern. That’s up to you, this is a technique for applying CSS.</p>
<h2>Get comfortable with applying classes</h2>
<p>You also have to be comfortable with what could be considered ‘classitis’, but it’s so simple to manage. One place to update, not multiple. No approach is perfect, but this certainly takes away the headaches.</p>
<p>There are so many techniques for writing CSS, they all have similar goals in mind. This isn’t how I’m approaching every bit of CSS I write, I’ve just taken the parts that cause me frustration regularly. Spacing and font sizes happen to be mine.</p>
<h2>Other examples</h2>
<p>This approach can be used for anything, if you explore the tachyons documentation it will become clear.</p>
<pre><code class="language-css">.mb0 {
  margin-bottom: 0;
}
.mb1 {
  margin-bottom: 6px;
}
.mb2 {
  margin-bottom: 12px;
}
.mb3 {
  margin-bottom: 18px;
}
.mb4 {
  margin-bottom: 24px;
}

@include breakpoint(min-width: 600px) {
  .mb0-b {
    margin-bottom: 0;
  }
  .mb1-b {
    margin-bottom: 6px;
  }
  .mb2-b {
    margin-bottom: 12px;
  }
  .mb3-b {
    margin-bottom: 18px;
  }
  .mb4-b {
    margin-bottom: 24px;
  }
}

@include breakpoint(min-width: 800px) {
  .mb0-d {
    margin-bottom: 0;
  }
  .mb1-d {
    margin-bottom: 6px;
  }
  .mb2-d {
    margin-bottom: 12px;
  }
  .mb3-d {
    margin-bottom: 18px;
  }
  .mb4-d {
    margin-bottom: 24px;
  }
}
</code></pre>
<p>The naming behind this is the abbreviation of margin bottom. As mentioned earlier, it’s logically named. In designs your spacing should follow a pattern (like your type), so you should only need a set amount.</p>
<h2>What about areas I can’t control?</h2>
<p>Typically anything that’s managed in a CMS you can’t apply classes to. It doesn’t mean defeat. You have to apply styles more specifically.</p>
<pre><code class="language-css">.cms h1 {
  font-size: 21px;
}

@media (min-width: 600px) {
  .cms h1 {
    font-size: 24px;
  }
}

@media (min-width: 800px) {
  .cms h1 {
    font-size: 30px;
  }
}
</code></pre>
<p>This is fine, sure it kind of breaks the approach. It’s only one additional area, that you’ll be very aware of. You have had to make the decision to go specific, instead of being specific all the time.</p>
<p>The best thing I have learnt about CSS, is not to be dogmatic about it. Take bits of each approach and make it work for you.</p>
<h2>Tachyons makes sense</h2>
<p>I encourage you to look at <a href="http://tachyons.io">tachyons.io</a> for more information. Have a think about the most repetitive parts of writing CSS and use this approach. It’s made managing CSS much easier, and allows me to focus on what I enjoy most; designing.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Get up to speed with scroll snap points</title>
      <link>https://iamsteve.me/blog/get-up-to-speed-with-scroll-snap-points</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/get-up-to-speed-with-scroll-snap-points</guid>
      <pubDate>Tue, 31 May 2016 06:30:00 GMT</pubDate>
      <description>An introduction to CSS scroll snap points and how they can replace JavaScript carousels. Covers the level one properties — note: this post is now out of date.</description>
      <content:encoded><![CDATA[<blockquote>
<p><strong>This post is out of date</strong>. Scroll snap points has been updated significantly since this post was written. Many of the properties will no longer work, until this post can be updated, I would advise referring to the <a href="https://drafts.csswg.org/css-scroll-snap-1/">official spec</a>.</p>
</blockquote>
<p>Scroll snap points is the answer to the need for JavaScript carousels, to an extent. As browsers gain more and more new features in CSS, it’s important to keep up to date with them. As the generalisation is; where you can replace JavaScript with CSS you gain performance improvements. Carousels in my experience are a good chunk of the need for JavaScript on the average website. So I&#39;m very interested at the prospect of using scroll snap points to replace that.</p>
<h2>Browser support</h2>
<p>Currently browser support isn&#39;t great (as of writing), due to Chrome not supporting scroll snap points altogether. So this cuts out a massive part of anyone’s audience. Always check <a href="http://caniuse.com/#feat=css-snappoints">caniuse</a> for up to date usage.</p>
<h3>Prefixes and deprecations</h3>
<p>It’s important to note as well Safari is using the <code>-webkit-</code> prefix. The properties <code>scroll-snap-points-x</code> and <code>scroll-snap-points-y</code> are deprecated according to <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-snap-points-x">MDN</a>.</p>
<h2>The behaviour</h2>
<p>Scroll snap points should behave quite familiarly. If you scroll or swipe an area that has it enabled, it will snap to the next area, that has been specified in CSS.</p>
<h2>Properties on the scroll container</h2>
<p>There are two types of properties that are necessary for scrolling regions, those on the container and those on the child elements. Some will also have the ability to be used on both the container and child elements.</p>
<h3>Basic CSS required</h3>
<p>Part of making this functionality viable means a base level of CSS will be required for the scroll container.</p>
<h4>Horizontal scroll regions</h4>
<pre><code class="language-css">.scroll-container {
  width: 100vw;
  height: 100vh;
  white-space: nowrap;
  overflow-x: auto; }
</code></pre>
<h4>Vertical scroll regions</h4>
<pre><code class="language-css">.scroll-container {
  width: 100vw;
  height: 100vh;
  overflow-y: auto; }
</code></pre>
<p>Defining a <code>width</code>, <code>height</code> and <code>overflow</code> will give you a basic scrolling area to build upon with snap-points. Additionally if you want it to scroll horizontally, you will need <code>white-space: nowrap</code>.</p>
<h3>scroll-snap-type</h3>
<p>There are 3 values for the snap type, <code>none</code>, <code>mandatory</code> and <code>proximity</code>. <code>none</code> being the more obvious value, in that if there is any snapping, it will be removed. <code>mandatory</code> and <code>proximity</code> allow for different types of snapping behaviour.</p>
<h4>Comparisons</h4>
<p>When using the values <code>mandatory</code> or <code>proximity</code>, I found in Safari it didn’t matter too much, but in Firefox it made a clear difference.</p>
<p><code>mandatory</code> definitely had the more expected snapping behaviour, whereas <code>proximity</code> felt somewhat broken. <code>proximity</code> allows the user to scroll more freely, <code>mandatory</code> doesn’t.</p>
<h4>Differences</h4>
<p>Another difference is, when something happens to content, such as adding, moving, deleting or resizing. <code>mandatory</code> from my understanding will find the snap point again, whereas <code>proximity</code> will remain.</p>
<blockquote>
<p>I imagine this will become more consistent with final implementation.</p>
</blockquote>
<h3>scroll-snap-points-x and scroll-snap-points-y</h3>
<p><strong>These properties only work in Safari</strong>, with the <code>-webkit-</code> prefix. This allows you to define a distance each scroll should snap to, using the <code>repeat()</code> function.</p>
<pre><code class="language-css">.scroll-container {
  scroll-snap-points-x: repeat(100%);
  scroll-snap-points-y: repeat(100%); }
</code></pre>
<p>The value can generally be any unit of measurement, <code>px</code>, <code>em</code>, or <code>vw</code>, to name a few. It’s fairly straightforward, but it’s clear why it was deprecated, which I will get into shortly.</p>
<h3>scroll-snap-destination</h3>
<p>This is the replacement to <code>scroll-snap-points-x</code> and <code>scroll-snap-points-y</code>. It’s setup to be more familiar, like <code>background-position</code>, as in the first value is the <code>x</code> axis and the second is the <code>y</code> axis.</p>
<p>By default the value is <code>0 0</code>, it also accepts the same position values you would expect of <code>background-position</code>. This is the benefit over <code>scroll-snap-points</code>, there isn’t any new syntax to learn.</p>
<p>So with that in mind, once you scroll it will snap to that point within the element. If you were to use 200px as a value, it would snap to the element and an additional 200px.</p>
<div style="margin: 2em 0;">
    <iframe
      height="300"
      style="width: 100%;"
      scrolling="no"
      title="Scroll snap points #1"
      src="https://codepen.io/stevemckinney/embed/Yqvweq?default-tab=result&theme-id=23161&editable=true"
      frameborder="0"
      loading="lazy"
      allowtransparency="true"
      allowfullscreen="true">
    </iframe>
  </div>

<p>I found the behaviour to work strangely, when experimenting with it within Firefox over Safari. If you compare the difference of the demo in either browser, it will become clearer. It feels like you’re forced towards the child elements taking up the whole browser width to work effectively.</p>
<p>Finally, this property you can animate, whereas  <code>scroll-snap-points</code> can’t. That’s for a separate post to explore this capability.</p>
<h3>Summary</h3>
<ul>
<li>The properties mentioned are the minimum needed to get the scrolling behaviour</li>
<li><code>scroll-snap-points-x</code> and <code>scroll-snap-points-y</code> only work in Safari and are being phased out</li>
<li><code>scroll-snap-destination</code> is the replacement</li>
<li>If you want horizontal scrolling extra properties are required</li>
<li>Similarly for vertical, but less is required</li>
</ul>
<pre><code class="language-css">.scroll-container {
  width: 100vw;
  height: 100vh;

  /* Not necessary for overflow-y */
  white-space: nowrap;

  /* Can be overflow-y */
  overflow-x: auto;

  /* Enable scroll snapping */
  scroll-snap-points-x: repeat(100%);
  scroll-snap-points-y: repeat(100%);
  scroll-snap-destination: 0 0; }
</code></pre>
<h2>On the elements</h2>
<p>There are no supported properties, as of yet that are element only.</p>
<h2>All elements</h2>
<p>Currently, there is only one element that will apply to all elements.</p>
<h3>scroll-snap-coordinate</h3>
<p>This property can be applied to child elements too, it’s usage is similar to <code>background-position</code> and you can also pass multiple coordinates.</p>
<pre><code class="language-css">.scroll-container {
  scroll-snap-coordinate: 0 0, center center; }

.scroll-item {
  scroll-snap-coordinate: 240px 240px; }
</code></pre>
<p>To be honest I don’t actually know how this property affected anything. It sounds like the behaviour is similar to <code>scroll-snap-destination</code>. With it being able to be applied to child elements, I would have expected it to align to each differently if specified.</p>
<p>It feels like this property should clash with <code>scroll-snap-destination</code>. I didn’t understand this very well, however it was only mentioned in MDN and supported in Firefox.</p>
<h2>Final demo</h2>
<p>This ended up being the best kind of layout for the most consistent behaviour across browsers that support this.</p>
<div style="margin: 2em 0;">
    <iframe
      height="300"
      style="width: 100%;"
      scrolling="no"
      title="Scroll snap points #2"
      src="https://codepen.io/stevemckinney/embed/qNBPpG?default-tab=result&theme-id=23161&editable=true"
      frameborder="0"
      loading="lazy"
      allowtransparency="true"
      allowfullscreen="true">
    </iframe>
  </div>

<h2>Future properties</h2>
<p>The properties hereon are not currently available in any browser, but the intention is they are going to be part of this module. It may change, until the module is final, that’s where I’ll be keeping this up to date.</p>
<p>Not being able to use them in the browser, means interpreting how they will supposedly work. Which is quite difficult, so I will give a vague overview, particularly focusing on code usage.</p>
<h3>scroll-snap-padding</h3>
<p>This is a scroll container property. It works similarly to regular padding.</p>
<pre><code class="language-css">.scroll-container {
  scroll-snap-padding: 12px;
  scroll-snap-padding: 12px 0; }
</code></pre>
<blockquote>
<p>The <code>scroll-snap-padding</code> property defines the snap alignment container, a region inset from the visual viewport of a scroll container used in calculating its snap positions. The snap alignment container is used as the alignment container when calculating valid snap positions. [^1]</p>
</blockquote>
<h3>scroll-snap-margin</h3>
<p>This is a child element property. It works similar to the regular margin.</p>
<pre><code class="language-css">.scroll-container {
  scroll-snap-margin: 12px;
  scroll-snap-margin: 12px 0; }
</code></pre>
<blockquote>
<p>The scroll-snap-margin property defines the scroll snap margin on elements within a scroll container, used in calculating snap positions for that scroll container.[^2]</p>
</blockquote>
<h3>scroll-snap-align</h3>
<p>This property applies to all elements, using values <code>none</code>, <code>start</code>, <code>end</code> and <code>centre</code>.</p>
<pre><code class="language-css">.scroll-container {
  scroll-snap-align: centre; }
</code></pre>
<blockquote>
<p>The <code>scroll-snap-align</code> property specifies how an element’s scroll snap margin should align with its ancestor scroll container’s snap alignment container. The two values specify the snapping behavior in the x and y axes, respectively. If only one value is specified, the second value defaults to the same value.[^3]</p>
</blockquote>
<h2>Finishing thoughts</h2>
<p>The difficulty in researching some of this CSS module tells me it’s going to go through some changes. Like the CSS shapes and exclusions modules, it’s just the start. There is plenty of room for expansion. Such as animation and control over how it’s interacted with. Animation appears possible in Firefox and with future properties.</p>
<p>You may be put off using such CSS, but without experimenting and looking at new properties. You’re not able to form an opinion and join in the future of CSS. You can also see the difficulty in interpreting some of these properties, and the behaviour not being what you may expect. This type of feedback is helpful for CSS spec writers.</p>
<p>[^1]: <a href="https://www.w3.org/TR/css-snappoints-1/#scroll-snap-padding">Scroll snap padding specification</a>
[^2]: <a href="https://www.w3.org/TR/css-snappoints-1/#scroll-snap-margin">Scroll snap margin specification</a>
[^3]: <a href="https://www.w3.org/TR/css-snappoints-1/#scroll-snap-align">Scroll snap align specification</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Maintenance week #3</title>
      <link>https://iamsteve.me/blog/maintenance-week-3</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/maintenance-week-3</guid>
      <pubDate>Tue, 24 May 2016 06:30:00 GMT</pubDate>
      <description>Maintenance week #3 — fixing bugs, updating grammar, improving older posts, and adding featured images. A rundown of what was done this week.</description>
      <content:encoded><![CDATA[<p>Maintenance weeks are where I detail website tasks, instead of a regular post. I spend time fixing bugs, updating grammar and posts in general, as well as adding featured images. It varies what I will do, and this posts serves as detailing what has been done.</p>
<p>So while it’s not a post that directly gives value, it helps me keep on top of the library of content that I am acquiring.</p>
<h2>Featured images</h2>
<p>The main aim of this week was to try get a few featured images out. It’s something I’m going to make more of a consistent thing, when the redesign is complete. Balancing the redesign and writing content, amongst a full time job and life is very tricky. It means it’s necessary, to devote blocks of time, away from writing, so that I can progress.</p>
<h3>Colour series</h3>
<div className="article-image">
  <img src="/images/blog/colour-series-post-images-011.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<h3>Hero area series</h3>
<div className="article-image">
  <img src="/images/blog/hero-area-post-images-01.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<h3>How to use swatches in Illustrator</h3>
<div className="article-image">
  <img src="/images/blog/use-swatches-01.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<h3>Challenging</h3>
<p>Making featured images is quite challenging. I have focused on doing a quite a few now, during this post and the redesign. Trying to figure out my style and consistency with illustration, is something I’m beginning to nail down.</p>
<p>The more ways I find to illustrate things, my style is going to become clearer. It’s also a challenge to come up with an idea that represents the subject and deliver it in a more timely fashion.</p>
<h2>Misc changes</h2>
<p>Outside of the featured images it was useful to do some other site maintenance.</p>
<h3>Setup for redesign</h3>
<p>In addition to adding featured images, I will have two sets of images for each post. The featured image and a thumbnail, the thumbnails aren’t in use now, but they will once the redesign is complete. So I needed a way to define those ahead of time and begin uploading them now.</p>
<p>Time will tell how maintainable this is, but I like to have particular ‘art directed’ control over my images.</p>
<h3>Twitter card/opengraph meta</h3>
<p>Now that some posts have featured images, it was necessary to get twitter cards and opengraph meta to recognise them too. Images tend to drive more engagement, which may drive more clicks, as and when articles are shared.</p>
<h3>Favicon &amp; touch icons</h3>
<p>Since updating the logo, it has been something I have been intent on doing, but never got round to it. Creating a favicon was relatively quick, as I had already considered it, when making the logo and drawn small sizes. The touch icons are also quick and simple, but do the job.</p>
<h3>Particular markdown links</h3>
<p>I discovered a bug in my particular setup for the way I handle posts in markdown. Links were being parsed incorrectly, in specific cases, that I couldn’t quite pin down. Hence why it’s taken so long to notice.</p>
<p>I spent some time making regular HTML links, then realised how much effort it was. I needed to find a more convenient fix, which I was able to.</p>
<h3>Sequel Pro tool</h3>
<div className="article-image">
  <img src="/images/blog/tools_sequel-pro.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>I missed off Sequel Pro from my tools post. I realised shortly afterwards, I hadn’t added it. <a href="/blog/tools-i-use">Read the updated article</a>.</p>
<h2>That’s it</h2>
<p>Amongst these things progress has slowed getting the redesign done. I have made good progress, much of the homepage is coded, but I need to knuckle down and get a significant amount of posts in the schedule.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>How to: datepicker styling using Illustrator</title>
      <link>https://iamsteve.me/blog/how-to-datepicker-styling-illustrator</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/how-to-datepicker-styling-illustrator</guid>
      <pubDate>Tue, 17 May 2016 06:45:00 GMT</pubDate>
      <description>Part two of designing a datepicker in Illustrator. After the structural basics, this post focuses on styling — clarity, aesthetics, and a better user experience.</description>
      <content:encoded><![CDATA[<p>Following on from the datepicker post where it was more about getting the basics in place and focusing on some important Illustrator techniques that allow for accuracy and efficiency. This post will focus on guiding you through the process of making the datepicker easy to understand and have better aesthetics.</p>
<p>As well as adding the visual style, there will be a few techniques within Illustrator that can make your life easier.</p>
<h2>Download to carry on</h2>
<p>If you want to catch up <a href="https://www.dropbox.com/s/smpvf0ffy2yxnrh/datepicker.ai?dl=0">download the wireframe</a>.</p>
<h2>Picking up from the previous post</h2>
<p>There was very little in the way of visual design done in the previous post, aside from the text. So there are many changes that need to be made to make this easier to understand.</p>
<div className="article-image">
  <img src="/images/blog/datepicker_final.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<h2>What you’ll end up with</h2>
<div className="article-image">
  <img src="/images/blog/datepicker_completed.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>If you want skip the post altogether <a href="https://www.dropbox.com/s/b3vt57d5emnm05z/datepicker-completed.ai?dl=0">download the completed file</a>.</p>
<h2>Preparing the design</h2>
<p>At the moment the visual hierarchy isn’t clear, this is one of the first things I look to improve, then build upon the style further.</p>
<p>These are the following things that will be added or improved:</p>
<ul>
<li>Colour palette</li>
<li>Visually separate the current month area from the dates</li>
<li>Deemphasise the previous and next month days</li>
<li>In turn bring focus to the current month days</li>
<li>Increase the weight of the arrows and reduce size slightly</li>
<li>Hover and selected states</li>
</ul>
<h2>Colour palette</h2>
<p>I&#39;m going to use a simple colour palette made up of 3 colours with a few tints and shades. A blue, green and white.</p>
<figure>
<img src="/images/blog/datepicker_palette.png" alt="" width="738" height="246" style="max-width: 100%; height: auto;" />
<figcaption>
I have numbered the colours for easier reference.
1: #0c464c, 2: #1a626e, 3: #adc9c8, 4: #c9d6d6, 5: #87d4be, 6: #e1f7ee, 7; #ffffff.
</figcaption>
</figure>

<p>The colours complement each other well and will not be too overwhelming for where a datepicker is used. Of course, if you have your own colour palette in mind, I encourage you to use that. It should feel part of the website, but be recognisable once the interaction to show it has happened.</p>
<h2>Deemphasise the previous and next month days</h2>
<p>Firstly you want to select the day numbers of the previous and next months. Once those are selected make them a reasonably light colour. In this case #hex.</p>
<h2>Bring focus to current month days</h2>
<p>Next select the remaining days and make them a darker colour. In this case #hex. Now you should be able to see that it&#39;s clearer to work out which is from the next and previous month.</p>
<h2>Reduce the border prominence</h2>
<p>By doing this it will get rid of the eyesore the current borders, but importantly draw focus back to the numbers themselves.</p>
<h3>Selecting items quickly</h3>
<p>It can be frustrating to have to select so many items and try avoid other items. Fortunately you can select by certain properties.</p>
<p>First select a square, in which the days and boxes behind the days should be grouped together. Double click the group, this should isolate that area.</p>
<div className="article-image">
  <img src="/images/blog/datepicker_same-stroke-fill.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Then in the menu find Select &gt; Same, then choose Fill &amp; Stroke. The relevant items will now be selected.</p>
<h3>Changing the fill and stroke</h3>
<p><strong>Change the fill to white (#ffffff) and the stroke to colour 4 (#c9d6d6</strong>). This will keep the visual separation of the area the days occupy, but not as intense.</p>
<h3>Changing the text colour</h3>
<p>Still in isolation mode, select one of the day numbers. Then again go to Select &gt; Same, this time choosing Fill Color. <strong>Changing their fill to colour 2 (#1a626e)</strong>.</p>
<h3>Reduce prominence of previous and next month</h3>
<p>Now finally here, you need to select the days of the previous month and the next. As there is a smaller amount of them I select them manually.</p>
<p>Once selected change their fill to colour 3 (#adc9c8). Double click the artboard to exit the isolation mode.</p>
<h3>Where you should be</h3>
<div className="article-image">
  <img src="/images/blog/datepicker_days-filled.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<h2>Visually separate the current month area from the dates</h2>
<p>The next step is to work on the area above the days. Select both rectangles that are behind the text and change their fill to colour 2 (#1a626e) and their stroke to colour 1 (#0c464c).</p>
<h3>Changing the text/arrow colour</h3>
<p>Select each day of the week and the month, change the fill to colour 3 (#adc9c8). Then select the arrows and change their stroke to colour 3 also (#adc9c8).</p>
<p>There is now a nice contrast between the two areas, aside from a few more refinements, this is almost complete.</p>
<h2>Increase arrow weight</h2>
<p>While the arrows were put in place considering size to an extent, their weight is too thin. Increasing the weight will help make them more visible.</p>
<p>Select both arrows and open the stroke panel. In the menu find Window &gt; Stroke, if you don’t have it open already.</p>
<div className="article-image">
  <img src="/images/blog/datepicker_stroke-updates.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Increase the stroke to 2px and change the cap and corner to round.</p>
<h2>Reduce arrow size</h2>
<p>Change your selection to only having one arrow. Then open the transform panel, in the menu find Window &gt; Transform.</p>
<div className="article-image">
  <img src="/images/blog/datepicker_arrow-transform.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Change your reference point to the middle and make sure you constrain the proportions. After that reduce the height to 12px.</p>
<p>Repeat the process for the other arrow. The weight and sizing of the arrows feels much better now. The reason for this is, the wireframe has a different contrast, dark on light, rather than light on dark.</p>
<h2>Rounding the corners</h2>
<p>For this step it will involve applying rounded corners to the necessary corner most objects.</p>
<div className="article-image">
  <img src="/images/blog/datepicker_round-corners-top.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Open the transform panel, with your shape selected and you should see ‘Rectangle Properties’ below the usual options. Individually add 4px (or a radius you prefer) to the top left and right corners.</p>
<p>Sometimes when selecting an object the options won’t show, I’m not sure why this is. To get around this, you can use the direct selection tool, by pressing <kbd>a</kbd>. Then select an individual point at the corner you want to round.</p>
<figure>
<img src="/images/blog/datepicker_round-tricky.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>
Repeat this for the very last day within the datepicker.
</figcaption>
</figure>

<h2>Hover and selected states</h2>
<p>It’s important that when interacting with a datepicker it’s clear what’s selected and what isn’t. This can be through a mix of background colours, borders, shadows, etc.</p>
<p><strong>Firstly if you haven’t already ungroup the day numbers, by pressing <kbd>cmd</kbd> + <kbd>shift</kbd> + <kbd>g</kbd></strong>.</p>
<h3>Hover state</h3>
<p>For the hover state we’re going to draw a new rounded rectangle with a fill using colour 6 (#e1f7ee). Select the rounded rectangle tool. Which you can get to by clicking and holding the rectangle tool, and a menu should pop out from the toolbar.</p>
<div className="article-image">
  <img src="/images/blog/datepicker_hover-rectangle.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Next, fill using colour 6 (#e1f7ee), then drag the rectangle towards a number of choice. It should be covering the number, to stop this use <kbd>cmd</kbd> + <kbd>[</kbd> until it goes behind the number.</p>
<h4>Aligning to key object</h4>
<p>Then using the <a href="/blog/how-to-datepicker-using-illustrator">technique to align from the previous post</a>. Select both the hover and background shapes. Then open the align panel, in the menu go to Window &gt; Align.</p>
<div className="article-image">
  <img src="/images/blog/datepicker_show-options.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Open the align window, by going to the menu Window &gt; Align. Then you need to click the icon in the top right below the double left arrows to expand the window. Once you have revealed the menu, click ‘Show Options’.</p>
<div className="article-image">
  <img src="/images/blog/datepicker_align-key-object.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>With both objects selected choose ‘Align to Key Object’, then click the background square. The blue border should get thicker, showing that the key object is selected.</p>
<p>Back to the align panel, align the objects by clicking both vertical and horizontal align centre.</p>
<h3>Selected state</h3>
<p>A good selected state should build upon the hover state, for this I’m adding a 1px stroke with colour 5 (#87d4be).</p>
<p>You can do this by duplicating the original square and following the same alignment process. To duplicate an object you can copy and paste in place with <kbd>cmd</kbd> + <kbd>shift</kbd> + <kbd>v</kbd> or selecting the object and holding <kbd>alt</kbd> and dragging.</p>
<h2>That’s it</h2>
<div className="article-image">
  <img src="/images/blog/datepicker_completed.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>If you’re newer to Illustrator, over the course of these two posts hopefully you have learnt a good few techniques that help make designing a bit more efficient.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>How to: datepicker using Illustrator</title>
      <link>https://iamsteve.me/blog/how-to-datepicker-using-illustrator</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/how-to-datepicker-using-illustrator</guid>
      <pubDate>Tue, 10 May 2016 06:45:00 GMT</pubDate>
      <description>How to design a datepicker efficiently in Illustrator. The grid layout makes alignment tricky — this post uses split into grid and align tools to tackle it.</description>
      <content:encoded><![CDATA[<p>In this post I’m going to show you how to make a datepicker efficiently. A reasonably common user interface element, but can be a source of frustration, to make in design applications. Due to the grid, and amount of items in that grid it can be difficult to align everything quickly in an application like Illustrator.</p>
<p>The purpose of this post, is to use it as an opportunity, to show use cases of the split into grid and align tools. If you have ever wondered how to align something in place in Illustrator, read on.</p>
<h2>Feel free to download the document</h2>
<p>This won’t be focusing on the more visual style and implementing hierarchy, in this post, next week I will cover that. If you would like to skip ahead, <a href="https://www.dropbox.com/s/smpvf0ffy2yxnrh/datepicker.ai?dl=0">you can download the template</a>.</p>
<h2>Make a new document</h2>
<p>The first step is to setup a new document, the size isn’t too important, but I’ve made an 800⨉800 web artboard.</p>
<h2>Make the main rectangle</h2>
<p><strong>Press <kbd>m</kbd> or select the rectangle tool</strong>. Then click anywhere on the artboard, you will be presented with a window to add dimensions.</p>
<div className="article-image">
  <img src="/images/blog/datepicker_rectangle-dimensions.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p><strong>Make the rectangle 280⨉240</strong>, you can make this larger if you like, but <strong>the width must be able to be divided by 7 and the height divided by 6</strong>. The values must end up being whole numbers. In this case 280⨉240 each square ends up being 40⨉40.</p>
<h2>Fill the rectangle for visibility</h2>
<p>Your rectangle may have drawn with a black stroke by default, remove that by pressing <kbd>x</kbd>, this should activate selection of the stroke, then press <kbd>/</kbd>.</p>
<div className="article-image">
  <img src="/images/blog/datepicker_illustrator-toolbar.png" alt="" width="738" height="342" style="max-width: 100%; height: auto;" />
</div>

<p>An alternate method is to double click on the fill and choose a colour, then click the fill and box with the red line through it just below.</p>
<h2>Split into grid</h2>
<p>This is such a powerful tool within Illustrator and is by far the quickest method. <strong>Select your rectangle then go to Object &gt; Path &gt; Split into Grid</strong>.</p>
<h3>Add 6 rows and 7 columns</h3>
<div className="article-image">
  <img src="/images/blog/datepicker_split-into-grid.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>As the image demonstrates adding 6 rows and 7 columns allows both the width and height to be 40px.</p>
<h3>Maintain the selection</h3>
<p>One thing that happens when you split into grid, is the amount of similar items it creates. So you will want to press <kbd>cmd</kbd> + <kbd>g</kbd>. This makes it easier to move in the future.</p>
<p>Then with it still selected, add a stroke. This will add visibility for aligning text later on.</p>
<h2>Day numbers</h2>
<p>The basis for the view in this date picker is May, with a view into April and June. This step is quite tedious, but the technique for aligning the numbers should be helpful. At this stage the numbers don’t need to be placed accurately.</p>
<h3>Add text layers and align centre</h3>
<div className="article-image">
  <img src="/images/blog/datepicker_text-center.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>By pressing <kbd>t</kbd> or selecting the type tool, click without dragging and type each number. Once you have added a type layer, open Window &gt; Paragraph. Click ‘Align Centre’ because if any changes to weight or font size are made this should keep them vertically centred.</p>
<div className="article-image">
  <img src="/images/blog/datepicker_day-numbers.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Add 6 numbers of the previous month from 25 to 30, 1 to fill the final day of the first row. As the first day of the month is Sunday, this is most favourable.</p>
<p>Fill in the rest of the days from there with 2–31, and finally the last row will finish with the first 5 days of June. Of course you can pick any month, the day setup will likely differ.</p>
<h3>Aligning the day numbers</h3>
<p>To align each number we’re going to align to key object. This will take some of annoyance out of aligning so many items centrally within boxes.</p>
<div className="article-image">
  <img src="/images/blog/datepicker_show-options.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Open the align window, by going to the menu Window &gt; Align. Then you need to click the icon in the top right below the double left arrows to expand the window. Once you have revealed the menu, click ‘Show Options’.</p>
<div className="article-image">
  <img src="/images/blog/datepicker_align-key-object.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p><strong>Before you skip ahead</strong>, there is a process to doing this. Instead of individually selecting and aligning each item, if you do it by row then or column, you can drastically reduce the amount of clicking you need to do.</p>
<h3>Aligning by row</h3>
<div className="article-image">
  <img src="/images/blog/datepicker_align-by-row.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Select a row of squares and numbers. <strong>With the items selected change align to ‘Align to Key Object’</strong>. Now click a square within the row that you have highlighted. Do this without holding shift, you may have a habit of doing that like myself.</p>
<p><strong>Finally, you can ‘Vertical Align Centre’, in the align panel, repeating this process for each row</strong>.</p>
<h3>Aligning by column</h3>
<div className="article-image">
  <img src="/images/blog/datepicker_align-by-column.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Similarly to aligning by the row select a column, change align to ‘Align to Key Object’. Click a square to make it your key object and click ‘Horizontal Align Centre’ in the align panel. Repeat the process for the remaining columns and you should have everything aligned.</p>
<blockquote>
<p>Maybe you have a quicker way of doing this? <a href="https://twitter.com/irsteve">I’d like to hear</a>.</p>
</blockquote>
<h2>Days of the week</h2>
<p>Press <kbd>m</kbd> to select the rectangle tool, and click the artboard and add a rectangle that is 280⨉24. This will offer a sufficient space for the days of the week. The height of this is debatable, I prefer to make the height smaller, as it’s not the main focus. The next post will cover the finer details on visual hierarchy.</p>
<figure>
<img src="/images/blog/datepicker_days-week.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
<figcaption>You’ll have to truncate the names of each day. I’m using the format of ‘Mon, Tue, Wed,’ it adds extra clarity when scanning.</figcaption>
</figure>

<p>Press <kbd>t</kbd> or select the type tool and add individual type layers for the days of the week. <strong>They should also be aligned centrally like the day numbers and placed very close to the right location</strong>.</p>
<h3>Aligning the days</h3>
<div className="article-image">
  <img src="/images/blog/datepicker_day-alignment.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Now you will want to align each of the days, again the most accurate way to do this would be to align to a key object like earlier.</p>
<p>However, this time you will only need to select a day and one of the day number squares directly below it. After that, in the align panel, choose Align to Key Object. Then click your square to make it the key object. Finally to align the day use ‘Align Horizontal Center’.</p>
<h2>Current month and year</h2>
<div className="article-image">
  <img src="/images/blog/datepicker_current-month.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Now to add another rectangle to accommodate the current month and year, select the rectangle tool, click the artboard and add a rectangle with the size 280⨉32. Position this above the days.</p>
<p>Press <kbd>t</kbd> or select the type tool and add the month and year.</p>
<h2>Next and previous months</h2>
<p>With a datepicker, you will need to navigate months, more often than not. So you will need some arrows, which are reasonably easy to make in Illustrator.</p>
<h3>Making an arrow</h3>
<p>Press <kbd>\</kbd> or select the Line Segment Tool. Click on your artboard and set the length to be 12px with a 0° angle. Repeat this process, and make another line that has a 90° angle.</p>
<h4>Choose a reference point</h4>
<p>Now we need the correct alignment. To do this most accurately, in this particular case you need to select the bottom left reference point. To do this open the transform panel by going to Window &gt; Transform.</p>
<div className="article-image">
  <img src="/images/blog/datepicker_reference-point.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Once you have selected the bottom left reference point your horizontal line should have the same x and y coordinates.</p>
<blockquote>
<p>I use this method because I always find snapping points to be hit and miss. However, you can drag the lines to the correct locations and see how you go, but this technique removes any doubts.</p>
</blockquote>
<h4>Joining and rotating the lines</h4>
<p>Now to make sure both of the lines are part of the same path. Using the direct selection tool (by pressing <kbd>a</kbd>) you can grab both points without selecting the whole path.</p>
<div className="article-image">
  <img src="/images/blog/datepicker_join-path.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>Drag and select the corner where both paths meet. Then right click the points that you have selected and select join.</p>
<div className="article-image">
  <img src="/images/blog/datepicker-rotate.gif" alt="" width="748" height="360" style="max-width: 100%; height: auto;" />
</div>

<p>Now that we have the basic path, it needs rotating. With the path selected, highlight near one the points, and you should see the cursor change. Hold <kbd>shift</kbd>, click and drag until it snaps into the position needed for an arrow.</p>
<h4>Positioning</h4>
<p>Position the arrow to the left side of the datepicker month. Copy the arrow and paste in place with <kbd>cmd</kbd> + <kbd>shift</kbd> + <kbd>v</kbd>. With the arrow still selected nudge it over a bit and rotate until it faces the opposite side. Position on the opposite side to the first arrow.</p>
<h2>Finishing</h2>
<div className="article-image">
  <img src="/images/blog/datepicker_final.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />
</div>

<p>So this is where this post finishes. There is no visual style in this post, the focus has been on the techniques for getting the elements in place. There has been a few things done in laying the groundwork for making it look better and clearer visually.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Illustrator quick tip: export 2x with a 1x canvas</title>
      <link>https://iamsteve.me/blog/illustrator-export-2x-with-a-1x-canvas</link>
      <guid isPermaLink="true">https://iamsteve.me/blog/illustrator-export-2x-with-a-1x-canvas</guid>
      <pubDate>Mon, 02 May 2016 06:30:00 GMT</pubDate>
      <description>Designing at 1x in Illustrator is fine for vectors, but exporting PNG files at retina sizes is a pain. This quick tip shows how to export 2x PNGs from a 1x canvas.</description>
      <content:encoded><![CDATA[<blockquote>
<p>This method is no longer relevant with Illustrator CC export for screens.</p>
</blockquote>
<p>So you use Illustrator for designing websites, and that could be because you’re on a retina screen and Illustrator is vector. So you can design at 1x and it not matter, at least that’s the case for me. However, when it comes to exporting it’s a pain, you can use ‘Save to Web’ and increase the size to 200%, but that’s tedious. You know <a href="/blog/three-ways-to-export-svg-in-illustrator">how to export SVG</a>, but exporting PNG files is the issue at retina sizes. In this post I will show you how to overcome that.</p>
<p>Previously covering ways of exporting SVG in Illustrator led me to realise, that it’s actually not readily apparent how to export at 2x or other higher density sizes. If you need to export PNG files it’s not as convenient as Photoshop’s generator functionality. This quick tip will show you how to work around the lack of generator style functionality in Illustrator.</p>
<h2>Using export</h2>
<p>Export is part of Adobe Illustrator CC, if you don’t have that then skip to the ’Save As’ section. To export a set of artboards at a larger size, you follow the regular path of using export.</p>
<p>To export press <kbd>cmd</kbd> + <kbd>alt</kbd> + <kbd>e</kbd> or go to file &gt; export.</p>
<h3>Use artboards</h3>
<p>You will be presented with a window to choose your file name and location. <strong>Modify this as necessary, then select ’Use Artboards’</strong>.</p>
<img src="/images/blog/export-2x-png-post-image_use-artboards.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />

<h3>Changing the resolution</h3>
<p><strong>This next step is the most important</strong>, as this is what allows us to export at a different size. The dropdown menu has a few options, <strong>in this case you want to select ‘Other’</strong>.</p>
<img src="/images/blog/export-2x-png-post-image_ppi.png" alt="" width="738" height="492" style="max-width: 100%; height: auto;" />

<p>In the ppi field add 144. The current resolution is Screen 72 ppi, so with doubling it, this will get you the 2x size. </p>
<h2>Things to watch out for</h2>
<p>If you have any images, if they are at their maximum size in the file they will be scaled up. So their quality may appear poorer in the 2x version. The way to get round this is to make sure the images are large enough and resize them down. </p>
<p>That‘s everything, an easy to overlook part of the process of exporting in Illustrator.</p>
]]></content:encoded>
    </item>
    
  </channel>
</rss>