<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://toucaan.com/blog</id>
    <title>Toucaan CSS Framework Blog</title>
    <updated>2024-01-15T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://toucaan.com/blog"/>
    <subtitle>Toucaan CSS Framework Blog</subtitle>
    <icon>https://toucaan.com/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Breaking Down CSS.]]></title>
        <id>https://toucaan.com/blog/css-modules</id>
        <link href="https://toucaan.com/blog/css-modules"/>
        <updated>2024-01-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[---]]></summary>
        <content type="html"><![CDATA[<hr>
<p>Raise your hands if you love the notched iPhones and Google Pixel. 🙋‍♀️🙋‍♂️</p>
<br>
<img src="https://raw.githubusercontent.com/marvindanig/assets/master/notch.png" alt="Notched iPhones are in!">
<br>
<br>
<p>Okay. Not many hands went up there, but I am sure, as a web developer or designer, you wouldn't you like some extra real estate for your app?  A beautiful edge-to-edge "bezel less" display—well, almost—makes the notch not appear as a quirk for most users.</p>
<p>At least to me, the notch hasn't been an issue so far. I mean in portrait orientation.</p>
<p>As long as I am surfing the web in portrait mode, most websites look okay and work great, and the notched bezel doesn't appear on my list of nits to fret about.</p>
<br>
<img src="https://raw.githubusercontent.com/marvindanig/assets/master/notch-portrait.png" width="100%" alt="Notch on Dev.to in portrait!">
<br>
<br>
<p>It is the landscape mode, however, where the notch pokes me in the eye.</p>
<p>Take a look at The Dev Blog site, for example:</p>
<br>
<img src="https://raw.githubusercontent.com/marvindanig/assets/master/notch-landscape-landscape-devblog.png" width="100%" alt="Safe gutters on dev.to">
<br>
<br>
<p>You will immediately notice that the header ends abruptly on both ends in a broken floating way. My designer's soul feels this is a bug in the layout.</p>
<p>However, what's worse is that the layout breaks even when the width of the header element is specified 100%. Yes, this is one of those weird instances of implementation where things don't work as expected by the end-user or follow the spec. Does setting 100% width on the screen no longer mean 100% of the screen anymore?</p>
<p>Is 100% width restricted to a "safe area"?</p>
<p>While I rarely read The Dev Blog with my phone in landscape orientation, the situation is worse for YouTube. A thick red header broken at the edges looks horrible. And most of the time, I view videos on my phone in landscape orientation.</p>
<br>
<img src="https://raw.githubusercontent.com/marvindanig/assets/master/notch-landscape-landscape-youtube.png" width="100%" alt="Default gutters on youtube.com">
<br>
<br>
<p>This bug bothers me more on YouTube because videos are generally best viewed in fullscreen and landscape mode. And every time a video ends, this glaring header bug in blood red color shows itself at the top of the page. I wouldn't blame YouTube for missing out on this issue because they <em>did</em> set the width to 100% on their css. It's the implementation of iOS Safari that doesn't meet the specs on the notched phones.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-solution">A Solution<a href="https://toucaan.com/blog/css-modules#a-solution" class="hash-link" aria-label="Direct link to A Solution" title="Direct link to A Solution" translate="no">​</a></h2>
<p>TBF, Apple adds an extra blank gutter area on both sides of the webpage to avoid content getting obscured by the notch. The area between the gutters is called the <em>safe area</em> as mentioned earlier in the post.</p>
<p>Given that Apple has forced this change despite its failing spec and the general assumptions about how widths work in css, now the question is how to handle the notch correctly for your website. And can we do it without hacks or tricks like testing for the safe area margin?</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Update: August 15, 2023</div><div class="admonitionContent_BuS1"><p>The latest iPhones come with an island instead of a notch. I don't particularly like having a hard black blot floating around my apps or websites, but this is Apple and Apple's design language lately. As small <em>voiceless</em> developers, we can only adapt our designs around the notch or away from the island and continue to give it our best shot.</p></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Update: March 9, 2020</div><div class="admonitionContent_BuS1"><p>The meta tag for the notched phones isn't enough anymore. Apple now recommends using a <code>@supports(padding:max(0px)) { env() }</code> query detection to fix the notched environment for your website on iOS Safari (iPhones). I hate them for doing this, but this is the only way to tackle the notch on the newest iPhones.</p><p>Also, the notch cannot be fiddled with on the iOS Google Chrome browser or the iOS Firefox browser at the time of this update.</p></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Update: April 17, 2018</div><div class="admonitionContent_BuS1"><p>Google has announced that Pixel 3 and 4 will carry a notch like the new iPhones. The following blog post explains a simple technique to handle the <em>notch</em> in landscape mode gracefully. No javascript or css hacks are required for this technique to work, so shine away, you crazy diamond!</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enter-viewport-fit-meta-tag">Enter Viewport-Fit Meta Tag!<a href="https://toucaan.com/blog/css-modules#enter-viewport-fit-meta-tag" class="hash-link" aria-label="Direct link to Enter Viewport-Fit Meta Tag!" title="Direct link to Enter Viewport-Fit Meta Tag!" translate="no">​</a></h3>
<p>A simple fix to use all the extra space around the notch is to set the new <code>viewport-fit</code> property like so:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">meta</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">'</span><span class="token tag attr-value" style="color:#e3116c">viewport</span><span class="token tag attr-value punctuation" style="color:#393A34">'</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">content</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">'</span><span class="token tag attr-value" style="color:#e3116c">initial-scale=1, viewport-fit=cover</span><span class="token tag attr-value punctuation" style="color:#393A34">'</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<p>The meta tag above will do the trick and restore the relationship between 100% element width and 100% screen width as per specification.</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token atrule rule" style="color:#00a4db">@supports</span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">padding</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule function" style="color:#d73a49">max</span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule number" style="color:#36acaa">0</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token selector" style="color:#00009f">body</span><span class="token selector punctuation" style="color:#393A34">,</span><span class="token selector" style="color:#00009f"> header</span><span class="token selector punctuation" style="color:#393A34">,</span><span class="token selector" style="color:#00009f"> footer</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">padding-left</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">min</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token unit">vmin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">env</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">safe-area-inset-left</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">padding-right</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">min</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token unit">vmin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">env</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">safe-area-inset-right</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>This query will allow your layout to access the areas behind the notch. Next, to ensure your content doesn't go under the notch either, you can use a container class like so:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token selector class" style="color:#00009f">.content</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">padding</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token unit">px</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">padding-left</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">env</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">safe-area-inset-left</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* Apply safe area */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">padding-right</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">env</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">safe-area-inset-right</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** There are four safe-area padding options:</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">*</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">*   padding: env(safe-area-inset-top)</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">*           env(safe-area-inset-right)</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">*           env(safe-area-inset-bottom)</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">*           env(safe-area-inset-left);</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">****/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>There are four options to handle viewing on all four sides of the phone.</p>
<p>By resetting all four safe-area paddings, one can guarantee a safe area for content no matter how the user holds their phone to view content.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-better-solution">A Better Solution<a href="https://toucaan.com/blog/css-modules#a-better-solution" class="hash-link" aria-label="Direct link to A Better Solution" title="Direct link to A Better Solution" translate="no">​</a></h2>
<p>The safe-area padding <code>insets</code> resolve the issue at hand for the most part. Still, I recommend not using these unique non-standard properties (or hacks if you allow me) explicitly created for the non-rectangular viewport. It is both excess and unmaintainable.</p>
<p>There's a much simpler solution to avoid the content clash with the notch using simple and standards-compliant css properties. We'll use ordinary width definitions per single responsive @media-query, like so:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/* scss snippet */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">orientation</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> portrait</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token selector" style="color:#00009f">body</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token selector class" style="color:#00009f">.shrink</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">width</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">95</span><span class="token unit">%</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">orientation</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> landscape</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token selector" style="color:#00009f">body</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token selector class" style="color:#00009f">.shrink</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">width</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">90</span><span class="token unit">%</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">/* Shrink slightly to avoid the notch. */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.center</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">text-align</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> center</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">margin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> auto</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>That's it. You don't have to use <code>env(safe-area-insets)</code> to arrive at the desired layout and happily maintain just one code for all mobile phones, regardless of whether they are notched. In your HTML, apply the css class <code>.shrink</code> on the <code>&lt;main&gt;</code> container element to make it work across all devices and all viewports for your users. Just one rule to rule it all!</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">header</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">&lt;!--Sticky header with 100% width running across the notched screen --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">header</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">main</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c"> shrink center</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Body here --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">main</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">footer</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Full-screen width under the notch --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">footer</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>I prefer this approach because it helps avoid using non-standard properties (<code>safe-area-insets</code>) for a goal achievable with just standard css. On <a href="https://toucaan.com/" target="_blank" rel="noopener noreferrer" class="">Toucaan</a>, we've adopted this approach as the default.</p>
<p>Several other solutions are floating around the web using JavaScript, but I do not recommend those. CSS is best suited for solving this layout nit.</p>
<br>
<img src="https://raw.githubusercontent.com/marvindanig/assets/master/notch-landscape-cover.jpg" width="100%" alt="Bubblin Superbooks">
<br>
<br>
<br>
<img src="https://raw.githubusercontent.com/marvindanig/assets/master/notch-landscape-landscape-superbook.png" width="100%" alt="Superbook landscape mode">
<br>
<br>]]></content>
        <author>
            <name>Marvin Danig</name>
            <uri>https://github.com/marvindanig</uri>
        </author>
        <category label="css" term="css"/>
        <category label="architecture" term="architecture"/>
        <category label="intrinsic" term="intrinsic"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[The Notched Phone.]]></title>
        <id>https://toucaan.com/blog/handling-the-notch-with-vanilla-css</id>
        <link href="https://toucaan.com/blog/handling-the-notch-with-vanilla-css"/>
        <updated>2023-08-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[---]]></summary>
        <content type="html"><![CDATA[<hr>
<p><em>This article was originally featured on the <a href="https://bubblin.io/scrolls/blog" target="_blank" rel="noopener noreferrer" class="">The Bubblin Blog</a>. It has since been updated and migrated to the Toucaan blog because it is relevant here.</em></p>
<hr>
<p>Raise your hands if you love the notched iPhones and Google Pixel. 🙋‍♀️🙋‍♂️</p>
<br>
<img src="https://raw.githubusercontent.com/marvindanig/assets/master/notch.png" alt="Notched iPhones are in!">
<br>
<br>
<p>Okay. Not many hands went up there, but I am sure, as a web developer or designer, you wouldn't you like some extra real estate for your app?  A beautiful edge-to-edge "bezel less" display—well, almost—makes the notch not appear as a quirk for most users.</p>
<p>At least to me, the notch hasn't been an issue so far. I mean in portrait orientation.</p>
<p>As long as I am surfing the web in portrait mode, most websites look okay and work great, and the notched bezel doesn't appear on my list of nits to fret about.</p>
<br>
<img src="https://raw.githubusercontent.com/marvindanig/assets/master/notch-portrait.png" width="100%" alt="Notch on Dev.to in portrait!">
<br>
<br>
<p>It is the landscape mode, however, where the notch pokes me in the eye.</p>
<p>Take a look at The Dev Blog site, for example:</p>
<br>
<img src="https://raw.githubusercontent.com/marvindanig/assets/master/notch-landscape-landscape-devblog.png" width="100%" alt="Safe gutters on dev.to">
<br>
<br>
<p>You will immediately notice that the header ends abruptly on both ends in a broken floating way. My designer's soul feels this is a bug in the layout.</p>
<p>However, what's worse is that the layout breaks even when the width of the header element is specified 100%. Yes, this is one of those weird instances of implementation where things don't work as expected by the end-user or follow the spec. Does setting 100% width on the screen no longer mean 100% of the screen anymore?</p>
<p>Is 100% width restricted to a "safe area"?</p>
<p>While I rarely read The Dev Blog with my phone in landscape orientation, the situation is worse for YouTube. A thick red header broken at the edges looks horrible. And most of the time, I view videos on my phone in landscape orientation.</p>
<br>
<img src="https://raw.githubusercontent.com/marvindanig/assets/master/notch-landscape-landscape-youtube.png" width="100%" alt="Default gutters on youtube.com">
<br>
<br>
<p>This bug bothers me more on YouTube because videos are generally best viewed in fullscreen and landscape mode. And every time a video ends, this glaring header bug in blood red color shows itself at the top of the page. I wouldn't blame YouTube for missing out on this issue because they <em>did</em> set the width to 100% on their css. It's the implementation of iOS Safari that doesn't meet the specs on the notched phones.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-solution">A Solution<a href="https://toucaan.com/blog/handling-the-notch-with-vanilla-css#a-solution" class="hash-link" aria-label="Direct link to A Solution" title="Direct link to A Solution" translate="no">​</a></h2>
<p>TBF, Apple adds an extra blank gutter area on both sides of the webpage to avoid content getting obscured by the notch. The area between the gutters is called the <em>safe area</em> as mentioned earlier in the post.</p>
<p>Given that Apple has forced this change despite its failing spec and the general assumptions about how widths work in css, now the question is how to handle the notch correctly for your website. And can we do it without hacks or tricks like testing for the safe area margin?</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Update: August 15, 2023</div><div class="admonitionContent_BuS1"><p>The latest iPhones come with an island instead of a notch. I don't particularly like having a hard black blot floating around my apps or websites, but this is Apple and Apple's design language lately. As small <em>voiceless</em> developers, we can only adapt our designs around the notch or away from the island and continue to give it our best shot.</p></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Update: March 9, 2020</div><div class="admonitionContent_BuS1"><p>The meta tag for the notched phones isn't enough anymore. Apple now recommends using a <code>@supports(padding:max(0px)) { env() }</code> query detection to fix the notched environment for your website on iOS Safari (iPhones). I hate them for doing this, but this is the only way to tackle the notch on the newest iPhones.</p><p>Also, the notch cannot be fiddled with on the iOS Google Chrome browser or the iOS Firefox browser at the time of this update.</p></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Update: April 17, 2018</div><div class="admonitionContent_BuS1"><p>Google has announced that Pixel 3 and 4 will carry a notch like the new iPhones. The following blog post explains a simple technique to handle the <em>notch</em> in landscape mode gracefully. No javascript or css hacks are required for this technique to work, so shine away, you crazy diamond!</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enter-viewport-fit-meta-tag">Enter Viewport-Fit Meta Tag!<a href="https://toucaan.com/blog/handling-the-notch-with-vanilla-css#enter-viewport-fit-meta-tag" class="hash-link" aria-label="Direct link to Enter Viewport-Fit Meta Tag!" title="Direct link to Enter Viewport-Fit Meta Tag!" translate="no">​</a></h3>
<p>A simple fix to use all the extra space around the notch is to set the new <code>viewport-fit</code> property like so:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">meta</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">'</span><span class="token tag attr-value" style="color:#e3116c">viewport</span><span class="token tag attr-value punctuation" style="color:#393A34">'</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">content</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">'</span><span class="token tag attr-value" style="color:#e3116c">initial-scale=1, viewport-fit=cover</span><span class="token tag attr-value punctuation" style="color:#393A34">'</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<p>The meta tag above will do the trick and restore the relationship between 100% element width and 100% screen width as per specification.</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token atrule rule" style="color:#00a4db">@supports</span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">padding</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule function" style="color:#d73a49">max</span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule number" style="color:#36acaa">0</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token selector" style="color:#00009f">body</span><span class="token selector punctuation" style="color:#393A34">,</span><span class="token selector" style="color:#00009f"> header</span><span class="token selector punctuation" style="color:#393A34">,</span><span class="token selector" style="color:#00009f"> footer</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">padding-left</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">min</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token unit">vmin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">env</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">safe-area-inset-left</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">padding-right</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">min</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token unit">vmin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">env</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">safe-area-inset-right</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>This query will allow your layout to access the areas behind the notch. Next, to ensure your content doesn't go under the notch either, you can use a container class like so:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token selector class" style="color:#00009f">.content</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">padding</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token unit">px</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">padding-left</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">env</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">safe-area-inset-left</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* Apply safe area */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">padding-right</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">env</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">safe-area-inset-right</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** There are four safe-area padding options:</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">*</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">*   padding: env(safe-area-inset-top)</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">*           env(safe-area-inset-right)</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">*           env(safe-area-inset-bottom)</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">*           env(safe-area-inset-left);</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">****/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>There are four options to handle viewing on all four sides of the phone.</p>
<p>By resetting all four safe-area paddings, one can guarantee a safe area for content no matter how the user holds their phone to view content.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-better-solution">A Better Solution<a href="https://toucaan.com/blog/handling-the-notch-with-vanilla-css#a-better-solution" class="hash-link" aria-label="Direct link to A Better Solution" title="Direct link to A Better Solution" translate="no">​</a></h2>
<p>The safe-area padding <code>insets</code> resolve the issue at hand for the most part. Still, I recommend not using these unique non-standard properties (or hacks if you allow me) explicitly created for the non-rectangular viewport. It is both excess and unmaintainable.</p>
<p>There's a much simpler solution to avoid the content clash with the notch using simple and standards-compliant css properties. We'll use ordinary width definitions per single responsive @media-query, like so:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/* scss snippet */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">orientation</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> portrait</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token selector" style="color:#00009f">body</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token selector class" style="color:#00009f">.shrink</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">width</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">95</span><span class="token unit">%</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">orientation</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> landscape</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token selector" style="color:#00009f">body</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token selector class" style="color:#00009f">.shrink</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">width</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">90</span><span class="token unit">%</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic">/* Shrink slightly to avoid the notch. */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.center</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">text-align</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> center</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">margin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> auto</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>That's it. You don't have to use <code>env(safe-area-insets)</code> to arrive at the desired layout and happily maintain just one code for all mobile phones, regardless of whether they are notched. In your HTML, apply the css class <code>.shrink</code> on the <code>&lt;main&gt;</code> container element to make it work across all devices and all viewports for your users. Just one rule to rule it all!</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">header</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">&lt;!--Sticky header with 100% width running across the notched screen --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">header</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">main</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c"> shrink center</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Body here --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">main</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">footer</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Full-screen width under the notch --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">footer</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>I prefer this approach because it helps avoid using non-standard properties (<code>safe-area-insets</code>) for a goal achievable with just standard css. On <a href="https://toucaan.com/" target="_blank" rel="noopener noreferrer" class="">Toucaan</a>, we've adopted this approach as the default.</p>
<p>Several other solutions are floating around the web using JavaScript, but I do not recommend those. CSS is best suited for solving this layout nit.</p>
<br>
<img src="https://raw.githubusercontent.com/marvindanig/assets/master/notch-landscape-cover.jpg" width="100%" alt="Bubblin Superbooks">
<br>
<br>
<br>
<img src="https://raw.githubusercontent.com/marvindanig/assets/master/notch-landscape-landscape-superbook.png" width="100%" alt="Superbook landscape mode">
<br>
<br>]]></content>
        <author>
            <name>Marvin Danig</name>
            <uri>https://github.com/marvindanig</uri>
        </author>
        <category label="css" term="css"/>
        <category label="web" term="web"/>
        <category label="intrinsic" term="intrinsic"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[The Inch CSS Unit.]]></title>
        <id>https://toucaan.com/blog/meet-the-inch-css-utility-variable</id>
        <link href="https://toucaan.com/blog/meet-the-inch-css-utility-variable"/>
        <updated>2023-07-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[---]]></summary>
        <content type="html"><![CDATA[<hr>
<p><em>This article was originally featured on the <a href="https://bubblin.io/scrolls/blog" target="_blank" rel="noopener noreferrer" class="">The Bubblin Blog</a>. It has since been updated and migrated to the Toucaan blog because it is relevant here.</em></p>
<hr>
<h1>The Standards Way</h1>
<p>Have you ever tried using the <a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Values_and_units" target="_blank" rel="noopener noreferrer" class="">INCH</a> css unit, i.e., <code>in</code>, in your web designs? No?</p>
<p>Well, let's do it today. 🏁</p>
<p>I propose the following bit of code:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/* Somewhere inside the &lt;head&gt; element of your page, add the following: */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@import</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule url function" style="color:#d73a49">url</span><span class="token atrule url punctuation" style="color:#393A34">(</span><span class="token atrule url string url" style="color:#36acaa">'path/to/portrait.css'</span><span class="token atrule url punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">orientation</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> portrait</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@import</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule url function" style="color:#d73a49">url</span><span class="token atrule url punctuation" style="color:#393A34">(</span><span class="token atrule url string url" style="color:#36acaa">'path/to/landscape.css'</span><span class="token atrule url punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">orientation</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> landscape</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>The css above will prioritize and import the desired stylesheet according to the orientation of the viewport. Then on the portrait (or landscape) css, we'll put the inch unit (<code>in</code>) to use like so:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/* portrait.css */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">2</span><span class="token atrule unit" style="color:#00a4db">in</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">/*  Style the smartwatch or tiny viewports with &lt; 2" width. */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">2.000000000001</span><span class="token atrule unit" style="color:#00a4db">in</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">4</span><span class="token atrule unit" style="color:#00a4db">in</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">/* Smartphones and phablets are usually &lt; 4" in width.*/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">4.000000000001</span><span class="token atrule unit" style="color:#00a4db">in</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">8</span><span class="token atrule unit" style="color:#00a4db">in</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">/* Tablets in portrait mode, perhaps…*/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/* and so on…*/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>Do you like what you see?</p>
<p>Wouldn't writing meaningful breakpoints like this be better?</p>
<p>Doesn't the code above just read beautifully? Using breakpoints according to the physical size of the medium? Huh, who could have thought of that?</p>
<p>I think referring to layouts by their physical size is only natural. It would also make it easier for developers and designers to communicate and reference UI with non-developer audiences.</p>
<p>An inch-wide button. A footlong header. 🤠</p>
<p>I know, you must be thinking—but does it even work? Can we use physical inches on css like this?</p>
<p>Well, the answer is both yes and no.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>The <code>--inch</code> Utility Variable</div><div class="admonitionContent_BuS1"><p>Checkout the documentation on the <a class="" href="https://toucaan.com/docs/typography/introduction#case-of-physical-units">--inch</a>.</p></div></div>
<p>Note the <code>in</code> unit (css inch) used in the width-based media query above is <em>already</em> offered by vendors as part of the specification. So <em>yes</em>, using <code>in</code> units like this is valid css. That's for the yes part.</p>
<p>However, even though the code above is valid css and it "works" at the breakpoints specified predictably, the measurement doesn't scale the way we expect it to.</p>
<p>Props if you have already spotted the bug in the code above!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-brief-context">A Brief Context<a href="https://toucaan.com/blog/meet-the-inch-css-utility-variable#a-brief-context" class="hash-link" aria-label="Direct link to A Brief Context" title="Direct link to A Brief Context" translate="no">​</a></h3>
<p>There has been an embarrassing and lingering issue with the web's equivalent of the inch since the early days. The problem stems from how vendors implemented (or could implement) the correlation between an absolute imperial or standard unit like the inch or centimeters <em>and</em> the number of pixels it takes to achieve that physical length.</p>
<p>In other words, css doesn't <em>really</em> know how much an inch is.</p>
<p>Even modern browsers have this issue. A css inch, i.e., <code>1in</code> does not equal a real physical inch you and I know of and use regularly. Therefore, specifying  <code>width: 1in;</code> on your stylesheet doesn't mean the element painted on the DOM will be an inch-wide. Depending on the device, it would likely be shorter (or otherwise) than an inch in width.</p>
<p>A css inch (<code>in</code>) is something else altogether. It varies from device to device and has no reliable value despite the requirement. According to the specification, a css inch, i.e., <code>1in</code>, equals 96px (or 72px for the Mac) or 2.54cm. This mapping between pixels and inches was set (hard-coded) some 30 years ago based on the resolution of existing hardware then.</p>
<p>If we were to believe the original implementation, an Apple Watch would be four inches wide according to css. 384px / 96px ≈ 4in. But we all know this is false. An Apple Watch is just under an inch in width, even though its pixel resolution is close to the resolution of the original iPhone.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>A Time Capsule</div><div class="admonitionContent_BuS1"><p>The last commit establishing the relationship between an inch and pixels, i.e., to 96px (or 72px on the Mac), was pushed in the early 1980s, during the age of CRT monitors. We're literally in a time capsule here! Can you imagine how long this bug has denied us the opportunity to use physical units for digital layouts? Almost four decades! 🔥</p></div></div>
<p><img decoding="async" loading="lazy" alt="The Utterly Horrible Truth About Absolute Units in CSS" src="https://toucaan.com/assets/images/inch-moz-9903a8260e108c8c51f2192c1bae9eec.jpg" width="2323" height="1388" class="img_ev3q"></p>
<p>The browser doesn't know how much an inch is in absolute terms. It never <em>tests</em> for the actual size of the pixel rendered on the viewport.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>A 2011 Update of CSS Standards</div><div class="admonitionContent_BuS1"><p>"In the past, CSS required that implementations display absolute units correctly, even on computer screens. But as the number of incorrect implementations outnumbered the correct ones, and the situation didn't seem to improve, CSS abandoned that requirement in 2011. Currently, absolute units must work correctly only on printed output and on high-resolution devices." <a href="https://www.w3.org/Style/Examples/007/units.en.html" target="_blank" rel="noopener noreferrer" class="">Reference.</a></p></div></div>
<p>Yet, the committee did not define "high resolution" in its last update. Since low-end printers resolve at a minimum of 300 dpi, and high-end screens are close to 200 dpi in resolution today, the cut-off is probably somewhere in between.</p>
<p>The note concluded with the following recommendation from the committee:</p>
<p>"…if you are designing for print, use physical units (in/mm), but if you are designing for the online medium, use <code>px</code>, <code>em</code>, or percentages."</p>
<p>But this was in 2011. More than a decade ago.</p>
<p>What about now? Has anything changed in 2023?</p>
<h1>The New Way of The CSS Variables</h1>
<p>Let's use one of the finest frontiers of modern-day css, <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties" target="_blank" rel="noopener noreferrer" class="">CSS Custom Properties or CSS Variables</a> to teach some standard units to the browser.</p>
<p>The good thing is that the browsers already know a little about it; we only have to bring them up to speed. Let's declare a variable <code>--inch</code> at the <code>:root,</code> like so:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token selector pseudo-class" style="color:#00009f">:root</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--inch</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">96</span><span class="token unit">px</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>We start with the <code>in</code> to <code>px</code> mapping per the specs above.</p>
<p>But I am writing this article on a 15" Retina Macbook Pro (2017). Since a retina(😬) display packs more pixels per inch than 96, the css inch, i.e., <code>width: 1in</code> on my computer, is shorter than the absolute measure.</p>
<p>To add support for retina displays:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token selector pseudo-class" style="color:#00009f">:root</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--inch</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">96</span><span class="token unit">px</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">resolution</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">192</span><span class="token atrule unit" style="color:#00a4db">dpi</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">-webkit-device-pixel-ratio</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">2</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token selector pseudo-class" style="color:#00009f">:root</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token variable" style="color:#36acaa">--inch</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">130</span><span class="token unit">px</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* Tested using a physical ruler [^1] */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Now the <code>--inch</code> utility variable specified on our layout will scale correctly. And it would do so on all the 20 million odd MBPs with the same hardware at best/default resolution. Yay! 🥳</p>
<p>We now have a better <code>--inch: pixels</code> mapping for a machine like mine.</p>
<p>Notice that by using an inch: pixel mapping, we <em>inform</em> the browser about how much an inch is in absolute terms here. We can continue to add hardware-specific <code>--inch: pixels</code> mappings for different mediums and combine those mappings with our existing knowledge of media queries to extend and refine further support.</p>
<p>For example:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">320</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">/* Small screen, non-retina */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">-webkit-min-device-pixel-ratio</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">2</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">320</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">,</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db"></span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min--moz-device-pixel-ratio</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">2</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db">      </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">320</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">,</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db"></span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-device-pixel-ratio</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">2</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">320</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">,</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db"></span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-resolution</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">192</span><span class="token atrule unit" style="color:#00a4db">dpi</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">320</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">,</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db"></span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-resolution</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">2</span><span class="token atrule unit" style="color:#00a4db">dppx</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">320</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">/* Small retina screen that overrides the mapping above */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/* and so on…*/</span><br></span></code></pre></div></div>
<p>That's it.</p>
<p>With css custom properties, we can easily supply the necessary hardware-specific mappings to the browser and then use physical inches to do our layouts. It not only scales well but is also so much more readable.</p>
<p>Given that css is all about finding a compromise to serve the maximum number of users, we can start, at least consider, using standard units for web design within an acceptable margin of error. Perhaps we may even reconcile the trade of print design and digital someday!</p>
<p>I created a tiny <a href="https://github.com/Toucaan/--inch" target="_blank" rel="noopener noreferrer" class="">Utility Variable</a> called <code>--inch</code> that supports several commonly available devices. Feel free to submit PR to add new mappings if your hardware+browser combination isn't already included.</p>
<p>:::warn Disclaimer
Now it's time to state the obvious: As far as disclaimers can go, I must explicitly state here that this article and its accompanying library is an exploratory exercise. It is probably not fit for use in production yet.
:::</p>
<p>[^1] I tested it using a <a href="https://www.amazon.com/hand2mind-Flexible-Safe-T-Plastic-Beginner/dp/B01J8K0ZS4/ref=asc_df_B01J8K0ZS4/" target="_blank" rel="noopener noreferrer" class="">5th Grade Ruler</a>. 🥳</p>]]></content>
        <author>
            <name>Marvin Danig</name>
            <uri>https://github.com/marvindanig</uri>
        </author>
        <category label="physical" term="physical"/>
        <category label="web" term="web"/>
        <category label="design" term="design"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Design Websites for The Apple Watch]]></title>
        <id>https://toucaan.com/blog/web-design-for-the-apple-watch</id>
        <link href="https://toucaan.com/blog/web-design-for-the-apple-watch"/>
        <updated>2023-06-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[---]]></summary>
        <content type="html"><![CDATA[<hr>
<p><em>This article was originally featured on the <a href="https://bubblin.io/scrolls/blog" target="_blank" rel="noopener noreferrer" class="">The Bubblin Blog</a>. It has since been updated and migrated over to the Toucaan blog because it is relevant here.</em></p>
<hr>
<p>One of the capabilities of <a href="https://toucaan.com/" target="_blank" rel="noopener noreferrer" class="">Toucaan</a> is prioritizing and delivering the most <em>intrinsically</em> suitable stylesheet for a smartwatch. Toucaan uses <a class="" href="https://toucaan.com/blog/a-css-router">a css router</a> to accomplish this.</p>
<p>Let's look at what it takes to design a website (or web app) for the <a class="" href="https://toucaan.com/blog/the-new-landscape-of-the-web">tiniest viewport</a> on the web—the Apple Watch.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-watch--the-browser">The Watch &amp; The Browser<a href="https://toucaan.com/blog/web-design-for-the-apple-watch#the-watch--the-browser" class="hash-link" aria-label="Direct link to The Watch &amp; The Browser" title="Direct link to The Watch &amp; The Browser" translate="no">​</a></h3>
<p>If measured in device resolution, the Apple Watch is similar to a mobile phone. A petite Apple Watch (the fifth generation and upwards) resolves to about 324 x 394 pixels. About as much as the first-generation iPhone.</p>
<p><img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/marvindanig/assets/master/viewport-dimensions-apple-watch.jpg" alt="Viewport dimensions of Apple Watch 5" class="img_ev3q"></p>
<p>However, the physical size of the watch is only 40mm—approximately 1.57 inches along the diagonal. Not only is the physical size of the wristwatch small, the time spent glancing through its screen is usually shorter too. Meaning we're dealing with both small physical size and short attention span.</p>
<p><img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/marvindanig/assets/master/apple-watch-viewing-distance.jpg" alt="Viewing distance of an Apple Watch." class="img_ev3q"></p>
<p>Secondly, the viewable or the "light up" area on the watch is only about 1.18" x 1.25". It is also slightly obscured by the rounded bezel around the viewport, depending on the viewing angle and distance from the viewer's eye.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mobile-first-smartwatch-first"><del>Mobile first</del> Smartwatch first.<a href="https://toucaan.com/blog/web-design-for-the-apple-watch#mobile-first-smartwatch-first" class="hash-link" aria-label="Direct link to mobile-first-smartwatch-first" title="Direct link to mobile-first-smartwatch-first" translate="no">​</a></h3>
<p>There are many important things to consider before designing websites for a watch. Chances are that your existing web app or website is responsively designed and is already compatible with the smartwatch. By default, Apple scales down every website to render it in the best possible way.</p>
<p>WatchOS will scale down content by a factor of <code>0.49</code> to ensure every responsively designed page fits the tiny form factor without introducing the horizontal scroll. This default behavior guarantees the existing mobile website to "work" on the watch browser correctly with no extra configuration required from the end user.</p>
<p>However, even mobile UI is usually too complex for the smartwatch. It is better to reduce and optimize your application for the watch separately. Deliver an experience that belongs to the smartwatch instead.</p>
<p>Below are a few tips &amp; potential issues to bear in mind while designing for the Apple Watch.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="practice-extreme-minimalism">Practice Extreme Minimalism<a href="https://toucaan.com/blog/web-design-for-the-apple-watch#practice-extreme-minimalism" class="hash-link" aria-label="Direct link to Practice Extreme Minimalism" title="Direct link to Practice Extreme Minimalism" translate="no">​</a></h3>
<p>The first thing to internalize about an Apple Watch is to admit that showing <em>nothing is better than something</em>. Practice extreme minimalism while designing for smartwatch users.</p>
<p>More generally:</p>
<ul>
<li class="">Display only the most relevant information to the user for which they will raise their hand for a few seconds.</li>
<li class="">If the content is text-heavy, left align the content and HTML elements.</li>
<li class="">Group the UX visually at the center of the screen to help users take action quickly.</li>
<li class="">Use the entire width and height available of the viewport.</li>
<li class="">Design for no more than two outcomes wherever possible.</li>
<li class="">Use native elements of the browser. For example, avoid building a javascript component for a hamburger menu with twenty different options. You might want to keep javascript to a minimum as well.</li>
<li class="">Use <code>aria-labels</code> to help <code>watchOS</code> pick up the correct interface for the end user. The Apple Watch supports several form elements, including the <code>number</code> type (type= "tel"), the <code>date</code> type (type=" date"), and the <code>select</code> input (<code>&lt;select&gt;</code>) type.</li>
<li class="">Unless necessary, avoid comprehensive form submissions via the smartwatch.</li>
<li class="">There is no support for the service-worker api. Meaning no PWA or offline first.</li>
<li class="">No inline video playback. There is no support for videos on the Apple Watch at this time.</li>
<li class="">For images, use a single autoscaling asset with 100% width. Multiple versions of the same image will require sustained HTTP connection and additional disk space. It is, therefore, <strong>not recommended.</strong></li>
</ul>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">img</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">src</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">single)resource_url</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">width</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">100%</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag special-attr attr-name" style="color:#00a4db">style</span><span class="token tag special-attr attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag special-attr attr-value punctuation" style="color:#393A34">"</span><span class="token tag special-attr attr-value value css language-css property" style="color:#36acaa">max-width</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:#393A34">:</span><span class="token tag special-attr attr-value value css language-css number" style="color:#36acaa">100</span><span class="token tag special-attr attr-value value css language-css unit" style="color:#e3116c">%</span><span class="token tag special-attr attr-value value css language-css punctuation" style="color:#393A34">;</span><span class="token tag special-attr attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><br></span></code></pre></div></div>
<ul>
<li class="">The Apple Watch displays in portrait mode only. It may allow displaying in landscape orientation in the future, but Toucaan already accounts for such a future scenario with its <a class="" href="https://toucaan.com/blog/a-css-router">intrinsic css router</a>.</li>
<li class="">The <code>webkit</code> browser on the watch displays contents in fullscreen mode as much as possible. The browser UI (URL bar) is usually hidden away on the top.</li>
<li class="">Using pixels or pixel-based css units like <code>em</code> or <code>rem</code> is not ideal. For example, width-based MQ breakpoints in pixels will fail to distinguish between a mobile and a watch.</li>
<li class="">Practice minimalism to the extreme. Design with only one or two UI elements per page, or your users will experience the "fat finger" inaccessibility.</li>
<li class="">Optimize for both short viewing distance and short attention span. The viewing distance on an Apple Watch is approximately 7 to 12 inches from the viewer's eye. In comparison, a smartphone is viewed at about one and a half feet distance on average.</li>
<li class="">Use <code>--vmin</code> based typography with a large base font size that allows a maximum of 30 characters per line.</li>
<li class="">Always enable pinch-zoom on the watch if your page is text-heavy, even with the decently sized typeface.</li>
<li class="">Avoid using web fonts (Example: Google Fonts) or any hosted typography. Toucaan recommends using the system fonts on the Apple Watch, but this could change as the watch ecosystem matures.</li>
</ul>
<p>Coincidentally, Apple <a href="https://developer.apple.com/design/human-interface-guidelines/watchos/visual-design/display-sizes/" target="_blank" rel="noopener noreferrer" class="">recommends</a> using the relative size and dynamic type to ensure contents fit (expand or contract naturally) the viewport properly. It is excellent because Toucaan uses <a class="" href="https://toucaan.com/blog/intrinsic-typography">intrinsic typography</a> as the default across all mediums.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-watchos-meta-tag">The WatchOS Meta Tag<a href="https://toucaan.com/blog/web-design-for-the-apple-watch#the-watchos-meta-tag" class="hash-link" aria-label="Direct link to The WatchOS Meta Tag" title="Direct link to The WatchOS Meta Tag" translate="no">​</a></h3>
<p>To take control of how your website will appear on the Apple Watch, add the following meta tag on the head of your webpage:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">meta</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">disabled-adaptations</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">content</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">watch</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<p>WebKit will now know it doesn't need to scale down your webpage and will render according to your instructions.</p>
<p>As expected, the form controls on the watch will pop you into fullscreen mode for each input. Labeling your form elements correctly and attaching the appropriate ARIA roles to the fields is essential.</p>
<p>Designing for the Apple Watch is easy. There is only one rule to abide by:</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Adopt extreme minimalism in every situation.</p></div></div>
<p>Now that you understand the watch browser better, you can also design for it.</p>
<hr>
<p>Credit: Super thankful to the incredible <a href="https://bubblin.io/somyagarg-somya-garg" target="_blank" rel="noopener noreferrer" class="">Somya Garg</a> for designing the artwork on the viewing distance from the watch.</p>]]></content>
        <author>
            <name>Marvin Danig</name>
            <uri>https://github.com/marvindanig</uri>
        </author>
        <category label="watch" term="watch"/>
        <category label="website" term="website"/>
        <category label="design" term="design"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[The New Landscape of The Web.]]></title>
        <id>https://toucaan.com/blog/the-new-landscape-of-the-web</id>
        <link href="https://toucaan.com/blog/the-new-landscape-of-the-web"/>
        <updated>2023-06-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[---]]></summary>
        <content type="html"><![CDATA[<hr>
<p><em>This article was originally featured on the <a href="https://bubblin.io/scrolls/blog" target="_blank" rel="noopener noreferrer" class="">The Bubblin Blog</a>. The literature posted below preceded the creation of the Toucaan framework originally.</em></p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-past">The Past.<a href="https://toucaan.com/blog/the-new-landscape-of-the-web#the-past" class="hash-link" aria-label="Direct link to The Past." title="Direct link to The Past." translate="no">​</a></h3>
<p>In the past, like more than fifteen years ago, there used to be just one web. The desktop web. We used to design websites for interaction with the mouse.</p>
<p>Do you remember (or did you ever hear of) the <a href="https://960.gs/" target="_blank" rel="noopener noreferrer" class="">960 grid</a> system? It was one of the latest and the greatest following the <a href="https://clarle.github.io/yui3/" target="_blank" rel="noopener noreferrer" class="">YUI</a>.</p>
<p>Yes, it has been a long time since.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-receding-present">The Receding Present<a href="https://toucaan.com/blog/the-new-landscape-of-the-web#the-receding-present" class="hash-link" aria-label="Direct link to The Receding Present" title="Direct link to The Receding Present" translate="no">​</a></h3>
<p>We got a new web in between. The mobile web. A web we could access while on the go. Smartphones have been the leading force behind the growth and kickstart of the mobile web.</p>
<p>Tablets followed Mobile phones. Now we have a smart wristwatch with a solid web browser on it. We also have electric vehicles that are more of a device than anything else. The desktop monitor itself has evolved with ultra-wide and curved screens. Our phones can unfold into a tablet.</p>
<p>And even the smart TV on the wall sports an excellent web browser, albeit only a few people know about it. It's <em>wild</em>.
Here are the devices that are on the web today:</p>
<ol>
<li class="">The good ol' desktop.</li>
<li class="">Smartphones, of course.</li>
<li class="">Mini tablets &amp; full-sized tablets.</li>
<li class="">Smartphones that unfold into a tablet.</li>
<li class="">Desktops with tablet-like capability (touchscreen).</li>
<li class="">Desktops with ultra-wide/gaming monitors.</li>
<li class="">Smartwatches.</li>
<li class="">Electric vehicles (like the Tesla Model 3/Y).</li>
<li class="">Smart TVs and projectors.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="Distribution complexity of the new web." src="https://toucaan.com/assets/images/landscape-of-web-chart-b26ea0609cc71bb286616cb9f6278ea8.jpg" width="1800" height="650" class="img_ev3q"></p>
<p>As you can see, the web is no longer just a simple desktop or mobile utility. It is a lot more than that. Even the desktop has new intrinsic controls beyond a pointer-driven interface.</p>
<p><img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/marvindanig/assets/master/major-devices.jpg" alt="Major new web devices." class="img_ev3q"></p>
<p>So how does this affect all of us?</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-oncoming-storm-web">The Oncoming <del>Storm</del> Web.<a href="https://toucaan.com/blog/the-new-landscape-of-the-web#the-oncoming-storm-web" class="hash-link" aria-label="Direct link to the-oncoming-storm-web" title="Direct link to the-oncoming-storm-web" translate="no">​</a></h3>
<p>To be clear, we can reach more people directly than at any time in history and do so wherever they are and in the moment. <em>And</em>, we can reach people in more ways than ever before.</p>
<p>User expectations continue to rise while the tech is also slowly consolidating. I think a lot is happening at the same time. One can feel the pressure to deliver and give in to over-engineering easily.</p>
<p>But our old and existing methods do not appear equipped to scale correctly on the new mediums. There are signs of <a href="https://dosgame.club/@MichaelKlamerus/110645309128259571" target="_blank" rel="noopener noreferrer" class="">broken websites</a> all over the old web, both in design and function.</p>
<p>However, there is also good news. The limitation of what was possible on the web has <a href="https://news.ycombinator.com/item?id=33033129" target="_blank" rel="noopener noreferrer" class="">quietly disappeared</a>. I think we are on a new edge of an exciting time to become a web developer and build new solutions from the ground up again.</p>
<p>The new landscape of the web is like a new frontier, a giant canvas, a wilder, wild-wild west waiting to happen. All we have to do is get into the groove and solve. I am super optimistic.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="design-systems--accessibility">Design Systems &amp; Accessibility<a href="https://toucaan.com/blog/the-new-landscape-of-the-web#design-systems--accessibility" class="hash-link" aria-label="Direct link to Design Systems &amp; Accessibility" title="Direct link to Design Systems &amp; Accessibility" translate="no">​</a></h3>
<p>As mentioned earlier, our existing design systems are poorly equipped for the new web. There are subtle differences in how people come across and access information on new surfaces.</p>
<p>For example, the real estate on a smartwatch is <a class="" href="https://toucaan.com/blog/web-design-for-the-apple-watch">barely an inch</a>. Combine that with the low <em>viewing distance</em> from the watch to the viewer's eye (which is just under a foot) and the fact that most users cannot hold their watch up longer than a few seconds at a time—and you'll know that the accessibility situation of a smartwatch is entirely different from anything we've seen or considered before.</p>
<p>The reduction of UX and scale-up of UI for a watch are far beyond the limits of responsive design. We need new rules to deal with the design challenges at that level of miniaturization.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>"The Scale of Web on The Apple Watch."</div><div class="admonitionContent_BuS1"><p>(Estimates vary, but Apple is said to be selling between <a href="http://www.asymco.com/2017/09/25/a-small-screen-ipod/" target="_blank" rel="noopener noreferrer" class="">10 to 20 million</a> watches each year, and all of the new ones sport LTE and a powerful webkit browser.)</p></div></div>
<p>Another device to consider is an EV like the Tesla Model S. The car is web-enabled and sports a modern web browser with a desktop-sized display at the center of the vehicle's console.</p>
<p>But the web accessibility situation in an EV like the Model S is unique.</p>
<p>One, the user is held back by a safety belt in the bucket of their seat.
Two, the moving car limits access even more due to the need to focus on traffic.
Responsive design systems do <em>not</em> even consider such real-world situations. We probably need to discuss these ideas and perhaps add new guidelines for a more solid framework that addresses these issues.</p>
<p>We are in a new terrain altogether. The new web is very different from people on their computers or phones in the quiet of their homes. The new web is also more technically capable and challenging to build for.</p>
<p>While we may not be fully ready to exploit the potential of the new mediums, it is time to put our old methods away and start afresh.</p>
<hr>]]></content>
        <author>
            <name>Marvin Danig</name>
            <uri>https://github.com/marvindanig</uri>
        </author>
        <category label="web" term="web"/>
        <category label="landscape" term="landscape"/>
        <category label="first-principles-thinking" term="first-principles-thinking"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Design Vocabulary]]></title>
        <id>https://toucaan.com/blog/design-vocabulary</id>
        <link href="https://toucaan.com/blog/design-vocabulary"/>
        <updated>2023-05-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[An Observation]]></summary>
        <content type="html"><![CDATA[<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="an-observation">An Observation<a href="https://toucaan.com/blog/design-vocabulary#an-observation" class="hash-link" aria-label="Direct link to An Observation" title="Direct link to An Observation" translate="no">​</a></h3>
<p>We often use the terms <code>width</code> and <code>height</code> to specify the dimensions of an element. These labels, <code>width</code> and <code>height,</code> are almost second nature to the trade of sharing information about a component in web design. Knowing these terms is just as essential and fundamental as it is standardized.</p>
<p>However, by using these colloquial terms of web design, we also make an unwitting assumption:</p>
<blockquote>
<p>That the screen in front of the user is always vertical.</p>
</blockquote>
<p>While this was true back in the day, in the desktop era, when a monitor would sit on the desk, and the display would premise such usage. The viewport of a desktop was always on the vertical plane.</p>
<p>But nowadays, in the 2020s, this assumption is no longer valid. One could lie on the bed, looking at their phone against the ceiling. Or one could be looking down at a phone while driving a car.</p>
<p>Since the viewport of a handheld device is not restricted to displaying content along the vertical plane alone, usage of the labels <code>height</code> and <code>width</code> to reference its dimensions isn't the most ideal.</p>
<p>These labels become invalid when the device is not held vertically.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="better-labels">Better Labels?<a href="https://toucaan.com/blog/design-vocabulary#better-labels" class="hash-link" aria-label="Direct link to Better Labels?" title="Direct link to Better Labels?" translate="no">​</a></h3>
<p>Referring dimensions of an element or the viewport with the words <code>length</code> and <code>breadth</code> appears to work better. The labels remain valid no matter what the orientation of the screen is.</p>
<p><img decoding="async" loading="lazy" alt="Portrait or landscape rectangles" src="https://toucaan.com/assets/images/rectangles-4f68bf19c8a0c9ee99da017e2687ad12.jpg" width="1269" height="720" class="img_ev3q"></p>
<p>Also, we know exactly which side of the element is shorter because the label <code>breadth</code> specifies just that. It correlates better with the orientation of the viewport and has a direct relationship with viewport units like <code>vmin</code> and <code>vmax.</code></p>
<p>Well, they say, naming things is a hard problem.</p>]]></content>
        <author>
            <name>Marvin Danig</name>
            <uri>https://github.com/marvindanig</uri>
        </author>
        <category label="css" term="css"/>
        <category label="vocabulary" term="vocabulary"/>
        <category label="viewports" term="viewports"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Intrinsic Typography]]></title>
        <id>https://toucaan.com/blog/intrinsic-typography</id>
        <link href="https://toucaan.com/blog/intrinsic-typography"/>
        <updated>2023-04-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Scaling the digital type across mediums has always been a difficult problem. In this post, we will talk about an intrinsically scaling typographic system that we have discovered while building our css framework.]]></summary>
        <content type="html"><![CDATA[<p>Scaling the digital type across mediums has always been a difficult problem. In this post, we will talk about an <strong>intrinsically scaling typographic system</strong> that we have discovered while building our <a href="https://toucaan.com/" target="_blank" rel="noopener noreferrer" class="">css framework</a>.</p>
<p>As you'll see, this new system resolves most, if not all, of the challenges faced by a web developer. Let's start by solving this meme first:</p>
<p><img decoding="async" loading="lazy" alt="CSS is Awesome!" src="https://toucaan.com/assets/images/cssisawesome-f6aadf8c651da7e41d5ce85abfbd46bc.jpg" width="600" height="411" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="css-is-awesome">CSS IS AWESOME!<a href="https://toucaan.com/blog/intrinsic-typography#css-is-awesome" class="hash-link" aria-label="Direct link to CSS IS AWESOME!" title="Direct link to CSS IS AWESOME!" translate="no">​</a></h3>
<p>We'll prevent the overflow and scale the type dynamically according to the dimensions of the element.
Consider the following HTML:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">div</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">class</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">box</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">CSS</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">is</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">awesome.</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">p</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">div</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<p>I didn't have to use three separate <code>p</code> tags, but it offered additional control, so I just went with it.</p>
<p>Now we can start applying the styles like so:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">orientation</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> portrait</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token selector pseudo-class" style="color:#00009f">:root</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token variable" style="color:#36acaa">--vmin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">calc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token unit">vw</span><span class="token plain">/</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">orientation</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> landscape</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token selector pseudo-class" style="color:#00009f">:root</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token variable" style="color:#36acaa">--vmin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">calc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token unit">vh</span><span class="token plain">/</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector pseudo-class" style="color:#00009f">:root</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--vmin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token unit">vmin</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>From the code above, you can make out that it is our <a class="" href="https://toucaan.com/blog/orientation-querying-with-switch-media-query">Orientation Query</a>, and it demonstrates the mathematical relationship between the <code>vmin</code> and <code>vw</code>/<code>vh</code> units. <code>vmin</code> continuously points to the shorter side of the rectangular screen no matter what the orientation of viewing is.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="adopting-the-vmin">Adopting the <code>vmin.</code><a href="https://toucaan.com/blog/intrinsic-typography#adopting-the-vmin" class="hash-link" aria-label="Direct link to adopting-the-vmin" title="Direct link to adopting-the-vmin" translate="no">​</a></h3>
<p>From the code above, we can draw the following two axioms:</p>
<blockquote>
<p><strong>1st axiom:</strong></p>
<ul>
<li class=""><code>100vh</code> in landscape mode = <code>100vw</code> in portrait mode.</li>
</ul>
</blockquote>
<blockquote>
<p><strong>2nd axiom:</strong></p>
<ul>
<li class=""><code>vmin</code> is <strong>always</strong> the shorter side of the rectangle.</li>
</ul>
</blockquote>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-test-of-element-squarish-ness">The Test of Element Squarish-ness.<a href="https://toucaan.com/blog/intrinsic-typography#the-test-of-element-squarish-ness" class="hash-link" aria-label="Direct link to The Test of Element Squarish-ness." title="Direct link to The Test of Element Squarish-ness." translate="no">​</a></h4>
<p>The first axiom is very simple. <code>vw</code> and <code>vh</code> units are interrelated and can be swapped easily according to viewport orientation. One can say that device orientation is <em>intrinsic</em> to viewport units.</p>
<p>The second axiom informs that a typographic unit based on the shorter side of the viewport has the lowest variability or delta upon resizing. On the desktop, as the browser window is resized we reach a point where the rectangular orientation switches from landscape to portrait; this is the point, the point of a square viewport, where the <code>vmin</code> unit flips from referring to the value of <code>vh</code> instead of <code>vw</code> since <code>vh</code> becomes the smaller of the two.</p>
<p>And <code>vmin</code> continues to change smoothly with an minimum absolute change reflected in its value. Of course, the <code>vmax</code> unit does the opposite, since it reflects the maximum possible change in the unit value of the resized rectangle.</p>
<p>Returning to the meme problem, we know the box around the text is square. This means that its sides are equal. Also, remember—in the world of resizable rectangles, a square is that geometrical point of inflection where the viewport orientation flips.</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token selector" style="color:#00009f">*</span><span class="token selector punctuation" style="color:#393A34">,</span><span class="token selector" style="color:#00009f"> *</span><span class="token selector pseudo-element" style="color:#00009f">:after</span><span class="token selector punctuation" style="color:#393A34">,</span><span class="token selector" style="color:#00009f"> *</span><span class="token selector pseudo-element" style="color:#00009f">:before</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">box-sizing</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> border-box</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">margin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">padding</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">orientation</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> portrait</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token selector pseudo-class" style="color:#00009f">:root</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token variable" style="color:#36acaa">--vmin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">calc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token unit">vw</span><span class="token plain">/</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">orientation</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> landscape</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token selector pseudo-class" style="color:#00009f">:root</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token variable" style="color:#36acaa">--vmin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">calc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token unit">vh</span><span class="token plain">/</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">/* 100vh of landscape === 100vw of portrait. */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector pseudo-class" style="color:#00009f">:root</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--vmin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token unit">vmin</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--side</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">calc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">50</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--vmin</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* dimensions of the square. */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--border</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">calc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--vmin</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> solid </span><span class="token color">black</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">/* Outline for the square. */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.box</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">width</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--side</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">     </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--side</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">border</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--border</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  … </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>This html and css will paint an empty square box on the page with a thick black border, just as it is on the meme.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="scoping-the-font-size--line-height">Scoping the Font Size &amp; Line Height.<a href="https://toucaan.com/blog/intrinsic-typography#scoping-the-font-size--line-height" class="hash-link" aria-label="Direct link to Scoping the Font Size &amp; Line Height." title="Direct link to Scoping the Font Size &amp; Line Height." translate="no">​</a></h3>
<p>Now let's apply an <em>intrinsic</em> font-size and line-height to the text within the box. To do so, we introduce two new variables, <code>--fs</code> &amp; <code>--lh,</code> for font size and line height, respectively:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token selector" style="color:#00009f">…</span><br></span><span class="token-line" style="color:#393A34"><span class="token selector" style="color:#00009f"></span><span class="token selector pseudo-class" style="color:#00009f">:root</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--vmin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token unit">vmin</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--side</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">calc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">50</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--vmin</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* dimensions of the square. */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--border</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">calc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--vmin</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> solid </span><span class="token color">black</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">/* Outline for the square. */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--fs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">calc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--side</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* Why the number 6, can you tell? */</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--lh</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">calc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--fs</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.box</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">width</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--side</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">     </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--side</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">border</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--border</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  … </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.box</span><span class="token selector" style="color:#00009f"> p</span><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">font-size</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--fs</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">              </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">line-height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--lh</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">   </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>That's it. Our meme is now entirely resolved. And from now on, our community of css lovers can live free from this stain of incapacity css has had for such a long time. 🙏🏻</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dropping-the-orientation-query">Dropping the Orientation Query.<a href="https://toucaan.com/blog/intrinsic-typography#dropping-the-orientation-query" class="hash-link" aria-label="Direct link to Dropping the Orientation Query." title="Direct link to Dropping the Orientation Query." translate="no">​</a></h3>
<p>The complete solution is as follows:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token comment" style="color:#999988;font-style:italic">/* Baseline reset */</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token selector" style="color:#00009f">*</span><span class="token selector punctuation" style="color:#393A34">,</span><span class="token selector" style="color:#00009f"> *</span><span class="token selector pseudo-element" style="color:#00009f">:after</span><span class="token selector punctuation" style="color:#393A34">,</span><span class="token selector" style="color:#00009f"> *</span><span class="token selector pseudo-element" style="color:#00009f">:before</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token property" style="color:#36acaa">box-sizing</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> border-box</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token property" style="color:#36acaa">margin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token property" style="color:#36acaa">padding</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">orientation</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> portrait</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token selector pseudo-class" style="color:#00009f">:root</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token variable" style="color:#36acaa">--vmin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">calc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token unit">vw</span><span class="token plain">/</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">orientation</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> landscape</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token selector pseudo-class" style="color:#00009f">:root</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token variable" style="color:#36acaa">--vmin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">calc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">100</span><span class="token unit">vh</span><span class="token plain">/</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">/* 100vh of landscape === 100vw of portrait. */</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token selector pseudo-class" style="color:#00009f">:root</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--vmin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token unit">vmin</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--side</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">calc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">50</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--vmin</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* dimensions of the square. */</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--border</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">calc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--vmin</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> solid </span><span class="token color">black</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">/* Outline for the square. */</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--fs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">calc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--side</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* Why the number 6, can you tell? */</span><span class="token plain"> </span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token variable" style="color:#36acaa">--lh</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">calc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--fs</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.box</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token property" style="color:#36acaa">width</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--side</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">     </span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token property" style="color:#36acaa">height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--side</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token property" style="color:#36acaa">border</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--border</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  … </span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.box</span><span class="token selector" style="color:#00009f"> p</span><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token property" style="color:#36acaa">font-size</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--fs</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">              </span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token property" style="color:#36acaa">line-height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">var</span><span class="token punctuation" style="color:#393A34">(</span><span class="token variable" style="color:#36acaa">--lh</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">   </span></span><br></span><span class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></span></code></pre></div></div>
<p>If you observe the code above, the orientation query (from lines 8 to 18) isn't doing anything. We can remove it.</p>
<p>With this <code>vmin</code> based solution, the text in the box will scale correctly with sub-pixel accuracy no matter how much we resized the browser or even re-oriented the device. The scaling is so good that not even reflow isn't triggered on any of the modern browsers except maybe on Safari, where it works for the most part but has a little quirky behavior.</p>
<p>Feel free to <a href="https://codepen.io/marvindanig/full/bGGRZdE" target="_blank" rel="noopener noreferrer" class="">test the demo</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://toucaan.com/blog/intrinsic-typography#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h3>
<p>Do you like this technique of scaling content with a simple <code>vmin</code> unit of css? I love the simplicity of this solution and its ability to help us avoid using combination of multiple css units to achieve the same/similar effect. It also helps me avoid using hardcoded media queries, hardcoded <code>clamp(),</code> and the unwieldily syntax of container queries, which requires yet another combination of alternative css units.</p>
<p><code>vmin</code> is simple. And I think <code>vmin</code> can rule the entire space of Intrinsic Typography in the future. What are your thoughts? Have you tried web designing with <code>vmin</code>? If not, that's exactly what we'll talk about in our next post by extending our solution above to a more generic layout. Hang on tightly!</p>
<hr>]]></content>
        <author>
            <name>Marvin Danig</name>
            <uri>https://github.com/marvindanig</uri>
        </author>
        <category label="fit-to-width" term="fit-to-width"/>
        <category label="intrinsic" term="intrinsic"/>
        <category label="typography" term="typography"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Using Git Submodules for Distribution.]]></title>
        <id>https://toucaan.com/blog/using-git-submodule-as-package-distribution-manager</id>
        <link href="https://toucaan.com/blog/using-git-submodule-as-package-distribution-manager"/>
        <updated>2023-04-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Some of you reached out to understand how I was using the git submodules tooling as a package manager for some of my projects, a few of which are private repositories on GitHub. Well, here it is:]]></summary>
        <content type="html"><![CDATA[<p>Some of you reached out to understand how I was using the <a href="https://git-scm.com/book/en/v2/Git-Tools-Submodules" target="_blank" rel="noopener noreferrer" class="">git submodules</a> tooling as a package manager for some of my projects, a few of which are private repositories on GitHub. Well, here it is:</p>
<p>To start, I'm assuming that you have already installed Toucaan inside of your project (<code>MyProject</code>) with the following command:</p>
<div class="language-git codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-git codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> $ cd MyProject/assets/stylesheets/.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> $ git submodule add https://github.com/Toucaan/toucaan</span><br></span></code></pre></div></div>
<p>This command allows the <code>master</code> distribution of Toucaan and its entire <code>git history</code> to sit within the namespace of your project. The installation also attaches a <code>.gitmodules</code> file at the root of the main project with the following contents:</p>
<div class="language-.gitmodules codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-.gitmodules codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[submodule "app/assets/stylesheets/toucaan"]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	path = app/assets/stylesheets/toucaan</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	url = https://github.com/Toucaan/toucaan</span><br></span></code></pre></div></div>
<p>You're required to check-in the <code>.gitmodules</code> file into your project. git uses the <code>.gitmodules</code> file to keep track of all the submodules or dependencies that your project will use.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-a-relative-url">Using A Relative URL<a href="https://toucaan.com/blog/using-git-submodule-as-package-distribution-manager#using-a-relative-url" class="hash-link" aria-label="Direct link to Using A Relative URL" title="Direct link to Using A Relative URL" translate="no">​</a></h3>
<p>By default, the <code>.gitmodules</code> file references its source repository (the master Toucaan repository on GitHub) using an absolute <code>https</code> url.</p>
<p>I usually change this url to a relative one, like so:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[submodule "app/assets/stylesheets/toucaan"]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	path = app/assets/stylesheets/toucaan</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	url = ../toucaan.git 👈🏻</span><br></span></code></pre></div></div>
<p>This allows git authentication with both <code>ssh</code> and <code>https</code>, and it also helps me to point the installed submodule to a private repository within my organization.</p>
<p>Then I sync up all the submodule(s) that project uses and check-in the edited <code>.gitmodules</code> file into the main project. This step ensures that my organization has a full copy of all the submodules of the project privately and also syncs the module with the main repository.</p>
<div class="language-git codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-git codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ git submodule sync</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ git submodule update --init --recursive --remote</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="branch-naming-convention">Branch Naming Convention<a href="https://toucaan.com/blog/using-git-submodule-as-package-distribution-manager#branch-naming-convention" class="hash-link" aria-label="Direct link to Branch Naming Convention" title="Direct link to Branch Naming Convention" translate="no">​</a></h3>
<p>For the Toucaan submodule, I step inside the <code>toucaan</code> folder inside <code>MyProject</code> and create a new branch called <code>MyProject</code> of Toucaan to keep all the app-specific changes relevant to <code>MyProject</code> in that branch.</p>
<p>For example, in our rails app <a href="https://bubblin.io/" target="_blank" rel="noopener noreferrer" class="">Bubblin</a> all submodules have a branch named <code>bubblin</code> to push production level code into. This way, we can leave the <code>master</code> or <code>main</code> branch of the submodule up to the maintainers for updates.</p>
<p>Basically, these steps:</p>
<div class="language-git codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-git codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ cd ./MyProject/assets/stylesheets/toucaan/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">git checkout -b MyProject</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">git remote add MyProject https://github.com/my-organization/toucaan.git </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">git push -u origin MyProject</span><br></span></code></pre></div></div>
<p>Note that <code>MyProject</code> branch is also labeled as the new <code>origin</code> for my <em>instance of</em> the Toucaan submodule.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="managing-remote-repositories">Managing Remote Repositories<a href="https://toucaan.com/blog/using-git-submodule-as-package-distribution-manager#managing-remote-repositories" class="hash-link" aria-label="Direct link to Managing Remote Repositories" title="Direct link to Managing Remote Repositories" translate="no">​</a></h3>
<p>This is what the original remote urls will look like inside the Toucaan submodule upon installation:</p>
<div class="language-git codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-git codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ git remote -v</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">origin	https://github.com/Toucaan/toucaan (fetch)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">origin	https://github.com/Toucaan/toucaan (push)</span><br></span></code></pre></div></div>
<p>Set the origin to your own private repository within your organization:</p>
<div class="language-git codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-git codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ git remote set-url --add --fetch https://github.com/my-organization/toucaan.git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ git remote set-url origin https://github.com/my-organization/toucaan.git</span><br></span></code></pre></div></div>
<p>This will guarantee that all the app-specific downstream changes and additions to the Toucaan submodule will always be saved, and the upstream lifecycle of the FOSS repository remains unaffected.</p>
<p>This is how the remote urls look inside my local submodule afterwards:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ git remote -v</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">MyProject https://github.com/my-organization/toucaan.git (fetch)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">MyProject https://github.com/my-organization/toucaan.git (push)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">origin	https://github.com/my-organization/toucaan (fetch)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">origin	https://github.com/my-organization/toucaan.git (push)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">master	https://github.com/Toucaan/toucaan (fetch)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">master	https://github.com/Toucaan/toucaan (push)</span><br></span></code></pre></div></div>
<p>Developing and maintaining submodules this way offers great freedom in managing the direction of downstream work inside of any submodule, along with access to full history of mainstream FOSS community which may or may not always be aligned with your goals. It also helps keep the footprint of your overall project small and modular with the full power of <code>git</code> to jump to any place on the timeline created by your team or outsiders for each submodule separately.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="recursive-git-config">Recursive Git Config<a href="https://toucaan.com/blog/using-git-submodule-as-package-distribution-manager#recursive-git-config" class="hash-link" aria-label="Direct link to Recursive Git Config" title="Direct link to Recursive Git Config" translate="no">​</a></h3>
<p>For recursive checking and syncing, I have set the following on my local git true just for submodules:</p>
<div class="language-git codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-git codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ git config submodule.recurse true</span><br></span></code></pre></div></div>
<p>So this is how I use the <code>git submodule</code> system to manage and distribute the Toucaan package within my private projects.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="main-advantages">Main Advantages<a href="https://toucaan.com/blog/using-git-submodule-as-package-distribution-manager#main-advantages" class="hash-link" aria-label="Direct link to Main Advantages" title="Direct link to Main Advantages" translate="no">​</a></h3>
<ol>
<li class="">Independence from complicated and unrelated package managers such as <code>npm</code>, <code>yarn</code>, <code>pip</code>, <code>bundler</code> or similar. Good ol' freedom!</li>
<li class="">Access to full history of the submodule both from maintainer's side and your own.</li>
<li class="">Stronger control, better access, and improved maintainability of project internal dependencies. While the repository of the Toucaan submodule lives inside of the project <code>MyProject</code> it still has a separate git history and doesn't "pollute" the git log with the detailed check-ins of the changes made to the submodule.</li>
</ol>
<p>These are few advantages from the top of my head. Are you using <code>git submodules</code> for distribution any differently? Do share your strategy or tips!</p>]]></content>
        <author>
            <name>Marvin Danig</name>
            <uri>https://github.com/marvindanig</uri>
        </author>
        <category label="git" term="git"/>
        <category label="submodules" term="submodules"/>
        <category label="distribution" term="distribution"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[A Modern Baseline.]]></title>
        <id>https://toucaan.com/blog/baseline-css</id>
        <link href="https://toucaan.com/blog/baseline-css"/>
        <updated>2023-03-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[---]]></summary>
        <content type="html"><![CDATA[<hr>
<p><em>This article was originally featured on the <a href="https://bubblin.io/scrolls/blog" target="_blank" rel="noopener noreferrer" class="">The Bubblin Blog</a>.</em></p>
<hr>
<h1>Baselining Reset</h1>
<p>In a previous chapter, we started with a <a href="https://raw.githubusercontent.com/bookiza/toucaan/master/examples/example0.html" target="_blank" rel="noopener noreferrer" class="">blank file</a> to test the responsiveness of an empty page. That worked well, and it was easy enough to implement.</p>
<p>Touch a new file on the disk and <a href="https://raw.githubusercontent.com/bookiza/toucaan/master/examples/example0.html" target="_blank" rel="noopener noreferrer" class="">open</a> it on a browser like Chrome:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ touch example0.html     // Create a new blank file.</span><br></span></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ chrome example0.html    // Open this 0-byte file on your favorite browser.</span><br></span></code></pre></div></div>
<p>Inspect this 0-byte blank page from your browser's console (press <code>⌘+⌥+I</code>). You'll notice a few HTML elements in there, even though the page we loaded into the browser was empty.</p>
<p><img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/marvindanig/assets/master/blank-page.jpg" alt="Blank webpage on the browser window." class="img_ev3q"></p>
<p>Every web browser renders these elements to display a blank webpage correctly. Browsers usually try and "fix" the <code>html</code> on the page because it is in its nature to do so, and they do this quietly.</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- Blank page rendered on desktop Chrome, Firefox, Brave, or Safari. --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">html</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">head</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">head</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">body</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">body</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">html</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<p>In the 'Styles' section (see the screenshot) of your browser's console, notice how the browser also uses a default user-agent <sup><a href="https://toucaan.com/blog/baseline-css#user-content-fn-1-0a5d9a" id="user-content-fnref-1-0a5d9a" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup> stylesheet called the <code>html.css.</code> This file contains the default rules each browser ships with at the source and comes installed with every browser on your machine.</p>
<p>Until a few years ago, it was this <code>html.css</code> file that was the cause of much pain to the front-end community. Cross-browser inconsistencies were the bane of front-end design since each vendor had their own set of defaults that looked or behaved much differently from others.</p>
<p>Thankfully, those days are behind us, and the latest <code>html.css</code> on all modern web browsers is almost as good as a reset itself.</p>
<p>One can argue that <code>html.css</code>—the unset cascade—is practically consistent across the board, and no further <code>reset</code> is required for modern day web-apps.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>"Modern html.css."</div><div class="admonitionContent_BuS1"><p>Modern web browsers have evolved to a point where a heavy-handed reset or a broad normalization is no longer required.</p><p>In this chapter, we have implemented a fundamentally different type of reset by uncovering only the bare minimum ruleset necessary for cross-browser consistency. The new baseline is suitable for all the devices according to the new <a href="https://bubblin.io/blog/the-new-landscape-of-the-web" target="_blank" rel="noopener noreferrer" class="">landscape of the web</a>.</p></div></div>
<p>A light new <a href="https://hankchizljaw.com/wrote/a-modern-css-reset" target="_blank" rel="noopener noreferrer" class="">reset</a> was suggested for blogs by Andy Bell. While this reset is limited in scope for a blog, it establishes that little arm-twisting is required over the browser's initial defaults to develop vendor consistency.</p>
<p>This is excellent news and one of the main reasons we will keep Toucaan's reset a loosely coupled baseline for modern apps of late.</p>
<p>Coming back to the DOM with an empty webpage again, given that there are only three HTML elements required for a webpage to render correctly–to be valid–we will start with baselining Toucaan for only three essential HTML elements that a webpage requires, namely:</p>
<ol>
<li class=""><code>&lt;html&gt;</code> tag or the <strong>:root</strong> element,</li>
<li class=""><code>&lt;body&gt;</code> tag, and the…</li>
<li class=""><code>&lt;head&gt;</code> tag.</li>
</ol>
<p>Since the <code>&lt;head&gt;</code> tag is always set to <code>display: none;</code> there are only two tags, the <code>&lt;body&gt;</code> tag, and the <code>&lt;html&gt;</code> tag, for us to worry about.</p>
<p>Shown below is how we'll structure our new baseline:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Combining baseline with the css router we created in an earlier chapter. */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css atrule rule" style="color:#00a4db">@import</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule url function" style="color:#d73a49">url</span><span class="token style language-css atrule url punctuation" style="color:#393A34">(</span><span class="token style language-css atrule url string url" style="color:#36acaa">'toucaan/portrait/portrait.css'</span><span class="token style language-css atrule url punctuation" style="color:#393A34">)</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule keyword" style="color:#00009f">only</span><span class="token style language-css atrule" style="color:#00a4db"> screen </span><span class="token style language-css atrule keyword" style="color:#00009f">and</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule punctuation" style="color:#393A34">(</span><span class="token style language-css atrule property" style="color:#36acaa">orientation</span><span class="token style language-css atrule punctuation" style="color:#393A34">:</span><span class="token style language-css atrule" style="color:#00a4db"> portrait</span><span class="token style language-css atrule punctuation" style="color:#393A34">)</span><span class="token style language-css atrule punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css atrule rule" style="color:#00a4db">@import</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule url function" style="color:#d73a49">url</span><span class="token style language-css atrule url punctuation" style="color:#393A34">(</span><span class="token style language-css atrule url string url" style="color:#36acaa">'toucaan/landscape/landscape.css'</span><span class="token style language-css atrule url punctuation" style="color:#393A34">)</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule keyword" style="color:#00009f">only</span><span class="token style language-css atrule" style="color:#00a4db"> screen </span><span class="token style language-css atrule keyword" style="color:#00009f">and</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule punctuation" style="color:#393A34">(</span><span class="token style language-css atrule property" style="color:#36acaa">orientation</span><span class="token style language-css atrule punctuation" style="color:#393A34">:</span><span class="token style language-css atrule" style="color:#00a4db"> landscape</span><span class="token style language-css atrule punctuation" style="color:#393A34">)</span><span class="token style language-css atrule punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css atrule rule" style="color:#00a4db">@media</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule keyword" style="color:#00009f">only</span><span class="token style language-css atrule" style="color:#00a4db"> screen </span><span class="token style language-css atrule keyword" style="color:#00009f">and</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule punctuation" style="color:#393A34">(</span><span class="token style language-css atrule property" style="color:#36acaa">orientation</span><span class="token style language-css atrule punctuation" style="color:#393A34">:</span><span class="token style language-css atrule" style="color:#00a4db"> portrait</span><span class="token style language-css atrule punctuation" style="color:#393A34">)</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css selector pseudo-class" style="color:#00009f">:root</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">            </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Portrait variables go here.  */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css atrule rule" style="color:#00a4db">@media</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule keyword" style="color:#00009f">only</span><span class="token style language-css atrule" style="color:#00a4db"> screen </span><span class="token style language-css atrule keyword" style="color:#00009f">and</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule punctuation" style="color:#393A34">(</span><span class="token style language-css atrule property" style="color:#36acaa">orientation</span><span class="token style language-css atrule punctuation" style="color:#393A34">:</span><span class="token style language-css atrule" style="color:#00a4db"> landscape</span><span class="token style language-css atrule punctuation" style="color:#393A34">)</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css selector pseudo-class" style="color:#00009f">:root</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">            </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Landscape variables go here. */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Minimum HTML elements required for a valid webpage. */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css selector" style="color:#00009f">html</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">      </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Some rules here. */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css selector" style="color:#00009f">body</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">      </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Some more rules here. Done. */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>This is it! All of it. This is what our baseline css or reboot would look like.</p>
<p>Everything else, every other HTML tag that your application would use, will require a reset specified elsewhere in the framework (discussed later). Those tags won't be a part of the <a href="https://github.com/Toucaan/toucaan" target="_blank" rel="noopener noreferrer" class="">distribution</a>.</p>
<p>All things considered, a reset's size would depend on the nature of each app. A video hosting site like Youtube will need to reset the <code>video</code> tag, for example, whereas a blog app would reset tags like <code>article,</code> <code>p,</code> and heading tags, and so on.</p>
<p>This is a strategic position that we're flexible about. What are your thoughts on the inclusion/exclusion of other HTML tags on the baseline?
Before you jump to answer this question, have you considered <a href="https://goose.red/content/blog/mobile-apps-with-red-goose/" target="_blank" rel="noopener noreferrer" class="">designing mobile apps with app-like design language</a> and how that would affect the baseline?</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-trends">The Trends<a href="https://toucaan.com/blog/baseline-css#the-trends" class="hash-link" aria-label="Direct link to The Trends" title="Direct link to The Trends" translate="no">​</a></h3>
<p>I suspect there wouldn't be many rules to import, even in the most complicated web applications out there. Our framework provides a place to include watered-down classless reset with the fewest defaults to fulfill any situation. I believe that this will help with both technical debt and the maintainability of the application.</p>
<p>In recent years, I have seen several new smarter resets pop up over the Internet, and each of them, even if not a complete solution, is a red herring to what is on the horizon: We need to discard using the generic normalization techniques and move towards a lighter system that covers the full scope of the new web.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-full-baseline">The Full Baseline<a href="https://toucaan.com/blog/baseline-css#the-full-baseline" class="hash-link" aria-label="Direct link to The Full Baseline" title="Direct link to The Full Baseline" translate="no">​</a></h2>
<p>Below is <code>baseline.css</code> on the Toucaan submodule for your feisty eyes:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">/* Minimal baseline.css with critical css.    */</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css atrule rule" style="color:#00a4db">@charset</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule string" style="color:#e3116c">"UTF-8"</span><span class="token style language-css atrule punctuation" style="color:#393A34">;</span><span class="token style language-css">   </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Recommended reading: https://www.w3.org/International/questions/qa-css-charset.en */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Option 1. Use system fonts */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Option 2. Use 'privacy safe' self-hosted typefaces with subsetting, or use…  */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css atrule rule" style="color:#00a4db">@font-face</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">font-family</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css string" style="color:#e3116c">"Font Family"</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">src</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css url function" style="color:#d73a49">url</span><span class="token style language-css url punctuation" style="color:#393A34">(</span><span class="token style language-css url" style="color:#36acaa">data:font/opentype;base64, _font_subsetted_string_</span><span class="token style language-css url punctuation" style="color:#393A34">)</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">font-style</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> normal</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">font-weight</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:#36acaa">300</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Option 3. Hosted typefaces such as from Google Fonts. */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css atrule rule" style="color:#00a4db">@import</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule url function" style="color:#d73a49">url</span><span class="token style language-css atrule url punctuation" style="color:#393A34">(</span><span class="token style language-css atrule url" style="color:#36acaa">https://fonts.googleapis.com/css?family=Font+Family:300,300i&amp;display=swap</span><span class="token style language-css atrule url punctuation" style="color:#393A34">)</span><span class="token style language-css atrule punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css atrule rule" style="color:#00a4db">@import</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule url function" style="color:#d73a49">url</span><span class="token style language-css atrule url punctuation" style="color:#393A34">(</span><span class="token style language-css atrule url string url" style="color:#36acaa">'toucaan/portrait/portrait.css'</span><span class="token style language-css atrule url punctuation" style="color:#393A34">)</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule keyword" style="color:#00009f">only</span><span class="token style language-css atrule" style="color:#00a4db"> screen </span><span class="token style language-css atrule keyword" style="color:#00009f">and</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule punctuation" style="color:#393A34">(</span><span class="token style language-css atrule property" style="color:#36acaa">orientation</span><span class="token style language-css atrule punctuation" style="color:#393A34">:</span><span class="token style language-css atrule" style="color:#00a4db"> portrait</span><span class="token style language-css atrule punctuation" style="color:#393A34">)</span><span class="token style language-css atrule punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css atrule rule" style="color:#00a4db">@import</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule url function" style="color:#d73a49">url</span><span class="token style language-css atrule url punctuation" style="color:#393A34">(</span><span class="token style language-css atrule url string url" style="color:#36acaa">'toucaan/landscape/landscape.css'</span><span class="token style language-css atrule url punctuation" style="color:#393A34">)</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule keyword" style="color:#00009f">only</span><span class="token style language-css atrule" style="color:#00a4db"> screen </span><span class="token style language-css atrule keyword" style="color:#00009f">and</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule punctuation" style="color:#393A34">(</span><span class="token style language-css atrule property" style="color:#36acaa">orientation</span><span class="token style language-css atrule punctuation" style="color:#393A34">:</span><span class="token style language-css atrule" style="color:#00a4db"> landscape</span><span class="token style language-css atrule punctuation" style="color:#393A34">)</span><span class="token style language-css atrule punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css atrule rule" style="color:#00a4db">@media</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule keyword" style="color:#00009f">only</span><span class="token style language-css atrule" style="color:#00a4db"> screen </span><span class="token style language-css atrule keyword" style="color:#00009f">and</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule punctuation" style="color:#393A34">(</span><span class="token style language-css atrule property" style="color:#36acaa">orientation</span><span class="token style language-css atrule punctuation" style="color:#393A34">:</span><span class="token style language-css atrule" style="color:#00a4db"> portrait</span><span class="token style language-css atrule punctuation" style="color:#393A34">)</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css selector pseudo-class" style="color:#00009f">:root</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">            </span><span class="token style language-css variable" style="color:#36acaa">--vmin</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css function" style="color:#d73a49">calc</span><span class="token style language-css punctuation" style="color:#393A34">(</span><span class="token style language-css number" style="color:#36acaa">100</span><span class="token style language-css unit">vw</span><span class="token style language-css">/</span><span class="token style language-css number" style="color:#36acaa">100</span><span class="token style language-css punctuation" style="color:#393A34">)</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"> </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Tentative */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css atrule rule" style="color:#00a4db">@media</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule keyword" style="color:#00009f">only</span><span class="token style language-css atrule" style="color:#00a4db"> screen </span><span class="token style language-css atrule keyword" style="color:#00009f">and</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule punctuation" style="color:#393A34">(</span><span class="token style language-css atrule property" style="color:#36acaa">orientation</span><span class="token style language-css atrule punctuation" style="color:#393A34">:</span><span class="token style language-css atrule" style="color:#00a4db"> landscape</span><span class="token style language-css atrule punctuation" style="color:#393A34">)</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css selector pseudo-class" style="color:#00009f">:root</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">            </span><span class="token style language-css variable" style="color:#36acaa">--vmin</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css function" style="color:#d73a49">calc</span><span class="token style language-css punctuation" style="color:#393A34">(</span><span class="token style language-css number" style="color:#36acaa">100</span><span class="token style language-css unit">vh</span><span class="token style language-css">/</span><span class="token style language-css number" style="color:#36acaa">100</span><span class="token style language-css punctuation" style="color:#393A34">)</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css">  </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Tentative */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css selector pseudo-class" style="color:#00009f">:root</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">      </span><span class="token style language-css variable" style="color:#36acaa">--vmin</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css number" style="color:#36acaa">1</span><span class="token style language-css unit">vmin</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">      </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/*Font familia */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">      </span><span class="token style language-css variable" style="color:#36acaa">--sans-serif</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> -apple-system</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> BlinkMacSystemFont</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> </span><span class="token style language-css string" style="color:#e3116c">"Segoe UI"</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> Roboto</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> </span><span class="token style language-css string" style="color:#e3116c">"Helvetica Neue"</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> Arial</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> </span><span class="token style language-css string" style="color:#e3116c">"Noto Sans"</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> sans-serif</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> </span><span class="token style language-css string" style="color:#e3116c">"Apple Color Emoji"</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> </span><span class="token style language-css string" style="color:#e3116c">"Segoe UI Emoji"</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> </span><span class="token style language-css string" style="color:#e3116c">"Segoe UI Symbol"</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> </span><span class="token style language-css string" style="color:#e3116c">"Noto Color Emoji"</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">      </span><span class="token style language-css variable" style="color:#36acaa">--system</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> -apple-system</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> BlinkMacSystemFont</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> Segoe UI</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> Roboto</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> Oxygen</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> Ubuntu</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> Cantarell</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> Droid Sans</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> Helvetica Neue</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> Fira Sans</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> sans-serif </span><span class="token style language-css important">!important</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">      </span><span class="token style language-css variable" style="color:#36acaa">--monospace</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> SFMono-Regular</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> Menlo</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> Monaco</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> Consolas</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> </span><span class="token style language-css string" style="color:#e3116c">"Liberation Mono"</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> </span><span class="token style language-css string" style="color:#e3116c">"Courier New"</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> monospace</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Sane defaults below */</span><span class="token style language-css selector" style="color:#00009f">s</span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css selector" style="color:#00009f">    *</span><span class="token style language-css selector punctuation" style="color:#393A34">,</span><span class="token style language-css selector" style="color:#00009f"> *</span><span class="token style language-css selector pseudo-element" style="color:#00009f">:after</span><span class="token style language-css selector punctuation" style="color:#393A34">,</span><span class="token style language-css selector" style="color:#00009f"> *</span><span class="token style language-css selector pseudo-element" style="color:#00009f">:before</span><span class="token style language-css">   </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">box-sizing</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> border-box</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Using margin &amp; padding to position elements instead of flexbox is somewhat of an anti-pattern. We'll discuss this in a new post. */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">margin</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:#36acaa">0</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">padding</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:#36acaa">0</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css selector" style="color:#00009f">html</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">background-color</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css color">white</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"> </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Always set the background color */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">-moz-osx-font-smoothing</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> grayscale</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">-webkit-font-smoothing</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> antialiased</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">overflow-x</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> hidden</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">overflow-y</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> scroll</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">text-size-adjust</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:#36acaa">100</span><span class="token style language-css unit">%</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css selector" style="color:#00009f">body</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Move this into font-family. */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">font-size</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css function" style="color:#d73a49">calc</span><span class="token style language-css punctuation" style="color:#393A34">(</span><span class="token style language-css number" style="color:#36acaa">4</span><span class="token style language-css"> </span><span class="token style language-css operator" style="color:#393A34">*</span><span class="token style language-css"> </span><span class="token style language-css function" style="color:#d73a49">var</span><span class="token style language-css punctuation" style="color:#393A34">(</span><span class="token style language-css variable" style="color:#36acaa">--vmin</span><span class="token style language-css punctuation" style="color:#393A34">)</span><span class="token style language-css punctuation" style="color:#393A34">)</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"> </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* We'll deal with vmin-based typography through a separate post. */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">font-family</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css string" style="color:#e3116c">'Font Family'</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> </span><span class="token style language-css function" style="color:#d73a49">var</span><span class="token style language-css punctuation" style="color:#393A34">(</span><span class="token style language-css variable" style="color:#36acaa">--system</span><span class="token style language-css punctuation" style="color:#393A34">)</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css">  </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* 'Font Family', -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Droid Sans, Helvetica Neue, Fira Sans, sans-serif !important; */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">font-smooth</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> always</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">font-weight</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:#36acaa">300</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">font-style</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> normal</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">font-synthesis</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> none</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">font-stretch</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> ultra-condensed</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">font-variant</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> no-common-ligatures proportional-nums slashed-zero</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">font-kerning</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> normal</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">text-rendering</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> geometricPrecision</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"> </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* The complaints about geometricPrecision are more than a decade old. Should we revisit this? */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">font-display</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> swap</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">font-display</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> optional</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">-webkit-tap-highlight-color</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css color function" style="color:#d73a49">rgba</span><span class="token style language-css color punctuation" style="color:#393A34">(</span><span class="token style language-css color number" style="color:#36acaa">0</span><span class="token style language-css color punctuation" style="color:#393A34">,</span><span class="token style language-css color"> </span><span class="token style language-css color number" style="color:#36acaa">0</span><span class="token style language-css color punctuation" style="color:#393A34">,</span><span class="token style language-css color"> </span><span class="token style language-css color number" style="color:#36acaa">0</span><span class="token style language-css color punctuation" style="color:#393A34">,</span><span class="token style language-css color"> </span><span class="token style language-css color number" style="color:#36acaa">0</span><span class="token style language-css color punctuation" style="color:#393A34">)</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">-webkit-backface-visibility</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> hidden</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">line-height</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css function" style="color:#d73a49">calc</span><span class="token style language-css punctuation" style="color:#393A34">(</span><span class="token style language-css number" style="color:#36acaa">1.5</span><span class="token style language-css"> </span><span class="token style language-css operator" style="color:#393A34">*</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:#36acaa">4</span><span class="token style language-css"> </span><span class="token style language-css operator" style="color:#393A34">*</span><span class="token style language-css"> </span><span class="token style language-css function" style="color:#d73a49">var</span><span class="token style language-css punctuation" style="color:#393A34">(</span><span class="token style language-css variable" style="color:#36acaa">--vmin</span><span class="token style language-css punctuation" style="color:#393A34">)</span><span class="token style language-css punctuation" style="color:#393A34">)</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css">  </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Or 1.5 */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Colors + contrast (This will go into the color palette.) */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">color</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css color function" style="color:#d73a49">rgba</span><span class="token style language-css color punctuation" style="color:#393A34">(</span><span class="token style language-css color number" style="color:#36acaa">0</span><span class="token style language-css color punctuation" style="color:#393A34">,</span><span class="token style language-css color"> </span><span class="token style language-css color number" style="color:#36acaa">0</span><span class="token style language-css color punctuation" style="color:#393A34">,</span><span class="token style language-css color"> </span><span class="token style language-css color number" style="color:#36acaa">0</span><span class="token style language-css color punctuation" style="color:#393A34">,</span><span class="token style language-css color"> </span><span class="token style language-css color number" style="color:#36acaa">0.95</span><span class="token style language-css color punctuation" style="color:#393A34">)</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">background-color</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css color">white</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Dimensions */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">border</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> none</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">min-height</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:#36acaa">100</span><span class="token style language-css unit">vh</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Behavior */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">overflow</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> auto</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">-webkit-overflow-scrolling</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> touch</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">scroll-behavior</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> smooth</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">touch-action</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> auto</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Accessibility-specific media queries go below. */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* 1. Dark mode (or light), depending on the developer's priority. */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css atrule rule" style="color:#00a4db">@media</span><span class="token style language-css atrule" style="color:#00a4db"> screen </span><span class="token style language-css atrule keyword" style="color:#00009f">and</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule punctuation" style="color:#393A34">(</span><span class="token style language-css atrule property" style="color:#36acaa">prefers-color-scheme</span><span class="token style language-css atrule punctuation" style="color:#393A34">:</span><span class="token style language-css atrule" style="color:#00a4db"> dark</span><span class="token style language-css atrule punctuation" style="color:#393A34">)</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css selector" style="color:#00009f">body</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">            </span><span class="token style language-css property" style="color:#36acaa">background-color</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css hexcode color">#343434</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">            </span><span class="token style language-css property" style="color:#36acaa">color</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css hexcode color">#fff</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* 2. Override animations for users with motion sickness or other vestibular disorders. */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css atrule rule" style="color:#00a4db">@media</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule punctuation" style="color:#393A34">(</span><span class="token style language-css atrule property" style="color:#36acaa">prefers-reduced-motion</span><span class="token style language-css atrule punctuation" style="color:#393A34">:</span><span class="token style language-css atrule" style="color:#00a4db"> reduce</span><span class="token style language-css atrule punctuation" style="color:#393A34">)</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css selector" style="color:#00009f">*</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">            </span><span class="token style language-css property" style="color:#36acaa">animation-duration</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:#36acaa">0.01</span><span class="token style language-css unit">ms</span><span class="token style language-css"> </span><span class="token style language-css important">!important</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">            </span><span class="token style language-css property" style="color:#36acaa">animation-iteration-count</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:#36acaa">1</span><span class="token style language-css"> </span><span class="token style language-css important">!important</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">            </span><span class="token style language-css property" style="color:#36acaa">transition-duration</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:#36acaa">0.01</span><span class="token style language-css unit">ms</span><span class="token style language-css"> </span><span class="token style language-css important">!important</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">            </span><span class="token style language-css property" style="color:#36acaa">scroll-behavior</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> auto </span><span class="token style language-css important">!important</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* 3. Acquired notched space and made sure that iOS Safari uses only the available vertical height (100dvh). */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css atrule rule" style="color:#00a4db">@supports</span><span class="token style language-css atrule punctuation" style="color:#393A34">(</span><span class="token style language-css atrule property" style="color:#36acaa">padding</span><span class="token style language-css atrule punctuation" style="color:#393A34">:</span><span class="token style language-css atrule function" style="color:#d73a49">max</span><span class="token style language-css atrule punctuation" style="color:#393A34">(</span><span class="token style language-css atrule number" style="color:#36acaa">0</span><span class="token style language-css atrule unit" style="color:#00a4db">px</span><span class="token style language-css atrule punctuation" style="color:#393A34">)</span><span class="token style language-css atrule punctuation" style="color:#393A34">)</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">      </span><span class="token style language-css selector" style="color:#00009f">body</span><span class="token style language-css selector punctuation" style="color:#393A34">,</span><span class="token style language-css selector" style="color:#00009f"> header</span><span class="token style language-css selector punctuation" style="color:#393A34">,</span><span class="token style language-css selector" style="color:#00009f"> footer</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">padding-left</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css function" style="color:#d73a49">min</span><span class="token style language-css punctuation" style="color:#393A34">(</span><span class="token style language-css number" style="color:#36acaa">0</span><span class="token style language-css unit">vmin</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> </span><span class="token style language-css function" style="color:#d73a49">env</span><span class="token style language-css punctuation" style="color:#393A34">(</span><span class="token style language-css">safe-area-inset-left</span><span class="token style language-css punctuation" style="color:#393A34">)</span><span class="token style language-css punctuation" style="color:#393A34">)</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">padding-right</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css function" style="color:#d73a49">min</span><span class="token style language-css punctuation" style="color:#393A34">(</span><span class="token style language-css number" style="color:#36acaa">0</span><span class="token style language-css unit">vmin</span><span class="token style language-css punctuation" style="color:#393A34">,</span><span class="token style language-css"> </span><span class="token style language-css function" style="color:#d73a49">env</span><span class="token style language-css punctuation" style="color:#393A34">(</span><span class="token style language-css">safe-area-inset-right</span><span class="token style language-css punctuation" style="color:#393A34">)</span><span class="token style language-css punctuation" style="color:#393A34">)</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">      </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">      </span><span class="token style language-css selector" style="color:#00009f">body</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css property" style="color:#36acaa">min-height</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> -webkit-fill-available</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">      </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<p>Welcome to an intrinsically scaling baseline reset. These ideas have been rolled into the <a href="https://github.com/toucaan/toucaan" target="_blank" rel="noopener noreferrer" class="">Toucaan Submodule</a> with the most updated code.</p>
<p>Are you happy? Toucaan is. <em>Toco, Toco!</em></p>
<hr>
<p>Written by: Marvin Danig, CEO &amp; Cofounder of <a href="https://bubblin.io/" target="_blank" rel="noopener noreferrer" class="">Bubblin Superbooks</a> and <a href="https://goose.red/" target="_blank" rel="noopener noreferrer" class="">Red Goose</a>. Super thankful to Sonica Arora, Satyendra Sharma, and Abigail Rennemeyer for all the editing help and time they could pass on from their busy lives.</p>
<p>To see what the latest <code>html.css</code> looks like on major browsers today:</p>
<ol>
<li class="">
<p>Webkit html.css @<a href="https://trac.webkit.org/browser/trunk/Source/WebCore/css/html.css%22" target="_blank" rel="noopener noreferrer" class="">Chrome &amp; @Safari</a>.</p>
</li>
<li class="">
<p>Quantum html.css@ <a href="https://dxr.mozilla.org/mozilla-central/source/layout/style/res/html.css" target="_blank" rel="noopener noreferrer" class="">Firefox</a>.</p>
</li>
<li class="">
<p>Chromium html.css@ <a href="https://chromium.googlesource.com/chromium/blink/+/master/Source/core/css/html.css" target="_blank" rel="noopener noreferrer" class="">Blink or Edge browser</a></p>
</li>
</ol>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorTargetStickyNavbar_Vzrq sr-only" id="footnote-label">Footnotes<a href="https://toucaan.com/blog/baseline-css#footnote-label" class="hash-link" aria-label="Direct link to Footnotes" title="Direct link to Footnotes" translate="no">​</a></h2>
<ol>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-1-0a5d9a">
<p>"html.css" <a href="https://toucaan.com/blog/baseline-css#user-content-fnref-1-0a5d9a" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content>
        <author>
            <name>Marvin Danig</name>
            <uri>https://github.com/marvindanig</uri>
        </author>
        <category label="reset" term="reset"/>
        <category label="reboot" term="reboot"/>
        <category label="normalization" term="normalization"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[A CSS Router.]]></title>
        <id>https://toucaan.com/blog/a-css-router</id>
        <link href="https://toucaan.com/blog/a-css-router"/>
        <updated>2023-03-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[---]]></summary>
        <content type="html"><![CDATA[<hr>
<p><em>This article was originally featured on the <a href="https://bubblin.io/scrolls/blog" target="_blank" rel="noopener noreferrer" class="">The Bubblin Blog</a>.</em></p>
<hr>
<p>Welcome to the newest chapter on <a class="" href="https://toucaan.com/blog/rethinking-css-frameworks">Rethinking CSS Frameworks</a> with the Toucaan. In this chapter, we will implement <a class="" href="https://toucaan.com/blog/a-css-router">A CSS Router</a> that will allow us to isolate and deliver only medium-specific stylesheets that make our apps "belong" to the device.</p>
<p>This css router will eventually form the backbone of the <a class="" href="https://toucaan.com/docs/core-concepts/intrinsic">Applied Principles of Intrinsic Design</a>, therefore, we recommend the end user to read this post carefully.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="two-states-of-web-design">Two States of Web Design<a href="https://toucaan.com/blog/a-css-router#two-states-of-web-design" class="hash-link" aria-label="Direct link to Two States of Web Design" title="Direct link to Two States of Web Design" translate="no">​</a></h3>
<p>The first seemingly innocuous-looking fact about all digital mediums is that everything is a simple <em>rectangle</em>. All screens are rectangular. The notched, bendable, and foldable screens are also practically rectangular.</p>
<p>The only device I could find with a genuinely non-rectangular screen is the circular Moto 360 Watch, but it, too, under the glass, rendered all the content in <a href="https://play.google.com/store/apps/details?id=com.appfour.wearbrowser&amp;hl=en_US&amp;gl=US" target="_blank" rel="noopener noreferrer" class="">shape of a rectangle</a>, just like any other device.</p>
<p>The point to note here is that since the viewing area of the glowing glass is <em>always</em>  a rectangle, the rectangle is the final state of any and every web design or render, no matter what. And since a rectangle has only two orientations: portrait and landscape, we have just the <strong>two states of web design</strong> to master for web designing.</p>
<p><img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/marvindanig/assets/master/axes-of-symmetry.jpg" alt="Common axes of symmetry for a rectangle." class="img_ev3q"></p>
<p>Cool? Let us use this fact to kickstart our CSS router:</p>
<p>Since a rectangular viewport can be viewed in portrait (like a mobile) or landscape position (like on a desktop) only, we can start with the first level of <a class="" href="https://toucaan.com/blog/orientation-querying-with-switch-media-query">Orientation Querying</a> like so:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">  </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Consider the following rules inside the head tag of HTML: */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">  </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* The x-axis of intrinsic web design */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">  </span><span class="token style language-css atrule rule" style="color:#00a4db">@media</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule keyword" style="color:#00009f">only</span><span class="token style language-css atrule" style="color:#00a4db"> screen </span><span class="token style language-css atrule keyword" style="color:#00009f">and</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule punctuation" style="color:#393A34">(</span><span class="token style language-css atrule property" style="color:#36acaa">orientation</span><span class="token style language-css atrule punctuation" style="color:#393A34">:</span><span class="token style language-css atrule" style="color:#00a4db"> landscape</span><span class="token style language-css atrule punctuation" style="color:#393A34">)</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css selector pseudo-class" style="color:#00009f">:root</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">      </span><span class="token style language-css variable" style="color:#36acaa">--vmin</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css function" style="color:#d73a49">calc</span><span class="token style language-css punctuation" style="color:#393A34">(</span><span class="token style language-css number" style="color:#36acaa">100</span><span class="token style language-css unit">vh</span><span class="token style language-css">/</span><span class="token style language-css number" style="color:#36acaa">100</span><span class="token style language-css punctuation" style="color:#393A34">)</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">     </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* All the desktop styles (except for the vertically mounted screen) go here… */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">  </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">  </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* The y-axis of intrinsic web design */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">  </span><span class="token style language-css atrule rule" style="color:#00a4db">@media</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule keyword" style="color:#00009f">only</span><span class="token style language-css atrule" style="color:#00a4db"> screen </span><span class="token style language-css atrule keyword" style="color:#00009f">and</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule punctuation" style="color:#393A34">(</span><span class="token style language-css atrule property" style="color:#36acaa">orientation</span><span class="token style language-css atrule punctuation" style="color:#393A34">:</span><span class="token style language-css atrule" style="color:#00a4db"> portrait</span><span class="token style language-css atrule punctuation" style="color:#393A34">)</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css selector pseudo-class" style="color:#00009f">:root</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">      </span><span class="token style language-css variable" style="color:#36acaa">--vmin</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css function" style="color:#d73a49">calc</span><span class="token style language-css punctuation" style="color:#393A34">(</span><span class="token style language-css number" style="color:#36acaa">100</span><span class="token style language-css unit">vw</span><span class="token style language-css">/</span><span class="token style language-css number" style="color:#36acaa">100</span><span class="token style language-css punctuation" style="color:#393A34">)</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">      </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Mobile stylesheet over here */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">  </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">  </span><span class="token style language-css selector pseudo-class" style="color:#00009f">:root</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">      </span><span class="token style language-css variable" style="color:#36acaa">--vmin</span><span class="token style language-css punctuation" style="color:#393A34">:</span><span class="token style language-css"> </span><span class="token style language-css number" style="color:#36acaa">1</span><span class="token style language-css unit">vmin</span><span class="token style language-css punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">      </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/*** Global custom properties </span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css comment" style="color:#999988;font-style:italic">      like the color palette here…  ***/</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">  </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<p>Looks simple enough?</p>
<p>From the code above, one can see that we have split our styles along the two axes of intrinsic web design, where the orientation is the first inherent quality of a rectangular screen against our visual horizon or <a href="https://courses.byui.edu/art110_new/art110/week01/eye_level.html" target="_blank" rel="noopener noreferrer" class="">eye-level</a> or the <a href="https://biology.stackexchange.com/questions/24046/if-human-eyes-watch-an-area-whats-the-shape-of-its-capturing-shape-rectangula" target="_blank" rel="noopener noreferrer" class="">field of view</a>.</p>
<p>Let us turn this orientation switch to our first level of the router using an asynchronous CSS @import call like so:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Replace the rules above inside the head tag of the document with the following: */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* The x-axis of Intrinsic Web Design */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css atrule rule" style="color:#00a4db">@import</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule url function" style="color:#d73a49">url</span><span class="token style language-css atrule url punctuation" style="color:#393A34">(</span><span class="token style language-css atrule url string url" style="color:#36acaa">'…/path/to/toucaan/router/landscape.css'</span><span class="token style language-css atrule url punctuation" style="color:#393A34">)</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule keyword" style="color:#00009f">only</span><span class="token style language-css atrule" style="color:#00a4db"> screen </span><span class="token style language-css atrule keyword" style="color:#00009f">and</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule punctuation" style="color:#393A34">(</span><span class="token style language-css atrule property" style="color:#36acaa">orientation</span><span class="token style language-css atrule punctuation" style="color:#393A34">:</span><span class="token style language-css atrule" style="color:#00a4db"> landscape</span><span class="token style language-css atrule punctuation" style="color:#393A34">)</span><span class="token style language-css atrule punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* The y-axis of Intrinsic Web Design */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css atrule rule" style="color:#00a4db">@import</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule url function" style="color:#d73a49">url</span><span class="token style language-css atrule url punctuation" style="color:#393A34">(</span><span class="token style language-css atrule url string url" style="color:#36acaa">'…/path/to/toucaan/router/portrait.css'</span><span class="token style language-css atrule url punctuation" style="color:#393A34">)</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule keyword" style="color:#00009f">only</span><span class="token style language-css atrule" style="color:#00a4db"> screen </span><span class="token style language-css atrule keyword" style="color:#00009f">and</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule punctuation" style="color:#393A34">(</span><span class="token style language-css atrule property" style="color:#36acaa">orientation</span><span class="token style language-css atrule punctuation" style="color:#393A34">:</span><span class="token style language-css atrule" style="color:#00a4db"> portrait</span><span class="token style language-css atrule punctuation" style="color:#393A34">)</span><span class="token style language-css atrule punctuation" style="color:#393A34">;</span><span class="token style language-css"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css selector pseudo-class" style="color:#00009f">:root</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Global custom properties like the color palette here…  */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<p>Our router will now serve only one stylesheet into the browser environment according to the device's orientation or the shape of the browser window in case of a resizable browser like on the desktop.</p>
<p>Meaning if the user resizes their desktop browser to a point where the viewable window (rectangle) switches orientation from landscape to portrait, then our CSS router will prioritize <code>portrait.css</code> over <code>landscape.css</code>. Note that the router will likely continue to serve <code>landscape.css</code> even though it doesn't get applied because that is how the css standards expect the browsers to behave.</p>
<p>Perfect.</p>
<p>We can now scale our UI along one axis and not worry about how the website would appear on the other.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>"The Curious Case of CSS @import."</div><div class="admonitionContent_BuS1"><p>There are quite a few articles on the web that establish that a CSS <code>@import</code> <a href="https://csswizardry.com/2018/11/css-and-network-performance/" target="_blank" rel="noopener noreferrer" class="">performs poorly</a> due to waterfall. While this analysis is true, it is often not correctly applied to how Toucaan uses it.</p><p>The performance of CSS <code>@import</code> degrades only when it is chain-sequenced into a waterfall of requests. If instead an <code>@import</code> fetches (prioritizes) only one "applicable" stylesheet from within the head of a document <em>without</em> further sequential chaining of multiple applicable stylesheets then there would be no meaningful waterfall.</p><p>It would be just as fast as any <code>link</code> statement.</p></div></div>
<p>In other words, if there is just one stylesheet to prioritize over and serve, using an <code>@import</code> statement instead of a <code>link</code> tag will not make a difference. Note, the browser may <a href="https://blog.jim-nielsen.com/2021/conditional-style-loading-not-so-fast/" target="_blank" rel="noopener noreferrer" class="">still fetch all the other stylesheets</a> @imported into the document, but those will come in with a lowered priority and also not get applied to the render since they are irrelvant</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="axes-of-intrinsic-web-design">Axes of Intrinsic Web Design<a href="https://toucaan.com/blog/a-css-router#axes-of-intrinsic-web-design" class="hash-link" aria-label="Direct link to Axes of Intrinsic Web Design" title="Direct link to Axes of Intrinsic Web Design" translate="no">​</a></h3>
<p>What our router has done so far is execute a <strong>top-level environment assessment</strong> and arrive at a suitable style resource that fits the way our eyes are physically looking at the screen. Orientation!</p>
<p>We can now drill down further into each axis to understand how our UI can scale and truly <em>belong to a device</em> to provide a more fulfilling experience to the user.</p>
<p>Consider the following design space:</p>
<p><img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/marvindanig/assets/master/intrinsic-design-space.jpg" alt="The axes of Intrinsic Web Design. " class="img_ev3q"></p>
<p>The second quality to consider for intrinsic web design is the physical size of a screen. From the plot of the design space above, one can see that the physical size of the rectangle increases a lot going up from a Watch to an LCD TV or projector (See the y-axis, for example).</p>
<p>We can scale our UI along the axis in the order of increasing physical size. By doing so, i.e., by scaling our UX/UI along each axis, we bake in two deeply intrinsic qualities of a device into our web design:</p>
<ol>
<li class="">Orientation, and</li>
<li class="">Physical size.</li>
</ol>
<p>Splitting design thinking along the two axes is akin to scaling mockups or UI according to the specifications of a device held one way or the other, without considering how the app would appear on the other.</p>
<p>IMO, this is <em>almost</em> what we do with responsive design as well, but with intrinsic web design, the separation is perhaps more explicit. It is an absolute even, to a point where the HTML served from the server could be different depending on the matched CSS route.</p>
<blockquote>
<p>Increasing or decreasing the physical size of the glass (hardware) is similar to resizing a browser on a desktop but without impunity because only the manufacturers have that sort of control.
The shape of glass remains a rectangle no matter what.</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="scaling-the-ui-along-portrait-axis">Scaling the UI along portrait-axis<a href="https://toucaan.com/blog/a-css-router#scaling-the-ui-along-portrait-axis" class="hash-link" aria-label="Direct link to Scaling the UI along portrait-axis" title="Direct link to Scaling the UI along portrait-axis" translate="no">​</a></h3>
<p>Let us start from the y-axis of intrinsic web design. This axis contains what is known as the "mobile-first" approach of RWD.</p>
<p>If we were to scale an app on the portrait axis of intrinsic web design, then according to the increasing physical size of the devices, our stops or "breakpoints" would go something like this:</p>
<ul>
<li class="">(A) Start with an Apple Watch (always viewed in portrait mode) to</li>
<li class="">(B) A smartphone held in portrait grip to</li>
<li class="">(C) A tablet held in portrait mode to</li>
<li class="">(D) A desktop mounted in portrait mode (developers or gamers) to</li>
<li class="">(E) A TV-set mounted on a wall in portrait mode (retail display or airport flight information display) to</li>
<li class="">(F) A 120" wall-mounted projector screen in portrait mode.</li>
</ul>
<p><img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/marvindanig/assets/master/portrait-axis.jpg" alt="Increasing physical size of devices held or mounted in portrait orientation." class="img_ev3q"></p>
<p>Looks fair so far?</p>
<p>One can tell that we are heading towards "category-specific" breakpoints on our CSS router from the list above. Category-specific as in, from wearables → phone → tablet → … → projector in portrait orientation only.</p>
<blockquote>
<p>The instance of a V9 browser displayed on a desktop-sized tablet fixed in portrait mode at the center console of a Tesla Model S is not shown on the plot above.
It falls somewhere between a tablet and a desktop.</p>
</blockquote>
<p>Splitting designs this way helps our router to deliver just the right amount of CSS for a given class of medium <a href="https://responsivedesign.is/articles/why-you-dont-need-device-specific-breakpoints/" target="_blank" rel="noopener noreferrer" class="">without falling into the trap of device-specific breakpoints</a>. A design that "belongs" to the type of device at hand and its accessibility situation.</p>
<p>It is similar to breaking up CSS with hardcoded media queries, but the focus is on how the device category behaves and what it affords instead of the hardcoded width specification. This strategy potentially halves the amount of CSS delivered over the network––at least–– but the benefits could be more depending on routes and categories served.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="starting-from-an-apple-watch">Starting from an Apple Watch.<a href="https://toucaan.com/blog/a-css-router#starting-from-an-apple-watch" class="hash-link" aria-label="Direct link to Starting from an Apple Watch." title="Direct link to Starting from an Apple Watch." translate="no">​</a></h3>
<p>Now, not every web app needs to or will be able to meet the challenge of fitting on an Apple Watch, but with Intrinsic Web Design, a designer has the option to start their design work from a watch.</p>
<p>Go watch-first.</p>
<p>The most remarkable quality of an Apple Watch is that it has a tiny screen—a sub-inch rectangular viewport if the bezel area around the Watch is discounted. Our fingertip can cover almost 25% of the real estate available on the Watch, so the UI components need to be scaled up for accessibility.</p>
<p><img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/marvindanig/assets/master/apple-watch-four-quadrants.jpg" alt="A finger-tip can cover a quarter of the screen on a Watch." class="img_ev3q"></p>
<p>Designing for a medium that small can be particularly challenging.</p>
<p>Think of finding a UXI optimum for a super coarse pointer where every interactive action is the complete UI displayed on a Watch.</p>
<blockquote>
<p>Recommended reading: <a class="" href="https://toucaan.com/blog/web-design-for-the-apple-watch">Designing Web Apps for Apple Watch</a>.</p>
</blockquote>
<p>The Watch, therefore, cannot be supported with responsive web design unless generic automatic scaling (0.51 scale of responsive) is enough for your use case. The responsive approach cannot even differentiate between a mobile and a watch.</p>
<p>The option to contextualize and develop web design according to the environment of a wearable exists with only intrinsic web design.</p>
<p>Getting back to our router:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/* On the portrait-axis router. */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/* The file at --&gt; ./toucaan/router/portrait.css */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** Route-in or @import wearables first. ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** 1. Apple Watch 6 for men = 44mm. Resolution: 368 x 448 pixels ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** 2. Apple Watch 6 for women = 40mm. 324 x 394 pixels   ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** 3. Moto 360 Watch = 46mm. Resolution: 360 x 330 pixels ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@import</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule url function" style="color:#d73a49">url</span><span class="token atrule url punctuation" style="color:#393A34">(</span><span class="token atrule url string url" style="color:#36acaa">'./toucaan/app/portrait/watch.css'</span><span class="token atrule url punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">only</span><span class="token atrule" style="color:#00a4db"> screen </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">368</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-device-height</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">448</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">-webkit-device-pixel-ratio</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">3</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>Since a Watch is viewed in portrait mode only, we add a route for <code>watch.css</code> on the portrait arm of the router. All watch-specific styles can now live inside the <code>watch.css</code> file and are served when the router matches a wearable.</p>
<p>Combining the above ruleset with a level-4 media query, we get a very accurate handler for <code>watch.css</code>, like so:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/* On the portrait-axis router. */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/* The file at --&gt; ./toucaan/router/portrait.css */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** Route-in or @import wearables first. ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** 1. Apple Watch 6 for men = 44mm. Resolution: 368 x 448 pixels ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** 2. Apple Watch 6 for women = 40mm. 324 x 394 pixels   ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** 3. Moto 360 Watch = 46mm. Resolution: 360 x 330 pixels ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/* Wearables */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@import</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule url function" style="color:#d73a49">url</span><span class="token atrule url punctuation" style="color:#393A34">(</span><span class="token atrule url string url" style="color:#36acaa">'./toucaan/portrait/watch.css'</span><span class="token atrule url punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">368</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-device-height</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">448</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">-webkit-device-pixel-ratio</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">3</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">hover</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> none</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">pointer</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> coarse</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">200</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/* Dropped the MQ 'only screen' because it is handled in the first level filter with orientation query on the top. */</span><br></span></code></pre></div></div>
<p>Moving up the portrait axis, we now add a route for the next category of devices: smartphones. The following MQ range covers all the smartphones that are available on the market today (2021).</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/* The portrait-axis router. */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/* The file at → ./toucaan/router/portrait.css */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">1</span><span class="token plain">. </span><span class="token comment" style="color:#999988;font-style:italic">/*** Route-in for @import watch.css ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">…</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">…</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">2</span><span class="token plain">. </span><span class="token comment" style="color:#999988;font-style:italic">/*** Route-in or @import mobile.css next. ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">/*** 1. iPhone 4 to iPhone Pro Max 12. Resolution: ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">/*** 2. Android phones                             ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/* Smartphones */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@import</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule url function" style="color:#d73a49">url</span><span class="token atrule url punctuation" style="color:#393A34">(</span><span class="token atrule url string url" style="color:#36acaa">'./toucaan/portrait/mobile.css'</span><span class="token atrule url punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">280</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">667</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">-webkit-min-device-pixel-ratio</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">2</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">hover</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> none</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">pointer</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> coarse</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">,</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">414</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">812</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">-webkit-min-device-pixel-ratio</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">3</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">hover</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> none</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">pointer</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> coarse</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">,</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">      </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">360</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">      </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">device-height</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">640</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">      </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">-webkit-device-pixel-ratio</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">4</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">      </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">hover</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> none</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">      </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">pointer</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> coarse</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** Route-in or @import tablet.css below, and so on… ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">…</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">…</span><br></span></code></pre></div></div>
<p>Some of the newer smartphones can unfold to become mini-tablet. Such a device may fall outside of the scope of the mobile route specified above upon unfolding. That is not a problem because our router will match the mini-tablet to the appropriate route on the landscape axis if necessary.</p>
<p>We will come back to this discussion in another chapter, but our router can handle foldable phones just right and deliver the correct css that belongs to the device. Intrinsic Web Design aims to support nearly all permutations and combinations of digital screens available on the web today instead of just 2-3 significant verticals like mobile, tablet, and the desktop.</p>
<p>Continuing on the portrait arm of our css router, let us hash out the remaining paths:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/*** Portrait or y-axis.  ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/* The portrait-axis router. */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/* The file at --&gt; ./toucaan/router/portrait.css */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** Route-in for @import watch.css ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** a. Apple Watch 6 for men = 44mm. Resolution: 368 x 448 pixels ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** b. Apple Watch 6 for women = 40mm. 324 x 394 pixels   ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** c. Moto 360 Watch = 46mm. Resolution: 360 x 330 pixels ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/* Wearables */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@import</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule url function" style="color:#d73a49">url</span><span class="token atrule url punctuation" style="color:#393A34">(</span><span class="token atrule url string url" style="color:#36acaa">'../../dist/watch.css'</span><span class="token atrule url punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">368</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-device-height</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">448</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">-webkit-device-pixel-ratio</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">3</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">hover</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> none</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">pointer</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> coarse</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">200</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** Route-in or @import mobile.css next. ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** 1. iPhone 4 to iPhone Pro Max 12. Resolution:  ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** 2. Android phones including Galaxy Fold @280px ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/* Smartphones */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@import</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule url function" style="color:#d73a49">url</span><span class="token atrule url punctuation" style="color:#393A34">(</span><span class="token atrule url string url" style="color:#36acaa">'../../dist/mobile.css'</span><span class="token atrule url punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">280</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">384</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">-webkit-min-device-pixel-ratio</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">2</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">hover</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> none</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">pointer</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> coarse</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">,</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">414</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">812</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">-webkit-min-device-pixel-ratio</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">3</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">hover</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> none</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">pointer</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> coarse</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">,</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">      </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">360</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">      </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">-webkit-device-pixel-ratio</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">4</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">      </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">hover</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> none</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">      </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">pointer</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> coarse</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** Route-in or @import tablet.css next. ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** 1. iPad 1, 2, Mini, Air, 3, 4 and Pro 9.7, Pro 10.5, Pro 12.9 ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** 2. Android tablets: Galaxy, Nexus and Huawei ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** 3. Kindle Fire ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/* Tablets */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@import</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule url function" style="color:#d73a49">url</span><span class="token atrule url punctuation" style="color:#393A34">(</span><span class="token atrule url string url" style="color:#36acaa">'../../dist/tablet.css'</span><span class="token atrule url punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">768</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">1024</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">-webkit-min-device-pixel-ratio</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">1</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">hover</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> none</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">pointer</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> coarse</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">,</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">768</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">1366</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">-webkit-min-device-pixel-ratio</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">2</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">hover</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> none</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">pointer</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> coarse</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">,</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">      </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">601</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">      </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-device-height</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">1536</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">      </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">-webkit-min-device-pixel-ratio</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">1.331</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">      </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">-webkit-max-device-pixel-ratio</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">1.332</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">      </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">hover</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> none</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">      </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">pointer</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> coarse</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">,</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">        </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">800</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">        </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">1600</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">        </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">-webkit-min-device-pixel-ratio</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">1.5</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">        </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">hover</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> none</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">        </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">pointer</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> coarse</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** Route-in or @import vehicle.css if required. ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** Older Tesla Model S and a few other EVs ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/* EVs */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/* @import url('../../dist/vehicle.css') </span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">  (min-device-width: 1200px) </span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">  and (max-device-width: 1920px) </span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">  and (-webkit-min-device-pixel-ratio: 1) </span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">  and (hover: none) </span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">  and (pointer: coarse); */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** Route-in or @import desktop.css next. ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** Vertically mounted Retina &amp; non-retina Screens ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/* Desktops */</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@import</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule url function" style="color:#d73a49">url</span><span class="token atrule url punctuation" style="color:#393A34">(</span><span class="token atrule url string url" style="color:#36acaa">'../../dist/desktop.css'</span><span class="token atrule url punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">720</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-device-height</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">1920</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">-webkit-min-device-pixel-ratio</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">1</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">hover</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> hover</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">pointer</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> fine</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">,</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">900</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">2880</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">-webkit-min-device-pixel-ratio</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">2</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-resolution</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">192</span><span class="token atrule unit" style="color:#00a4db">dpi</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"></span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">hover</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> hover</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">    </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">pointer</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> fine</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/*** Route-in or @import television.css next. ***/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/* Limited browser support. */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/* Vertically mounted television or projector. */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@import</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule url function" style="color:#d73a49">url</span><span class="token atrule url punctuation" style="color:#393A34">(</span><span class="token atrule url string url" style="color:#36acaa">'../../dist/television.css'</span><span class="token atrule url punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">1440</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-device-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">4320</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">hover</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> none</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule" style="color:#00a4db"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token atrule" style="color:#00a4db">  </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">any-pointer</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> coarse</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/* </span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">1280x720 — HD / 720p.</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">1920x1080 — FHD (Full HD) / 1080p.</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">2560x1440 — QHD/WQHD (Quad HD) / 1440p.</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">3840x2160 — UHD (Ultra HD) / 4K 2160p.</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">7680×4320 — FUHD (Full Ultra HD) / 8K 4320p.</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"></span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">Televisions on the lower end of the market do not sport a worthwhile web browser. </span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">Web browsers on TVs on the high end of the market are still catching up on standards. </span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">Warning: Poor support for CSS Grids, level 4 media queries, and several other CSS features.</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"></span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">WebOS from LG is pointer-driven.</span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">*/</span><br></span></code></pre></div></div>
<p>The router rules above match the industry-wide categories as on date instead of the device-inspired breakpoints in use with Responsive Web Design. Furthermore, the level-4 media queries also add another intrinsic quality of the device at hand on the delivered css.</p>
<p>It contextualizes properties like <code>touch-action: auto</code> and <code>pointer: coarse</code> strictly for a given device and splits the global scope of the overall app according to the client environments.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="advantages-of-using-a-router">Advantages of using a router<a href="https://toucaan.com/blog/a-css-router#advantages-of-using-a-router" class="hash-link" aria-label="Direct link to Advantages of using a router" title="Direct link to Advantages of using a router" translate="no">​</a></h3>
<p>Since the accessibility situation of mobile is entirely different from the accessibility situation of a, say, Tesla Model S car (where the driver or the pilot is constrained by a safety belt and is required to focus on the changing road conditions), it makes sense to separate the stylistic choices made for the user for each medium via a separate stylesheet. Note that this is true even though both smartphones and Tesla cars are touch devices.</p>
<p>Similarly, routing CSS according to intrinsic capabilities along the axes of IWD has several other advantages:</p>
<ol>
<li class="">
<p>It allows web designers to work on logically closer modules together. If the intended UX/UI on the tablet is close to the implemented mobile UI, then all the designer has to do is copy <code>mobile.css</code> into <code>tablet.css</code> and start there. The IWD router also helps avoid the giant leap one has to take to switch between a touch-sensitive context (mobile) and a pointer-driven context (desktop), both of which, as seen from the plot above, live on entirely different axes of web design.</p>
</li>
<li class="">
<p>It helps with a macro-optimization of delivering only relevant CSS for a given device. Users on a mobile, for example, do not need to download and parse six thousand lines of desktop css and override it.</p>
</li>
<li class="">
<p>It separates the CSS modules according to industry-wide categories and not according to the device specifications. If Apple were to release a new iPhone of a different resolution or pixel density tomorrow, our router would be able to serve the new phone with the same <code>mobile.css</code> because it falls under the mobile category.</p>
</li>
<li class="">
<p>The design thinking accounts for the orientation, physical size, accessibility constraints, and screen-specific capabilities (touch or pointer-driven) in a way that web design can "belong to" a device. Going intrinsic is perhaps the best way to design and develop native mobile apps using the building blocks of the web-aka, HTML, CSS, JavaScript, and WebAssembly.</p>
</li>
<li class="">
<p>It affords better maintainability with proper scoping of stylesheets according to the { app: device } combinations. It helps the developer organize CSS like a monorepo and keep the designs separate according to medium.</p>
</li>
</ol>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="disadvantage">Disadvantage<a href="https://toucaan.com/blog/a-css-router#disadvantage" class="hash-link" aria-label="Direct link to Disadvantage" title="Direct link to Disadvantage" translate="no">​</a></h4>
<p>It might appear like much CSS to maintain, but if we were to look at a real production-scale app, with all of the <code>reset.css</code> <code>framework.css</code> and <code>app.css</code>, plus the many workarounds over the limitations of RWD, the intrinsic approach is a far more maintainable choice. More often than not, a router would likely split CSS near the past hardcoded MQ breakpoints of RWD.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="intrinsic-vs-responsive-design">Intrinsic vs. Responsive Design<a href="https://toucaan.com/blog/a-css-router#intrinsic-vs-responsive-design" class="hash-link" aria-label="Direct link to Intrinsic vs. Responsive Design" title="Direct link to Intrinsic vs. Responsive Design" translate="no">​</a></h3>
<p>Responsive web design can be considered a subset of intrinsic web design, in that responsive is limited to thinking design of mobile and desktop UI mostly, but it also does not recognize the fact that mobile UI is portrait UI on the y-axis of a rectangle whereas the desktop UI is landscape UI on the x-axis of a rectangle.</p>
<p>Intrinsic can also differ significantly from responsive depending on how deep an implementation builds UX/UIs that utilize the intrinsic capabilities and thus "belong." On the plot of design space of intrinsic web design (diagram shown above), RWD focuses on mobile and desktop, and the point of intersection is where the design meets its media-query breakpoint.</p>
<p>Looking closely, RWD tries to implement a similar separation of design states, but it fails to establish a boundary. It does not push the designer to think UI independent of the other device. This, in my opinion, is a significant drawback of responsive web design and prevents it from scaling according to <a class="" href="https://toucaan.com/blog/the-new-landscape-of-the-web">the new landscape of the web</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-complete-router">The complete router<a href="https://toucaan.com/blog/a-css-router#the-complete-router" class="hash-link" aria-label="Direct link to The complete router" title="Direct link to The complete router" translate="no">​</a></h3>
<p>With our router's portrait-arm, we scale our landscape UI along the x-axis of Intrinsic Web Design according to increasing physical size. Since a wearable like the Apple Watch does not support landscape orientation (yet), we start on our router like so:</p>
<ul>
<li class="">(A) Start with a smartphone held in landscape orientation to</li>
<li class="">(B) A tablet held in landscape mode to</li>
<li class="">(C) A desktop in landscape (natural) setting to</li>
<li class="">(D) A TV-set mounted on a wall in landscape</li>
<li class="">(E) A 120" wall-mounted projector screen in landscape.</li>
</ul>
<p><img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/marvindanig/assets/master/landscape-axis.jpg" alt="Increasing physical size of the viewport in landscape mode." class="img_ev3q"></p>
<blockquote>
<p>The instance of a V9 browser displayed on a desktop-sized tablet dashboard fixed in landscape mode at the center console of a Tesla Model 3 is not shown above.</p>
</blockquote>
<p>Ultra-widescreen monitors can also be thrown into the mix and targeted with an eccentric layout that fits the medium intrinsically. After adding all the routes on the landscape arm, our application CSS will look something like this:</p>
<p><img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/marvindanig/assets/master/css-structure.jpg" alt="A mono-repo style architecture for css." class="img_ev3q"></p>
<p>Our router will replace the traditional link to the stylesheet in the head of a document:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">head</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  …</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  …</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token style language-css">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">     </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Orientation switching for screens or _switch.scss */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">      </span><span class="token style language-css atrule rule" style="color:#00a4db">@import</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule url function" style="color:#d73a49">url</span><span class="token style language-css atrule url punctuation" style="color:#393A34">(</span><span class="token style language-css atrule url string url" style="color:#36acaa">'…/path/to/toucaan/router/landscape.css'</span><span class="token style language-css atrule url punctuation" style="color:#393A34">)</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule keyword" style="color:#00009f">only</span><span class="token style language-css atrule" style="color:#00a4db"> screen </span><span class="token style language-css atrule keyword" style="color:#00009f">and</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule punctuation" style="color:#393A34">(</span><span class="token style language-css atrule property" style="color:#36acaa">orientation</span><span class="token style language-css atrule punctuation" style="color:#393A34">:</span><span class="token style language-css atrule" style="color:#00a4db"> landscape</span><span class="token style language-css atrule punctuation" style="color:#393A34">)</span><span class="token style language-css atrule punctuation" style="color:#393A34">;</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">      </span><span class="token style language-css atrule rule" style="color:#00a4db">@import</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule url function" style="color:#d73a49">url</span><span class="token style language-css atrule url punctuation" style="color:#393A34">(</span><span class="token style language-css atrule url string url" style="color:#36acaa">'…/path/to/toucaan/router/portrait.css'</span><span class="token style language-css atrule url punctuation" style="color:#393A34">)</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule keyword" style="color:#00009f">only</span><span class="token style language-css atrule" style="color:#00a4db"> screen </span><span class="token style language-css atrule keyword" style="color:#00009f">and</span><span class="token style language-css atrule" style="color:#00a4db"> </span><span class="token style language-css atrule punctuation" style="color:#393A34">(</span><span class="token style language-css atrule property" style="color:#36acaa">orientation</span><span class="token style language-css atrule punctuation" style="color:#393A34">:</span><span class="token style language-css atrule" style="color:#00a4db"> portrait</span><span class="token style language-css atrule punctuation" style="color:#393A34">)</span><span class="token style language-css atrule punctuation" style="color:#393A34">;</span><span class="token style language-css"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css selector pseudo-class" style="color:#00009f">:root</span><span class="token style language-css"> </span><span class="token style language-css punctuation" style="color:#393A34">{</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">        </span><span class="token style language-css comment" style="color:#999988;font-style:italic">/* Global custom properties like the color palette here…  */</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css">    </span><span class="token style language-css punctuation" style="color:#393A34">}</span><span class="token style language-css"></span><br></span><span class="token-line" style="color:#393A34"><span class="token style language-css"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">style</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">head</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<p>The complete code with coverage for both x and y-axis routes is available on <a href="https://github.com/Toucaan/toucaan/tree/master/toucaan/router" target="_blank" rel="noopener noreferrer" class="">GitHub</a>. Note that a route (for example, mobile on the portrait-axis and tablet on the portrait-axis) can link to the same stylesheet <code>mobile.css</code> file as long as it scales correctly. It has been left up to the author to determine how they wish to design their apps and split the CSS accordingly to meet intrinsic support for their apps.</p>
<p>That is it. Our CSS router is ready.</p>
<p>We can now replace the old and rather lifeless <code>link</code> tag in the document's head with some critical router CSS and quickly transform our app into an intrinsically designed one.</p>
<p>Feel free to peruse the source code of the above router on the <a href="https://github.com/Toucaan/toucaan" target="_blank" rel="noopener noreferrer" class="">Toucaan</a> submodule repository. PRs are welcome.</p>
<p>Share thoughts in the comments below.</p>
<hr>
<p>Credits: With thanks to AJ Alkasmi and <a href="https://bubblin.io/sonicaaaaaa" target="_blank" rel="noopener noreferrer" class="">Sonica Arora</a> for helping me edit this article.</p>]]></content>
        <author>
            <name>Marvin Danig</name>
            <uri>https://github.com/marvindanig</uri>
        </author>
        <category label="router" term="router"/>
        <category label="intrinsic" term="intrinsic"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Orientation Querying.]]></title>
        <id>https://toucaan.com/blog/orientation-querying-with-switch-media-query</id>
        <link href="https://toucaan.com/blog/orientation-querying-with-switch-media-query"/>
        <updated>2023-02-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[---]]></summary>
        <content type="html"><![CDATA[<hr>
<p><em>This article was originally featured on the <a href="https://bubblin.io/scrolls/blog" target="_blank" rel="noopener noreferrer" class="">The Bubblin Blog</a>.</em></p>
<hr>
<p>In the <a class="" href="https://toucaan.com/blog/rethinking-css-frameworks">last chapter</a> we floated the idea of replacing the first anti-pattern that pervades nearly all of the traditional css frameworks.</p>
<p>Here's a quick recap:</p>
<blockquote>
<p><em>Hardcoded width-based MQ breakpoints that separate styles between desktop, mobile, and other category of devices is an anti-pattern.</em></p>
</blockquote>
<p>Imagine a cascading order of MQs that doesn't use hardcoded values as breakpoints at all. Imagine a clear isolation of your design scope that allows you to go deep into the experience you're designing for.</p>
<p>Sounds fun? Great! Let's start with a blank page.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-blank-page">The Blank Page<a href="https://toucaan.com/blog/orientation-querying-with-switch-media-query#the-blank-page" class="hash-link" aria-label="Direct link to The Blank Page" title="Direct link to The Blank Page" translate="no">​</a></h3>
<p>Let's start with a <a href="https://raw.githubusercontent.com/Toucaan/toucaan.research/master/examples/example0.html" target="_blank" rel="noopener noreferrer" class="">blank page</a> on your machine and load that blank page into your favorite browser (desktop).</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ touch example0.html     // Create a new blank HTML file.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ chrome example0.html    // Open this 0-byte file in your browser.</span><br></span></code></pre></div></div>
<p>Now resize the browser window a couple of times, and see what happens. It is just a blank page surrounded by the browser's interface. An all-white (or all-black) blank webpage, which is already responsive!</p>
<p>No css or media query is necessary to scale the UX/UI of a blank page to mobile or desktop, or any other device on the web. It just works! One can resize the browser to any extreme at any aspect ratio, and the blank page will continue to scale correctly. It is not just responsive, it is something more.</p>
<p>It "belongs to" the viewport naturally. <strong>Intrinsically!</strong></p>
<p>Resizing the window reveals the infinite number of "rectangles" of varying size and shape that are possible on the desktop browser. However, all these rectangles, the infinite possibilities, can be divided into only two groups:</p>
<ol>
<li class="">A rectangle in <code>portrait</code> orientation.</li>
<li class="">A rectangle in <code>landscape</code> orientation.</li>
</ol>
<p><img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/marvindanig/assets/master/viewports.png" alt="Resizing a blank page leads to several rectangles" class="img_ev3q"></p>
<p>There's also a third possibility of a square window, the point of inflection where the orientation of the rectangle switches, but there is hardly any device that sports a perfectly square screen, so we can safely ignore the scenario.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="orientation-media-query">Orientation Media Query<a href="https://toucaan.com/blog/orientation-querying-with-switch-media-query#orientation-media-query" class="hash-link" aria-label="Direct link to Orientation Media Query" title="Direct link to Orientation Media Query" translate="no">​</a></h2>
<p>CSS has had great support for <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@media/orientation" target="_blank" rel="noopener noreferrer" class="">Orientation Media Queries</a> for a while.</p>
<p>In the world of web design, the desktop mockups are usually done in landscape orientation whereas the mobile is a portrait view. However, a desktop could be mounted in portrait also.</p>
<p>Shown below is a desktop in portrait orientation:</p>
<p><img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/marvindanig/assets/master/desktop-portrait-landscape.png" alt="Desktop in portrait orientation" class="img_ev3q"></p>
<p>From a design standpoint, we can treat this desktop monitor like a mobile screen but on a physically larger plate of glass. Developers and gamers often use their desktop monitor this way.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="usage-by-orientation">Usage by Orientation<a href="https://toucaan.com/blog/orientation-querying-with-switch-media-query#usage-by-orientation" class="hash-link" aria-label="Direct link to Usage by Orientation" title="Direct link to Usage by Orientation" translate="no">​</a></h2>
<p>Considering that there are only two ways in which a user can hold and view a webpage on a screen, we can assume that there are only two states of design in which a webpage could be rendered.</p>
<p>A layout in landscape mode and a layout in portrait mode.</p>
<p>In reality, however, the usage of devices swings from major-landscape or landscape-only to major-portrait or portrait-only depending on the physical size of the screen.</p>
<p>iPad users, for example, prefer landscape over portrait about ~80% of the time, whereas mobile users are almost always (~96% usage) in portrait. The Apple Watch, which has the tiniest of viewports, is always tied and viewed to the wrist in portrait whereas television sets and projectors are nearly always mounted and viewed in landscape.
Reference <a href="https://ux.stackexchange.com/questions/64749/are-ipads-used-horizontally-or-vertically" target="_blank" rel="noopener noreferrer" class="">data and plots</a>.</p>
<h1>The Two Axes of <a class="" href="https://toucaan.com/docs/core-concepts/intrinsic">Intrinsic Design.</a></h1>
<p>From the usage and the knowledge of fact that there are only two possible orientations in which a webpage could be rendered, we can split the art and science of web design along the two axes of orientation. This topic is discussed at length in the next chapter <a class="" href="https://toucaan.com/blog/a-css-router">A CSS Router</a>.</p>
<p>This will be our first level of querying (the framework architecture) to avoid using the anti-pattern of hardcoded width-based breakpoints to switch layouts. Let's wire up the basic idea of orientation querying:</p>
<div class="language-scss codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-scss codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/* scss */</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">@import url('../toucaan/portrait/mobile.css') only screen and (orientation: portrait);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">@import url('../toucaan/landscape/desktop.css') only screen and (orientation: landscape);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">@media only screen and (orientation: portrait) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  :root { </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    /* Portrait stuff goes in here. */ </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">@media only screen and (orientation: landscape) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  :root { </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    /* Landscape stuff goes in here. */ </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>As you can tell, the MQ above will serve desktop css to the desktop and mobile css to mobiles in portrait mode. It solves most of what the responsive web design achieves using hardcoded width breakpoints, but our framework will still not <em>know</em> exactly what type of device <em>is</em> being served.</p>
<p>The advantage of Orientation Querying is that we can restrict our stylistic choices to only two possible states, and optimize our designs for each orientation independently and <em>orthogonally</em>.</p>
<p>The ruleset shown above may not seem like much at this stage but this orientation switch media query is exactly how Toucaan will deliver scaled type and intrinsic designs to the browser.</p>
<p>We'll discuss that in the next chapter <a class="" href="https://toucaan.com/blog/a-css-router">The CSS Router</a>.</p>]]></content>
        <author>
            <name>Marvin Danig</name>
            <uri>https://github.com/marvindanig</uri>
        </author>
        <category label="toucaan" term="toucaan"/>
        <category label="css" term="css"/>
        <category label="intrinsic" term="intrinsic"/>
        <category label="design" term="design"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Rethinking CSS Frameworks.]]></title>
        <id>https://toucaan.com/blog/rethinking-css-frameworks</id>
        <link href="https://toucaan.com/blog/rethinking-css-frameworks"/>
        <updated>2023-02-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[---]]></summary>
        <content type="html"><![CDATA[<hr>
<p><em>This article was originally featured on the <a href="https://bubblin.io/scrolls/blog" target="_blank" rel="noopener noreferrer" class="">The Bubblin Blog</a>.</em></p>
<hr>
<h1>Introduction</h1>
<p>2023 is <del>almost</del> here.</p>
<p>While the world continues to race towards space age or AI (LLM) driven publishing, let's turn our gaze towards the other more pressing frontier of technology that is relevant to our lives:</p>
<p>CSS. 🙂</p>
<p>Let's look at how we could use the newest powers of css to layout and style our modern web applications. In this post, we will start from the basics of a webpage, i.e., HTML &amp; CSS, and develop a <a class="" href="https://toucaan.com/blog/intrinsic-design">new, more strategic, intelligent, fresh, and maintainable approach</a> to writing css (and framework).</p>
<p>This new framework will be created from scratch and will <em>not</em> follow the aging principles of responsive design. I have named our new css framework <a href="https://toucaan.com/" target="_blank" rel="noopener noreferrer" class="">Toucaan</a>, and you can join me on the journey of building it together. The complete code of this project is available on its <a href="https://github.com/Toucaan" target="_blank" rel="noopener noreferrer" class="">official repositories</a> on GitHub, along with a noddy Toucan logo that I designed using css.</p>
<p><img decoding="async" loading="lazy" alt="Total Banchod Toucaan" src="https://toucaan.com/assets/images/toucaan-total-banner-58141e3045273092d5f154c462ed72f6.jpg" width="9297" height="3099" class="img_ev3q"></p>
<h1>Toucaan–The Tropical css Framework.</h1>
<p>Qualitatively speaking, Toucaan intends to weed out all the unwanted
css that a framework no longer needs. It is a deep dive into the available css standards of the day to discover new and valuable patterns
according to <a class="" href="https://toucaan.com/blog/the-new-landscape-of-the-web">the landscape of new web</a> today.</p>
<p>Who knows, we might even identify a few industry-wide anti-patterns in the process, and we can address those with a few suggestions as we go about building Toucaan ground up.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Official Handbook</div><div class="admonitionContent_BuS1"><p>The latest <a href="https://bubblin.io/book/the-toucaan-framework-by-marvin-danig#frontmatter" target="_blank" rel="noopener noreferrer" class="">official handbook</a> containing some of the more profound ideas and experiments that went into building Toucaan is out!</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-call-it-toucaan">Why call it Toucaan?<a href="https://toucaan.com/blog/rethinking-css-frameworks#why-call-it-toucaan" class="hash-link" aria-label="Direct link to Why call it Toucaan?" title="Direct link to Why call it Toucaan?" translate="no">​</a></h3>
<p>Well, quite simply because I owned the pretty domain name.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="cliché">Cliché"<a href="https://toucaan.com/blog/rethinking-css-frameworks#clich%C3%A9" class="hash-link" aria-label="Direct link to Cliché&quot;" title="Direct link to Cliché&quot;" translate="no">​</a></h4>
<p>Besides, Toucan is a beautiful bird. This aggressive little arboreal ramphastidae symbolizes both beauty and strength. We will base our css framework on this highly social and resilient bird to implement a styling stricture that will cover all the wilderness of devices on the web.</p>
<p>Occasionally—though rarely—we may even spar with other css frameworks using our "colorful, mean and oversized" bill. Therefore—say hello to <strong>Toucaan</strong>—the tropical css framework for the web.</p>
<blockquote>
<p>👉 CSS is hard. But if Toucaan, then you can too.</p>
</blockquote>
<p><img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/marvindanig/assets/master/charlesbabbage.jpg" alt="At each increase of knowledge…" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="existing-frameworks-and-design-philosophy">Existing Frameworks and Design Philosophy<a href="https://toucaan.com/blog/rethinking-css-frameworks#existing-frameworks-and-design-philosophy" class="hash-link" aria-label="Direct link to Existing Frameworks and Design Philosophy" title="Direct link to Existing Frameworks and Design Philosophy" translate="no">​</a></h2>
<p>With Toucaan, we will revisit every industry-wide design principle in existence today. We will test our ideas out in the open. No trick or technique, whether old or new, is off the table, but we will undoubtedly avoid using hacks. There are a few other rules that Toucaan will adhere to, which are described <a href="https://github.com/Toucaan/toucaan.research/blob/master/RULES.md" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<p>Now there are a lot of well-established css frameworks out there like Bootstrap, Bulma, Foundation, Tailwind, and a bunch of strategies like the BEM, OOCSS, or SMACSS (and others) to organize our application code, but we will not try to imitate or wrestle with any of those.</p>
<p>We will instead start Toucaan on a blank slate so that we do not take away most of what these tools have to offer, but we also end up with something more than exists.</p>
<p>Let's begin.</p>
<h1>The New Landscape of The Web</h1>
<p>Before we write our first line of code, let us look at the variety of devices that are a part of the web today. There are many subtle differences between each, starting from device capability to aspect ratio, from browser support to potential accessibility situations, and of course, there is a constant flux of change in css standard itself.</p>
<p>It is essential to understand what the new landscape of the web looks like today and prepare for what we are up against with the new framework. Here are some of the devices that sport a modern web browser:</p>
<p><img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/marvindanig/assets/master/major-devices.png" alt="Major web devices." class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/marvindanig/assets/master/web-devices.png" alt="Devices in the increasing order of physical size." class="img_ev3q"></p>
<p>There is the Apple Watch with a webkit browser, and the iPhones are available in numerous sizes instead of just the one model that Apple used to promote earlier. There are iPads in multiple sizes, with an independent OS, a slew of Android phones and tablets of different form factors, and desktops, laptops, and touchscreen tablet PCs.</p>
<p>Several EVs, like the Tesla Model 3, also sport a web browser under a touch screen. There are intelligent televisions like the LG OLED TV series with a solid stock Chromium-based web browser. Samsung came out with a foldable phone recently, and Microsoft outed a foldable Surface tablet, and we could go on and on like this forever. It is never-ending!</p>
<p><img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/marvindanig/assets/master/tesla-web-browser.png" alt="Web browser on an EV" class="img_ev3q"></p>
<p>One shouldn't forget about the low-powered devices on the budget end of the market as well. Phones like the Nokia 2.2 on Android (with A53 core) or similar are top-rated in their segment.</p>
<p>Given the diversity of devices and the scale of connectivity today, it is safe to assume that the range of devices available today is on a <strong>linear continuum of screen size and form factor</strong>; that the slate of glass or the touch screen is practically resizable freely just like the browser itself.</p>
<h1>The First Issue</h1>
<p>The web is enormous now, and it is undoubtedly much harder to scale apps between the lowest and the highest options available today. Notice that we are not even talking about vendor inconsistencies at this point.</p>
<p>The range of hardware itself is vast enough to void the very first assumption taken by nearly all the major frameworks:</p>
<blockquote>
<p><strong>Hardcoded breakpoints using device width.</strong>.</p>
</blockquote>
<p>Voila, and now we have our first anti-pattern to go after! ( ͡° ͜ʖ ͡°)</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mqs-with-hardcoded-width-breakpoints">MQs with hardcoded width breakpoints.<a href="https://toucaan.com/blog/rethinking-css-frameworks#mqs-with-hardcoded-width-breakpoints" class="hash-link" aria-label="Direct link to MQs with hardcoded width breakpoints." title="Direct link to MQs with hardcoded width breakpoints." translate="no">​</a></h3>
<p>Breakpoints are hardcoded on Tailwind css like this [<a href="https://tailwindcss.com/docs/theme#screens" target="_blank" rel="noopener noreferrer" class="">1</a>, <a href="https://tailwindcss.com/docs/breakpoints/" target="_blank" rel="noopener noreferrer" class="">2</a>], for example.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// tailwind.config.js</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">module</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">exports</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">theme</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">screens</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'sm'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'640px'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Translates to hardcoded break-points in media queries.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'md'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'768px'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'lg'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'1024px'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'xl'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'1280px'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>On Bulma, like so [<a href="https://github.com/jgthms/bulma/blob/768ce95d6976a14b526d41024348d8f9692817e9/css/bulma.css#L1882" target="_blank" rel="noopener noreferrer" class="">1</a>]:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/* Bulma: */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">768</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* Some style classes &amp; rules here. */</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">769</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token atrule punctuation" style="color:#393A34">,</span><span class="token atrule" style="color:#00a4db"> print</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* Same class names but different value-props here. */</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">max-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">1023</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* Repeat the class names but with slightly larger value-props… */</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">1024</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* Again repeat the class names but with even larger value-props…  */</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">1216</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* Dang!, again.*/</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token atrule rule" style="color:#00a4db">@media</span><span class="token atrule" style="color:#00a4db"> screen </span><span class="token atrule keyword" style="color:#00009f">and</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule punctuation" style="color:#393A34">(</span><span class="token atrule property" style="color:#36acaa">min-width</span><span class="token atrule punctuation" style="color:#393A34">:</span><span class="token atrule" style="color:#00a4db"> </span><span class="token atrule number" style="color:#36acaa">1408</span><span class="token atrule unit" style="color:#00a4db">px</span><span class="token atrule punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* Meh. */</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>And so on. As you can see, these MQ breakpoints are hard-coded values of screen width along which we split and silo the application's css. But there is a problem with this approach. Screen width varies greatly, from an Apple Watch, with sub-inch screen width, to a desktop or even a large television monitor with a width measured in feet. And then, for each silo, we repeat the css classes with only slightly different property values to <em>manually</em> tie the page together.</p>
<p>Even typography and spacing need scaling according to the silo in play.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-off-of-tailwind">Example off of Tailwind:<a href="https://toucaan.com/blog/rethinking-css-frameworks#example-off-of-tailwind" class="hash-link" aria-label="Direct link to Example off of Tailwind:" title="Direct link to Example off of Tailwind:" translate="no">​</a></h4>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">+mobile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  +</span><span class="token function" style="color:#d73a49">typography-size</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'mobile'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">+tablet</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  +</span><span class="token function" style="color:#d73a49">typography-size</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'tablet'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">+touch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  +</span><span class="token function" style="color:#d73a49">typography-size</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'touch'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">+desktop</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  +</span><span class="token function" style="color:#d73a49">typography-size</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'desktop'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">+widescreen</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  +</span><span class="token function" style="color:#d73a49">typography-size</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'widescreen'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">+fullhd</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  +</span><span class="token function" style="color:#d73a49">typography-size</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'fullhd'</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>Every existing css framework follows this pattern. A new breakpoint is added to the framework every time the manufacturer rolls out a new device segment. The question is: How many breakpoints will cover everything on the web today? And at what point will there be all too many?</p>
<p>The web before the iPhone was desktop-only. It was a simple time then. With the rise of smartphones, we got <em>the mobile web</em>, and in the process, we walked into this tunnel vision of using width-based breakpoints. But what now?</p>
<p>Width-based MQ approach worked great initially, with context switching between desktop and mobile only, but now with so many types of devices and form factors to serve on, boy, do we need a new strategy.</p>
<p>While it would be nice to continue doing what we have been doing for years, deep inside, we all agree that hardcoded MQs based on screen width are anti-patterns.</p>
<p>Toucaan will try to do away with these first. But is there a better way?</p>
<p>The next chapter discusses that with <a class="" href="https://toucaan.com/blog/orientation-querying-with-switch-media-query">Orientation Querying</a>.</p>
<hr>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="credits">Credits:<a href="https://toucaan.com/blog/rethinking-css-frameworks#credits" class="hash-link" aria-label="Direct link to Credits:" title="Direct link to Credits:" translate="no">​</a></h4>
<p>Super thankful to <a href="https://bubblin.io/sonica" target="_blank" rel="noopener noreferrer" class="">Sonica Arora</a>, Abigail Rennmeyer, Varun Singh, and <a href="https://nilesh.trivedi.pw/" target="_blank" rel="noopener noreferrer" class="">Nilesh Trivedi</a> for reviewing this post for clarity.</p>]]></content>
        <author>
            <name>Marvin Danig</name>
            <uri>https://github.com/marvindanig</uri>
        </author>
        <category label="toucaan" term="toucaan"/>
        <category label="css" term="css"/>
        <category label="frameworks" term="frameworks"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Using svh, lvh, or dvh with Toucaan]]></title>
        <id>https://toucaan.com/blog/how-to-use-the-new-css-variant-units-svh-lvh-dvh-on-mobile</id>
        <link href="https://toucaan.com/blog/how-to-use-the-new-css-variant-units-svh-lvh-dvh-on-mobile"/>
        <updated>2023-01-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[CSS has had viewport units like vw, vh, vmin, and vmax for years with a great browser support. These units work fine in nearly all the scenarios except on a mobile where the height of the viewport (unit) changes as the page is scrolled up and the browser interface hides away.]]></summary>
        <content type="html"><![CDATA[<p>CSS has had viewport units like <code>vw</code>, <code>vh</code>, <code>vmin</code>, and <code>vmax</code> for years with a great browser support. These units work fine in nearly all the scenarios except on a mobile where the height of the viewport (unit) changes as the page is scrolled up and the browser interface hides away.</p>
<p>Recently, a few new level-4 css units were announced as browser standards to address this issue.</p>
<p>Since 2015, the value of <code>100vh</code> has usually matched the larger viewport state (see figure below). The problem with this implementation was that some of the UX/UI of a "full screen" app fell below-the-fold due to the browser interface taking up that much space. This may appear like a minor nit, but it has had a significant impact on mobile web experience over the years.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-svw-lvh-and-dvh-units">The <code>svw</code>, <code>lvh</code>, and <code>dvh</code> units<a href="https://toucaan.com/blog/how-to-use-the-new-css-variant-units-svh-lvh-dvh-on-mobile#the-svw-lvh-and-dvh-units" class="hash-link" aria-label="Direct link to the-svw-lvh-and-dvh-units" title="Direct link to the-svw-lvh-and-dvh-units" translate="no">​</a></h2>
<ol>
<li class=""><code>svh</code> - small viewport height.</li>
<li class=""><code>lvh</code> - long viewport height.</li>
<li class=""><code>dvh</code> - dynamic viewport height.</li>
</ol>
<p>According to the spec, the small viewport is when the browser interface (the url/address bar etc.) is fully visible, long viewport is when the browser controls have retracted, and <em>dynamic</em> viewport unit is either of the two values above that the browser will set natively depending on the state.</p>
<p><img decoding="async" loading="lazy" alt="svh lvh dvh on Android" src="https://toucaan.com/assets/images/lvh-svh-android-7a878e02b1df730e97a6e1e6832833e2.jpg" title="lvh svh dvh on android" width="1600" height="1328" class="img_ev3q"></p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token selector class" style="color:#00009f">.element</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token unit">dvh</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* See result in the first screenshot */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.element</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token unit">svh</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* See result in the second screenshot */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.element</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token unit">lvh</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* See result in the third screenshot */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-caution admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Broken on The Desktop</div><div class="admonitionContent_BuS1"><p>Apparently, the new height variant unit is broken on the <a href="https://bugs.webkit.org/show_bug.cgi?id=242758" target="_blank" rel="noopener noreferrer" class="">macos desktop</a>.</p><p>But since Toucaan uses a css router to separate and serve stylesheets according to the class of medium, we can restrict usage of the new viewport variants to only the mobile and tablet interfaces where the support is guaranteed. We can continue to solve the desktop UI with the older viewport units.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="intrinsic-determinism">Intrinsic Determinism<a href="https://toucaan.com/blog/how-to-use-the-new-css-variant-units-svh-lvh-dvh-on-mobile#intrinsic-determinism" class="hash-link" aria-label="Direct link to Intrinsic Determinism" title="Direct link to Intrinsic Determinism" translate="no">​</a></h3>
<p>Among the <a href="https://caniuse.com/viewport-unit-variants" target="_blank" rel="noopener noreferrer" class="">new variants of the viewport units</a>, we also have the <code>dvmin</code> &amp; <code>dvmax</code> css units. These two form the backbone of our <a href="https://toucaan.com/docs/typography/introduction.md" target="_blank" rel="noopener noreferrer" class="">font-size utility variables</a> on mobile.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="example">Example:<a href="https://toucaan.com/blog/how-to-use-the-new-css-variant-units-svh-lvh-dvh-on-mobile#example" class="hash-link" aria-label="Direct link to Example:" title="Direct link to Example:" translate="no">​</a></h4>
<p>Here's a quick real world example explaining how to use <code>dvmax</code> on your mobile views with Toucaan:</p>
<p>To apply a predetermined page-length to your webpage:</p>
<div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/* On mobile: */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector" style="color:#00009f">body</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">height</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">calc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">10</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token unit">dvmax</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/* A 10-pages long scroll for mobile. */</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Learn more about the <a href="https://toucaan.com/docs/web-design/pagination.md" target="_blank" rel="noopener noreferrer" class="">Concept of Firm Pagination</a> for intrinsically scaling UX/UI.</p>]]></content>
        <author>
            <name>Marvin Danig</name>
            <uri>https://github.com/marvindanig</uri>
        </author>
        <category label="toucaan" term="toucaan"/>
        <category label="intrinsic" term="intrinsic"/>
        <category label="deterministic" term="deterministic"/>
        <category label="design" term="design"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Meet Intrinsic Design]]></title>
        <id>https://toucaan.com/blog/intrinsic-design</id>
        <link href="https://toucaan.com/blog/intrinsic-design"/>
        <updated>2022-08-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[---]]></summary>
        <content type="html"><![CDATA[<hr>
<p>Welcome to the <a href="https://toucaan.com/blog" target="_blank" rel="noopener noreferrer" class="">Toucaan Blog</a>. 🎉</p>
<p>Here you'll find articles and discussions on <strong>intrinsic application design</strong>.</p>
<p><img decoding="async" loading="lazy" alt="Total Banchod Toucaan" src="https://toucaan.com/assets/images/toucaan-total-banner-58141e3045273092d5f154c462ed72f6.jpg" width="9297" height="3099" class="img_ev3q"></p>
<h1>What is Toucaan?</h1>
<p>Toucaan is a <strong>stack-agnostic vanilla styling framework for mobile apps and the web</strong>. Meaning it doesn't require javascript or any other frontend library to work.</p>
<p>Toucaan can be used to design intrinsically scaled web and mobile apps using the web stack. It is easy to <a class="" href="https://toucaan.com/docs/getting-started">start using</a> Toucaan in your project.</p>
<p>Clone the <code>toucaan</code> submodule inside your project and start designing your mockups. Read more about <a class="" href="https://toucaan.com/docs/getting-started">setting up</a> and <a class="" href="https://toucaan.com/docs/configuration">configuration</a>.</p>
<h1>What is Intrinsic Design?</h1>
<p>Intrinsic in the context of application design implies designing for an experience that <em>belongs</em> to the user's device. This term was coined by the one and only Jen Simmons while working at Mozilla on flex and grid-based layouts, but a curious mind could easily hop layouts and explore what <em>belongs</em> and what doesn't on a given medium for a whole other lot of design vocabulary.</p>
<p>Moreover, there is a need to know <a class="" href="https://toucaan.com/blog/the-new-landscape-of-the-web">what devices are on the web</a> today because users are no longer limited to mobile or desktop.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-is-toucaan-different-from-other-css-frameworks">How is Toucaan different from other css frameworks?<a href="https://toucaan.com/blog/intrinsic-design#how-is-toucaan-different-from-other-css-frameworks" class="hash-link" aria-label="Direct link to How is Toucaan different from other css frameworks?" title="Direct link to How is Toucaan different from other css frameworks?" translate="no">​</a></h2>
<p>Toucaan is very different from other css frameworks in several ways.</p>
<p>It transcends the limitations of Responsive Web Design with a new deterministic approach to design that offers both granular control and long-term maintainability at scale.</p>
<p>Toucaan avoids several common anti-patterns and hardcoded assumptions that other frameworks force on the end users. It does not make arbitrary assumptions about the browser's capabilities or the user's device and allows developers to create meaningful interfaces that bank on the <strong>intrinsic qualities</strong> of the medium instead. You know, qualities like physical size, orientation, foldability, touch or no touch, or even fullscreen view enabled in a notched environment, for example.</p>
<p>Briefly, Toucaan outshines the traditional css frameworks on at least four major fronts:</p>
<ol>
<li class="">Complete separation of the design language for different classes of devices. Toucaan uses <a class="" href="https://toucaan.com/blog/a-css-router">a css router</a> to serve the suitable stylesheet.</li>
<li class="">A mathematically grounded and <a class="" href="https://toucaan.com/blog/intrinsic-typography">intrinsically scaling type</a> system.</li>
<li class="">No heavy <code>reset</code> or <code>normalize</code> css to bulldoze the web browser anymore. Toucaan replaces the reset with a flexible <a class="" href="https://toucaan.com/blog/baseline-css">baseline</a> that can be customized for each app differently.</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="support">Support<a href="https://toucaan.com/blog/intrinsic-design#support" class="hash-link" aria-label="Direct link to Support" title="Direct link to Support" translate="no">​</a></h3>
<p>Toucaan has intrinsic support for new devices on the web like the Apple Watch, EVs that sport a web browser like the V9 browser on the Tesla Model S and Tesla Model 3, bendable or foldable smartphones and tablets, large projectors, and even smart TVs.</p>
<p>Toucaan snuck out of the bag while we were working on <a href="https://bubblin.io/" target="_blank" rel="noopener noreferrer" class="">Bubblin</a> &amp; <a href="https://goose.red/" target="_blank" rel="noopener noreferrer" class="">Red Goose</a>, and it is still very much in development. The css standard is advancing rapidly, and we expect to discover new patterns and styling combinations that work better for the developer and the end user in the long run.</p>
<p>Today, we announce the first public beta version of Toucaan to the general public after three months in production at the <a href="https://goose.red/" target="_blank" rel="noopener noreferrer" class="">Red Goose</a>. Sonica, Satie, &amp; I wish to invite you to try Toucaan to build your interfaces and share your thoughts on the experience.</p>
<p>In the next few months, we hope to discover how to introduce and standardize <em>intrinsicality</em> in modern application design—an approach that is <em>not</em> encumbered by the limitations of responsive web.</p>
<p>Thank you for reading!</p>]]></content>
        <author>
            <name>Marvin Danig</name>
            <uri>https://github.com/marvindanig</uri>
        </author>
        <author>
            <name>Sonica Arora</name>
            <uri>https://github.com/soarora</uri>
        </author>
        <category label="design" term="design"/>
        <category label="toucaan" term="toucaan"/>
        <category label="css" term="css"/>
        <category label="intrinsic" term="intrinsic"/>
    </entry>
</feed>