<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Design on Ivan: Thinking</title>
    <link>https://ivanthinking.net/tags/design/</link>
    <description>Recent content in Design on Ivan: Thinking</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 07 Apr 2026 15:27:20 -0700</lastBuildDate>
    <atom:link href="https://ivanthinking.net/tags/design/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Seafoam Green</title>
      <link>https://ivanthinking.net/2026/04/07/seafoam-green/</link>
      <pubDate>Tue, 07 Apr 2026 15:27:13 -0700</pubDate>
      <guid>https://ivanthinking.net/2026/04/07/seafoam-green/</guid>
      <description>&lt;p&gt;From &lt;a href=&#34;https://bethmathews.substack.com/p/why-so-many-control-rooms-were-seafoam&#34;&gt;Why So Many Control Rooms Were Seafoam Green&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;With the increase in wartime production in the US during WWII, Birren and DuPont created a master color safety code for the industrial plant industry, with the aim of reducing accidents and increasing efficiency within plants. These color codes were approved by the National Safety Council in 1944 and are now internationally recognized, having been mandatory practice since 1948. The color coding went as such:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Design in Mega Man X</title>
      <link>https://ivanthinking.net/2026/04/05/design-in-mega-man-x/</link>
      <pubDate>Sun, 05 Apr 2026 23:12:30 -0700</pubDate>
      <guid>https://ivanthinking.net/2026/04/05/design-in-mega-man-x/</guid>
      <description>&lt;p&gt;This &lt;a href=&#34;https://www.youtube.com/watch?v=8FpigqfcvlM&#34;&gt;analysis of Mega Man X by Sequelitis&lt;/a&gt; has stuck in my mind since I first saw it. I often come back to it to remind myself about designing great experiences and products.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Uncomfortable Design</title>
      <link>https://ivanthinking.net/2026/03/21/uncomfortable-design/</link>
      <pubDate>Sat, 21 Mar 2026 03:31:43 +0000</pubDate>
      <guid>https://ivanthinking.net/2026/03/21/uncomfortable-design/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.inconspicuous.info/p/the-pleasures-of-poor-product-design&#34;&gt;The Uncomfortable&lt;/a&gt; is like the opposite of &lt;a href=&#34;https://en.wikipedia.org/wiki/The_Design_of_Everyday_Things&#34;&gt;The Design of Everyday things&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Coding&#39;s the Easy Part</title>
      <link>https://ivanthinking.net/2026/03/19/codings-the-easy-part/</link>
      <pubDate>Thu, 19 Mar 2026 05:49:58 +0000</pubDate>
      <guid>https://ivanthinking.net/2026/03/19/codings-the-easy-part/</guid>
      <description>&lt;p&gt;Computer programming is really about communication: communicating with the machine, yes, of course — but if you’re not just coding but making an app, as I am, it’s mostly about designing the app so that it communicates with the user. So that it’s easy to understand and fun to use.&lt;/p&gt;&#xA;&lt;p&gt;Coding’s the easy part — making a useful app that people like is the challenge and is such a reward when it works. Like any other popular art form, it’s about connecting with humans.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Anduril 1: UI Diagram/Flowchart</title>
      <link>https://ivanthinking.net/2021/05/18/anduril-1-ui-diagram/flowchart/</link>
      <pubDate>Tue, 18 May 2021 22:35:18 -0700</pubDate>
      <guid>https://ivanthinking.net/2021/05/18/anduril-1-ui-diagram/flowchart/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://ivanthinking.net/tags/anduril-ui/&#34;&gt;Anduril UI&lt;/a&gt;, developed by &lt;a href=&#34;http://toykeeper.net/&#34;&gt;ToyKeeper&lt;/a&gt;, has an impressive set of features. To&#xA;be able to access all these features, you&amp;rsquo;ll need to familiarize yourself&#xA;with the UI.&lt;/p&gt;&#xA;&lt;div id=&#34;table-of-contents-box&#34;&gt;&#xA;  &lt;strong&gt;Table of Contents&lt;/strong&gt;&#xA;  &lt;nav id=&#34;TableOfContents&#34;&gt;&#xA;  &lt;ul&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#standard-anduril-1-diagram&#34;&gt;Standard Anduril 1 Diagram&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#alternative-anduril-1-ui-diagram-by-ushiftypoo&#34;&gt;Alternative Anduril 1 UI Diagram by u/shiftypoo&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#alternative-anduril-1-ui-diagram-by-ucontainerfan&#34;&gt;Alternative Anduril 1 UI Diagram by u/containerfan&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;#anduril-1-ui-diagram-for-blf-lt1&#34;&gt;Anduril 1 UI Diagram for BLF LT1&lt;/a&gt;&lt;/li&gt;&#xA;  &lt;/ul&gt;&#xA;&lt;/nav&gt;&#xA;&lt;/div&gt;&#xA;&lt;h2 id=&#34;standard-anduril-1-diagram&#34;&gt;&#xA;  Standard Anduril 1 Diagram&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#standard-anduril-1-diagram&#34;&gt;&#xA;    &lt;i class=&#34;fa fa-link&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;ui-diagram&#34;&gt;&#xA;&lt;a href=&#34;https://ivanthinking.net/images/anduril1/anduril-ui.png&#34;&gt;&lt;img src=&#34;https://ivanthinking.net/images/anduril1/anduril-ui.png&#34; alt=&#34;Anduril UI 1 diagram&#34;/&gt;&lt;/a&gt;&#xA;&lt;em&gt;The standard Anduril UI diagram/flowchart&lt;/em&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;If this seems daunting to you, you may want to check out the &lt;a href=&#34;https://ivanthinking.net/manuals/anduril1-manual/&#34;&gt;Anduril 1 UI&#xA;manual&lt;/a&gt; which should better explain to you how to read this diagram.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Don&#39;t be a liar</title>
      <link>https://ivanthinking.net/2020/11/08/dont-be-a-liar/</link>
      <pubDate>Sun, 08 Nov 2020 14:48:01 -0700</pubDate>
      <guid>https://ivanthinking.net/2020/11/08/dont-be-a-liar/</guid>
      <description>&lt;p&gt;There are few hard rules I apply to software development. But this I can stand behind:&#xA;&lt;strong&gt;Don&amp;rsquo;t be a liar.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;There is never a good reason.&lt;/p&gt;&#xA;&lt;p&gt;If your code is lying to me, I don&amp;rsquo;t know what else in your code I can trust.&#xA;As trust in a project&amp;rsquo;s code slowly degrades, so does developer effectiveness and happiness.&#xA;You really have no reason to lie with your code. And each lie builds on the&#xA;next to create a seriously big pile of poo.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Adding an Instructional Overlay for first time users to your app in iOS</title>
      <link>https://ivanthinking.net/2020/05/16/adding-an-instructional-overlay-for-first-time-users-to-your-app-in-ios/</link>
      <pubDate>Sat, 16 May 2020 13:04:01 -0700</pubDate>
      <guid>https://ivanthinking.net/2020/05/16/adding-an-instructional-overlay-for-first-time-users-to-your-app-in-ios/</guid>
      <description>&lt;p&gt;Sometimes called &lt;em&gt;Coachmarks&lt;/em&gt;, a &lt;em&gt;Wizard&lt;/em&gt;, or an &lt;em&gt;Onboarding Flow&lt;/em&gt;, this common UX pattern is used to guide first time users to an app on its features in your UI.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&#xA;  &lt;img class=&#34;page-img&#34; src=&#34;https://ivanthinking.net/images/software-dev/coach-marks01.png&#34; alt=&#34;Instructional Overlay&#34;  /&gt;&#xA;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Here’s a quick and simple way to implement this pattern:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;buildButton&lt;/span&gt;(with title: String) -&amp;gt; UIButton {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; button = UIButton(type: .system)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    button.backgroundColor = .systemOrange&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    button.setTitle(title, &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;: .normal)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; button&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;override&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;viewDidLoad&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;super&lt;/span&gt;.viewDidLoad()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; buttonText = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Put me in coach!&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; button = buildButton(with: buttonText)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    button.translatesAutoresizingMaskIntoConstraints = &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; overlay = UIView(frame: .zero)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    overlay.translatesAutoresizingMaskIntoConstraints = &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    overlay.backgroundColor = UIColor.black.withAlphaComponent(&lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; coachButton = buildButton(with: buttonText)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    coachButton.translatesAutoresizingMaskIntoConstraints = &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    coachButton.isUserInteractionEnabled = &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; coachLabel = UILabel(frame: .zero)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    coachLabel.translatesAutoresizingMaskIntoConstraints = &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    coachLabel.textColor = .white&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    coachLabel.text = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Get player in the game&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    view.addSubview(button)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    view.addSubview(overlay)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    view.addSubview(coachButton)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    view.addSubview(coachLabel)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    NSLayoutConstraint.activate([&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        button.centerXAnchor.constraint(equalTo: &lt;span style=&#34;color:#66d9ef&#34;&gt;self&lt;/span&gt;.view.centerXAnchor),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        button.centerYAnchor.constraint(equalTo: &lt;span style=&#34;color:#66d9ef&#34;&gt;self&lt;/span&gt;.view.centerYAnchor),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        coachButton.centerXAnchor.constraint(equalTo: button.centerXAnchor),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        coachButton.centerYAnchor.constraint(equalTo: button.centerYAnchor),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        coachLabel.centerXAnchor.constraint(equalTo: coachButton.centerXAnchor),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        coachLabel.centerYAnchor.constraint(equalTo: coachButton.bottomAnchor, constant: &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        overlay.topAnchor.constraint(equalTo: &lt;span style=&#34;color:#66d9ef&#34;&gt;self&lt;/span&gt;.view.topAnchor),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        overlay.bottomAnchor.constraint(equalTo: &lt;span style=&#34;color:#66d9ef&#34;&gt;self&lt;/span&gt;.view.bottomAnchor),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        overlay.leftAnchor.constraint(equalTo: &lt;span style=&#34;color:#66d9ef&#34;&gt;self&lt;/span&gt;.view.leftAnchor),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        overlay.rightAnchor.constraint(equalTo: &lt;span style=&#34;color:#66d9ef&#34;&gt;self&lt;/span&gt;.view.rightAnchor),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The idea here is that you have a duplicate button on top of a semi-transparent overlay. We use Auto Layout to constrain &lt;code&gt;coachButton&lt;/code&gt; to the real &lt;code&gt;button&lt;/code&gt;, and we also disable  &lt;code&gt;isUserInteractionEnabled&lt;/code&gt; since we don’t actually want the user to be able to select it in this flow.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
