<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Polypane Blog]]></title><description><![CDATA[Build responsive, accessible and fast sites with a stand-alone browser. All the tools you need in one app.]]></description><link>https://polypane.app</link><generator>GatsbyJS</generator><lastBuildDate>Fri, 26 Jan 2024 12:18:23 GMT</lastBuildDate><item><title><![CDATA[My take on fading content using transparent gradients in CSS]]></title><description><![CDATA[Two days ago Amit Merchant wrote a blog post on  a technique to fade text out  using an overlaid element based on the design of  Trunk.io…]]></description><link>https://polypane.app/blog/my-take-on-fading-content-using-transparent-gradients-in-css/</link><guid isPermaLink="false">https://polypane.app/blog/my-take-on-fading-content-using-transparent-gradients-in-css/</guid><pubDate>Fri, 19 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Two days ago Amit Merchant wrote a blog post on &lt;a href=&quot;https://www.amitmerchant.com/fading-content-using-transparent-gradients-in-css/&quot;&gt;a technique to fade text out&lt;/a&gt; using an overlaid element based on the design of &lt;a href=&quot;https://trunk.io&quot;&gt;Trunk.io&lt;/a&gt;. He walks through how he came to this solution so go check out the article to see how it&amp;#x27;s built. Here&amp;#x27;s the end result:&lt;/p&gt;&lt;div style=&quot;position:relative;font-family:system-ui;font-weight:bold;max-width:30rem;color:white;background:black;padding:20px;border-radius:20px;margin:2rem auto 0&quot;&gt;&lt;span&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec non pharetra lorem, ac feugiat nunc. Maecenas ac aliquet turpis. Pellentesque interdum turpis tortor, ac rhoncus nisi egestas et. Sed in ante diam. Proin ac vehicula velit. Ut fringilla mauris quis lobortis efficitur. &lt;/span&gt;&lt;span style=&quot;display:block;position:absolute;bottom:0;left:0;width:100%;height:80%;border-radius:20px;background:linear-gradient(180deg, transparent 0, black 100%)&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;The effect looks great but it has two downsides:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The text behind the gradient is no longer selectable&lt;/li&gt;&lt;li&gt;The effect only works on solid background colors.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Both of these are also present in the Trunk.io design that Amit based this on. The first issue is easy to fix: you add this to your overlaid element:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;user-select&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That will prevent the overlaid element from capturing mouse events, so you can select words behind the gradient as well.&lt;/p&gt;&lt;p&gt;The second downside requires a different approach if we want the same effect to work with a non-solid background like an image or gradient. To make it work there, we need to &lt;strong&gt;actually make the text fade&lt;/strong&gt;, rather than make it look like it fades.&lt;/p&gt;&lt;p&gt;Modern CSS gives us not one, but two different approaches to achieve this. They have a slightly different result, so we&amp;#x27;ll go over each one and discuss their differences.&lt;/p&gt;&lt;p&gt;For both approaches, we&amp;#x27;re going to use the same HTML structure:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; Lorem ipsum dolor sit amet consectetur [...] &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For this to work, we need an additional wrapper element around the text. In this case we&amp;#x27;re using a &lt;code class=&quot;language-text&quot;&gt;p&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;span&lt;/code&gt;, but if you already have a different container element around your &lt;code class=&quot;language-text&quot;&gt;p&lt;/code&gt; you could use that instead.&lt;/p&gt;&lt;p&gt;To make the effect easy to see, we&amp;#x27;ll give our &lt;code class=&quot;language-text&quot;&gt;p&lt;/code&gt; some default styling and add a gaudy background gradient:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;linear-gradient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;to right&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; blue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; red&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;30rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border-radius&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 20px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; system-ui&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; bold&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; white&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The end result looks like this:&lt;/p&gt;&lt;p style=&quot;position:relative;background:linear-gradient(to right, blue, red);font-family:system-ui;font-weight:bold;max-width:30rem;color:white;padding:20px;border-radius:20px;margin:2rem auto 0&quot;&gt;&lt;span&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec non pharetra lorem, ac feugiat nunc. Maecenas ac aliquet turpis. Pellentesque interdum turpis tortor, ac rhoncus nisi egestas et. Sed in ante diam. Proin ac vehicula velit. Ut fringilla mauris quis lobortis efficitur.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;With that as our backdrop, let&amp;#x27;s look at the two different ways to achieve faded content: &lt;code class=&quot;language-text&quot;&gt;background-clip&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;mask-image&lt;/code&gt;.&lt;/p&gt;&lt;h2 id=&quot;technique-one-background-clip&quot;&gt;Technique one: background-clip&lt;/h2&gt;&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;background-clip&lt;/code&gt; CSS property lets you define where your background should be restricted to: the entire element (&lt;code class=&quot;language-text&quot;&gt;border-box&lt;/code&gt;, which is the default), inside the border with &lt;code class=&quot;language-text&quot;&gt;padding-box&lt;/code&gt; or sit only behind the content with &lt;code class=&quot;language-text&quot;&gt;content-box&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;But background-clip has a fourth value of &lt;code class=&quot;language-text&quot;&gt;text&lt;/code&gt;. Setting this will restrict the background to be visible only behind the text.&lt;/p&gt;&lt;p&gt;Just doing that doesn&amp;#x27;t &lt;em&gt;actually&lt;/em&gt; change the way it looks, because the text also has a color that overlays the background. When using &lt;code class=&quot;language-text&quot;&gt;background-clip: text&lt;/code&gt; you want to combine it with &lt;code class=&quot;language-text&quot;&gt;color: transparent&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Lastly to make that text fade, we&amp;#x27;re going to set the background to a linear gradient that fades from our text color (white) to transparent.&lt;/p&gt;&lt;p&gt;Combined, this is what that looks like:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;span&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;linear-gradient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;to bottom&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; white&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; transparent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; transparent&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-clip&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; text&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And here is the result:&lt;/p&gt;&lt;p style=&quot;position:relative;background:linear-gradient(to right, blue, red);font-family:system-ui;font-weight:bold;max-width:30rem;color:white;padding:20px;border-radius:20px;margin:2rem auto 0&quot;&gt;&lt;span style=&quot;display:block;background:linear-gradient(to bottom, white, transparent);color:transparent;background-clip:text&quot;&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec non pharetra lorem, ac feugiat nunc. Maecenas ac aliquet turpis. Pellentesque interdum turpis tortor, ac rhoncus nisi egestas et. Sed in ante diam. Proin ac vehicula velit. Ut fringilla mauris quis lobortis efficitur.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Notice how the text fades into the background evenly across the gradient, and how each word remains selectable because we&amp;#x27;re not overlaying anything on top of the text.&lt;/p&gt;&lt;h3 id=&quot;browser-support&quot;&gt;Browser support&lt;/h3&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;background-clip: text&lt;/code&gt; is supported in all evergreen browsers and has been for quite a while (support in all evergreen browsers since 2016 when it landed in Firefox) so it&amp;#x27;s save to use.&lt;/p&gt;&lt;p&gt;Until fairly recently, Safari (2020) and Chromium (December 2023) required you to use &lt;code class=&quot;language-text&quot;&gt;-webkit-background-clip&lt;/code&gt; so for backwards compatibility you will probably also include the prefixed version:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;span&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;linear-gradient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;to bottom&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; white&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; transparent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; transparent&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-webkit-background-clip&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; text&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-clip&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; text&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Make sure to put the prefixed version &lt;em&gt;before&lt;/em&gt; the standard declaration. In CSS the last declaration wins, so the standard will overwrite the prefixed version and be used instead&lt;/p&gt;&lt;h3 id=&quot;downsides&quot;&gt;Downsides&lt;/h3&gt;&lt;p&gt;This technique works well, but it has a downside. Because the text is now transparent, it takes on the color of the background. If your content had different colors for elements like links or other elements like emoji, those colors are either replaced or they don&amp;#x27;t fade:&lt;/p&gt;&lt;p style=&quot;position:relative;background:linear-gradient(to right, blue, red);font-family:system-ui;font-weight:bold;max-width:30rem;color:white;padding:20px;border-radius:20px;margin:2rem auto 0&quot;&gt;&lt;span style=&quot;display:block;background:linear-gradient(to bottom, white, transparent);color:transparent;background-clip:text&quot;&gt;Emojis: 😬🫣😱🚀✨Lorem ipsum dolor sit amet, consectetur adipiscing elit.&lt;br/&gt;Lorem &lt;a href=&quot;#&quot; style=&quot;color:hotpink&quot;&gt;My hotpink link&lt;/a&gt; ipsum dolor sit amet, consectetur&lt;/span&gt;&lt;/p&gt;&lt;p&gt;If you want to keep those as well as fade the content out, we need a different technique.&lt;/p&gt;&lt;h2 id=&quot;technique-two-mask-image&quot;&gt;Technique two: mask-image&lt;/h2&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;mask-image&lt;/code&gt; lets you use an image (or SVG or gradient) as a mask layer, similar to how that works in graphics editors.&lt;/p&gt;&lt;p&gt;Usually the alpha channel of the mask image is used to determine which parts of your element are visible and which ones aren&amp;#x27;t, but you can set &lt;code class=&quot;language-text&quot;&gt;mask-mode&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;luminance&lt;/code&gt; and use a black-white mask instead. For our purpose though, the alpha channel is fine.&lt;/p&gt;&lt;p&gt;Here&amp;#x27;s what the CSS looks like for that:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;span&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;mask-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;linear-gradient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;to bottom&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; white&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; transparent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As well as the rendered result:&lt;/p&gt;&lt;p style=&quot;position:relative;background:linear-gradient(to right, blue, red);font-family:system-ui;font-weight:bold;max-width:30rem;color:white;padding:20px;border-radius:20px;margin:2rem auto 0&quot;&gt;&lt;span style=&quot;display:block;mask-image:linear-gradient(to bottom, white, transparent)&quot;&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec non pharetra lorem, ac feugiat nunc. Maecenas ac aliquet turpis. Pellentesque interdum turpis tortor, ac rhoncus nisi egestas et. Sed in ante diam. Proin ac vehicula velit. Ut fringilla mauris quis lobortis efficitur.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Like the &lt;code class=&quot;language-text&quot;&gt;background-clip&lt;/code&gt; technique the words are still individually selectable, and text fades into the background evenly across the gradient. Because this is a mask across your element however, the specific colors of your text are preserved.&lt;/p&gt;&lt;p style=&quot;position:relative;background:linear-gradient(to right, blue, red);font-family:system-ui;font-weight:bold;max-width:30rem;color:white;padding:20px;border-radius:20px;margin:2rem auto 0&quot;&gt;&lt;span style=&quot;display:block;mask-image:linear-gradient(to bottom, white, transparent);-webkit-mask-image:linear-gradient(to bottom, white, transparent)&quot;&gt;Emojis: 😬🫣😱🚀✨Lorem ipsum dolor sit amet, consectetur adipiscing elit.&lt;br/&gt;Lorem &lt;a href=&quot;#&quot; style=&quot;color:hotpink&quot;&gt;My hotpink link&lt;/a&gt; ipsum dolor sit amet, consectetur adipiscing elit. Donec non pharetra lorem&lt;/span&gt;&lt;/p&gt;&lt;h3 id=&quot;browser-support-1&quot;&gt;Browser support&lt;/h3&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;mask-image&lt;/code&gt; has been supported across evergreen browsers since 2017, so a little less than &lt;code class=&quot;language-text&quot;&gt;background-clip&lt;/code&gt;. The earlier mentioned &lt;code class=&quot;language-text&quot;&gt;mask-mode&lt;/code&gt; has only been available since December 2023 when support landed in Chromium (both Safari and Firefox had support for it since 2022 and 2017 respectively). Currently for Edge support you still need to include the prefixed &lt;code class=&quot;language-text&quot;&gt;-webkit-&lt;/code&gt; version:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;span&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-webkit-mask-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;linear-gradient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;to bottom&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; white&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; transparent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;mask-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;linear-gradient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;to bottom&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; white&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; transparent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;#x27;m not sure why Edge specifically has this, as it&amp;#x27;s running the same version of Chromium as Chrome and Polypane, which don&amp;#x27;t need it. So that&amp;#x27;s a little complication you have to be aware of.&lt;/p&gt;&lt;h3 id=&quot;downsides-1&quot;&gt;Downsides&lt;/h3&gt;&lt;p&gt;Other than the relatively recent browser support for the unprefixed version, this technique doesn&amp;#x27;t have any downsides. It&amp;#x27;s a little more flexible than &lt;code class=&quot;language-text&quot;&gt;background-clip&lt;/code&gt; because it doesn&amp;#x27;t change the color of your text, though that might be a downside if you &lt;em&gt;do&lt;/em&gt; want to change the color of your text.&lt;/p&gt;&lt;h2 id=&quot;fading-text-content&quot;&gt;Fading text content&lt;/h2&gt;&lt;p&gt;So that&amp;#x27;s two ways to fade text content. &lt;code class=&quot;language-text&quot;&gt;mask-image&lt;/code&gt; is a little more flexible, but &lt;code class=&quot;language-text&quot;&gt;background-clip&lt;/code&gt; is a little more widely supported. Both are great ways to fade text content, and I hope you can use them in your projects!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 17.1]]></title><description><![CDATA[Polypane 17.1 is primarily a bugfix and security release, but contains a few new features and newly supported browser extensions, as well as…]]></description><link>https://polypane.app/blog/polypane-17-1/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-17-1/</guid><pubDate>Thu, 18 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 17.1 is primarily a bugfix and security release, but contains a few new features and newly supported browser extensions, as well as an updated Chromium.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;What&amp;#x27;s &lt;a href=&quot;/&quot;&gt;Polypane&lt;/a&gt;?&lt;/strong&gt; Polypane is the web browser for ambitious web developers. It&amp;#x27;s a stand-alone browser that shows
sites in multiple fully synced &lt;em&gt;panes&lt;/em&gt; and helps you make your site more responsive, more accessible and faster.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;new-social-media-designs&quot;&gt;New Social media designs&lt;/h2&gt;&lt;p&gt;Twitter/X updated their card design to show the title overlaid on the image and the domain below it, and Mastodon is now more lenient in the OG images it accepts. Both are now supported in Polypane.&lt;/p&gt;&lt;img src=&quot;static/x-7396fa0624ab6356a383cb8a6486eb40.png&quot; alt=&quot;Twitter/X card design&quot; class=&quot;imgshadow&quot;/&gt;&lt;h2 id=&quot;new-browser-extensions&quot;&gt;New browser extensions&lt;/h2&gt;&lt;p&gt;Polypane now supports the Bitwarden password manager and the User Javascript and CSS extension.&lt;/p&gt;&lt;p&gt;We&amp;#x27;ve added support for the &lt;code class=&quot;language-text&quot;&gt;chrome.tabs.getSelected&lt;/code&gt; API, as well as improved the way &lt;code class=&quot;language-text&quot;&gt;window.open&lt;/code&gt; works from inside extension popups. This means that more extensions will work in Polypane.&lt;/p&gt;&lt;h2 id=&quot;chromium-security-fixes&quot;&gt;Chromium security fixes&lt;/h2&gt;&lt;p&gt;Polypane 17.1 contains fixes for 5 security issues and now runs Chromium 120.0.6099.216. We recommend updating as soon as possible.&lt;/p&gt;&lt;h2 id=&quot;performance-improvements&quot;&gt;Performance improvements&lt;/h2&gt;&lt;h3 id=&quot;hoverblur-styles&quot;&gt;Hover/Blur styles&lt;/h3&gt;&lt;p&gt;For pages with lots of JavaScript, sometimes the synced hover style would get &amp;quot;stuck&amp;quot; and not update anymore. We&amp;#x27;ve improved our syncing algorithm so that no longer happens, and this has also improved the performance of the syncing.&lt;/p&gt;&lt;h3 id=&quot;pages-with-many-links-or-headings&quot;&gt;Pages with many links or headings&lt;/h3&gt;&lt;p&gt;Polypane now uses a different method to parse the accessible name of links and headings on a page, which is two orders of magnitude faster than the previous implementation. This makes the Outline panel faster but should also noticably improve performance.&lt;/p&gt;&lt;p&gt;If you notice any issues with the accessible naming of links or headings in the outline panel, please &lt;a href=&quot;/support/&quot;&gt;let us know&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;get-polypane-171&quot;&gt;Get Polypane 17.1&lt;/h2&gt;&lt;p&gt;Polypane is available for Windows, Mac and Linux (.deb or AppImage) in both 64 bit and ARM versions.&lt;/p&gt;&lt;p&gt;Polypane automatically updates on Mac, Windows and on Linux when using the AppImage. Otherwise, go to
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; to download the latest version!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Try it for free&lt;/a&gt;.&lt;/strong&gt; No credit card needed.&lt;/p&gt;&lt;h2 id=&quot;polypane-171-changelog&quot;&gt;Polypane 17.1 Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;New&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Twitter/X card design&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Mastodon design&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Support for Bitwarden extension&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Support for User Javascript and CSS extension&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Chromium 120.0.6099.216&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improved&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Support for more browser extensions&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Performance for pages with many links or headings (Thanks Sascha!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Faster and more dependable hover and unhover syncing (Thanks Todd!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Console: Different styling between strings and numbers&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Console: Different styling for no return value and empty string&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Support for Vite CSS HMR (Thanks Joshua!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Better logic for determining canonical hostnames&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Security&lt;/strong&gt; Fix for CVE-2023-7024&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Security&lt;/strong&gt; Fix for chromium:1506535&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Security&lt;/strong&gt; Fix for CVE-2024-0518&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Security&lt;/strong&gt; Fix for CVE-2024-0517&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Security&lt;/strong&gt; Fix for chromium:1517354&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; On first launch the detached panel would be empty&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent flickering of devtools when moving to different tab on macos&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; New Tab not working for some users after upgrading to 17.0.0&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Applying workspaces from the command bar now works&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Opening urls from extension on Linux&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Zoom-to-fit of individual panes would not zoom out enough&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; The shortcut F8 is no longer being overwritten&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; UI bug for the address bar in full mode on small widths&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Links to docs and support from the Help menu&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Experimental Chromium Web Platform Features]]></title><description><![CDATA[Polypane ships with the "experimental web platform features" flag enabled. This means you get to use a whole bunch of cool features as they…]]></description><link>https://polypane.app/blog/experimental-chromium-web-platform-features/</link><guid isPermaLink="false">https://polypane.app/blog/experimental-chromium-web-platform-features/</guid><pubDate>Tue, 19 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane ships with the &amp;quot;experimental web platform features&amp;quot; flag enabled. This means you get to use a whole bunch of cool features as they&amp;#x27;re being experimented with in Chromium.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;What&amp;#x27;s &lt;a href=&quot;/&quot;&gt;Polypane&lt;/a&gt;?&lt;/strong&gt; Polypane is the web browser for ambitious web developers. It&amp;#x27;s a stand-alone browser that shows
sites in multiple fully synced &lt;em&gt;panes&lt;/em&gt; and helps you make your site more responsive, more accessible and faster.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;It&amp;#x27;s the same flag that many blog posts tell you to enable when explaining a new and upcoming feature (which, again, you don&amp;#x27;t need to set in Polypane). But what exactly do you enable when you set that flag?&lt;/p&gt;&lt;div style=&quot;position:relative;text-align:center;padding-top:5rem&quot;&gt;&lt;div class=&quot;Flask-styles-module--isolation--3-eOL&quot;&gt;&lt;div class=&quot;Flask-styles-module--ball1--9FJjp&quot;&gt;&lt;/div&gt;&lt;div class=&quot;Flask-styles-module--ball2--P2xVC&quot;&gt;&lt;/div&gt;&lt;div class=&quot;Flask-styles-module--ball3--ZfpFP&quot;&gt;&lt;/div&gt;&lt;div class=&quot;Flask-styles-module--ball4--1aZII&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;Flask-styles-module--flask--eEZlo&quot; width=&quot;128&quot; height=&quot;128&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;2&quot; stroke=&quot;rgb(16, 125, 181)&quot; fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M9 3l6 0&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M10 9l4 0&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M10 3v6l-8 11a.7 .7 0 0 0 .5 1h19a.7 .7 0 0 0 .5 -1l-8 -11v-6&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;h2 id=&quot;which-features-are-deemed-experimental&quot;&gt;Which features are deemed &amp;quot;experimental&amp;quot;?&lt;/h2&gt;&lt;p&gt;Well that question is a little hard to answer. There&amp;#x27;s &lt;a href=&quot;https://chromestatus.com&quot;&gt;chromestatus.com&lt;/a&gt; but that doesn&amp;#x27;t make a difference between features behind the experimental flag, and features behind any other flag.&lt;/p&gt;&lt;p&gt;The only place to get a proper overview is in the Chromium source itself in a file called &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/refs/tags/120.0.6099.9:third_party/blink/renderer/platform/runtime_enabled_features.json5&quot;&gt;runtime_enabled_features.json5&lt;/a&gt;. This lists &lt;em&gt;all&lt;/em&gt; the flags along with their status: stable, test or experimental.&lt;/p&gt;&lt;p&gt;Anything that&amp;#x27;s flagged as experimental falls, you guessed it, under the &amp;quot;experimental web platform features&amp;quot; flag. But you&amp;#x27;ll have to hunt for them, and because it&amp;#x27;s a configuration file you get just the name and the status, nothing else.&lt;/p&gt;&lt;h2 id=&quot;a-better-overview&quot;&gt;A better overview&lt;/h2&gt;&lt;p&gt;So we built a better overview, getting the experimental features for the last 3 versions as well as 2 upcoming versions of Chromium from that json5 file and then finding the accompanying description on Chromestatus when that&amp;#x27;s available (which is not always the case).&lt;/p&gt;&lt;p&gt;You can find the page here: &lt;a href=&quot;/experimental-web-platform-features/&quot;&gt;experimental chromium web platform features&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In that list, you can for example see that &lt;code class=&quot;language-text&quot;&gt;field-sizing&lt;/code&gt; is now enabled, which is a new CSS feature that will let textareas and inputs automatically expand to their contents. Previously this required JavaScript or CSS trickery. That&amp;#x27;s now ready for you to use and play with in Polypane!&lt;/p&gt;&lt;h3 id=&quot;finding-features&quot;&gt;Finding features&lt;/h3&gt;&lt;p&gt;On the page there&amp;#x27;s a small set of filters to help you find the feature you&amp;#x27;re looking for.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;You can search the flag names to filter down the list&lt;/li&gt;&lt;li&gt;You can show or hide the two upcoming version of Chromium (by default we start with the current release)&lt;/li&gt;&lt;li&gt;You can switch between showing &lt;em&gt;all&lt;/em&gt; the experimental features in each release, or just the features that were newly added in that release.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;That makes it easy to find more info on a specific experimental feature, or get a general overview of what&amp;#x27;s newly experimental in each release.&lt;/p&gt;&lt;p&gt;For example, here&amp;#x27;s the overview of features that were newly added in the upcoming version 122:&lt;/p&gt;&lt;img src=&quot;static/122-080c7dcb31ce2ba443456e290d62f799.png&quot; alt=&quot;Overview of chromium 122&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;You can see that a lot of the flags have no corresponding description up on chromestatus.com yet. These get added to Chromestatus by Chromium devs so we&amp;#x27;re a little dependent on them. In the future we might opt to add our own descriptions for these features.&lt;/p&gt;&lt;h2 id=&quot;what-do-you-want-to-see&quot;&gt;What do you want to see?&lt;/h2&gt;&lt;p&gt;This is our first iteration of this page, and we&amp;#x27;re looking to improve it. One of the things we will start doing is writing short articles about interesting experimental features as they become available, like CSS cross-fade(), and link those from the &lt;a href=&quot;/experimental-web-platform-features/&quot;&gt;experimental Chromium web platform features&lt;/a&gt; overview.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What would you like to see added? Let us know!&lt;/strong&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 17: Meta panel updates, Reference image split slider and Chromium 120]]></title><description><![CDATA[Polypane 17 ships with new features in the meta panel, a new split slider feature in the reference image tool, an updated console.table…]]></description><link>https://polypane.app/blog/polypane-17-meta-panel-updates-reference-image-split-slider-and-chromium-120/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-17-meta-panel-updates-reference-image-split-slider-and-chromium-120/</guid><pubDate>Fri, 15 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 17 ships with new features in the meta panel, a new split slider feature in the reference image tool, an updated console.table, native window controls on Windows and it runs on Chromium 120.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;What&amp;#x27;s &lt;a href=&quot;/&quot;&gt;Polypane&lt;/a&gt;?&lt;/strong&gt; Polypane is the web browser for ambitious web developers. It&amp;#x27;s a stand-alone browser that shows
sites in multiple fully synced &lt;em&gt;panes&lt;/em&gt; and helps you make your site more responsive, more accessible and faster.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;meta-panel-updates&quot;&gt;Meta panel updates&lt;/h2&gt;&lt;p&gt;A large part of what makes the meta panel so useful is that it shows you what&amp;#x27;s missing from your site. This update adds a new overview of missing tags, warnings for viewport and canonical and a bunch of other improvements.&lt;/p&gt;&lt;h3 id=&quot;overview-of-missing-tags&quot;&gt;Overview of missing tags&lt;/h3&gt;&lt;p&gt;When you open up your OG, Twitter or general meta tags, we now show an overview of the tags missing on your page. Some of these are required to make sure you get the best possible experience on social media, others are optional but recommended, or only applicable in certain situations. We explain what the tags do and if they have specific fallback tags. You can quickly copy them from the meta panel to your code.&lt;/p&gt;&lt;img src=&quot;static/metasuggestions-c7b72aaecae9fa46b30c280e0b69ca95.png&quot; alt=&quot;An overview of missing meta tags showing viewport under a required heading&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;When Polypane can, it even adds in the correct value for you. If not it copies along the description so you don&amp;#x27;t have to switch back and forth between Polypane and your code editor.&lt;/p&gt;&lt;h3 id=&quot;warnings-for-viewport-and-canonical&quot;&gt;Warnings for viewport and canonical&lt;/h3&gt;&lt;p&gt;The warnings we show for viewports now come with a copy button to quickly copy the correct viewport values. That warnings showed what you needed to change, but now we just give you the correct values as well.&lt;/p&gt;&lt;img src=&quot;static/canonical-4850525dd7fd2cfa1f521835c7bb6b5b.png&quot; alt=&quot;A warning message that the current URL and canonical URL differ.&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;We also added a warning when the current URL and the canonical URL are different. It&amp;#x27;s not always an issue and can be intentional, but it&amp;#x27;s good to know when it happens because you might be accidentally sending Google and other crawlers to the wrong page and wondering why things aren&amp;#x27;t being picked up correctly.&lt;/p&gt;&lt;h3 id=&quot;other-improvements&quot;&gt;Other improvements&lt;/h3&gt;&lt;p&gt;We also improved the performance of getting data both on the initial load and when re-fetching data later. The maximum suggested length for titles is now 60 characters instead of 70 to be more in line with updated SEO guidelines.&lt;/p&gt;&lt;p&gt;We&amp;#x27;ve also disabled the 𝕏/Twitter preview when your &lt;code class=&quot;language-text&quot;&gt;twitter:title&lt;/code&gt; attribute is missing, since they will not show a preview if that&amp;#x27;s missing even if you do have an image and an &lt;code class=&quot;language-text&quot;&gt;og:title&lt;/code&gt;.&lt;/p&gt;&lt;img src=&quot;data:image/png;base64,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&quot; alt=&quot;A warning message instead of the twitter preview.&quot; class=&quot;imgshadow&quot;/&gt;&lt;h2 id=&quot;reference-image-split-slider&quot;&gt;Reference image split slider&lt;/h2&gt;&lt;p&gt;The reference image tool now has a split slider that lets you quickly compare your site to the reference image. You can drag the slider to compare the image with your site.&lt;/p&gt;&lt;video src=&quot;static/image-slider-81b3a2e65d2ab7d00164fdb6bb25e7f1.mp4&quot; muted=&quot;&quot; controls=&quot;&quot; preload=&quot;true&quot; loading=&quot;lazy&quot; playsinline=&quot;&quot;&gt;&lt;/video&gt;&lt;p&gt;This is in addition to the existing transparency based reference image overlay, and will make it easier to find subtle differences.&lt;/p&gt;&lt;h2 id=&quot;show-page-title-and-favicon-in-history-and-suggestions&quot;&gt;Show page title and favicon in history and suggestions&lt;/h2&gt;&lt;p&gt;The address bar and navigation buttons (back and forward) will now show the page title and favicon in addition to the URL. When searching for URLs in the address bar, it will now also match your page titles so finding pages is much easier.&lt;/p&gt;&lt;img src=&quot;static/addressbar-6eb53fcf83421ef3e8180da294d9b472.png&quot; alt=&quot;address bar showing the favicon and titles.&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;In the Polypane address bar you can type multiple words to search for a URL. For example, if you want to go to the Polypane blog, you can type &amp;quot;poly blog&amp;quot; and it will show you &lt;code class=&quot;language-text&quot;&gt;Blog | Polypane - https://polypane.app/blog&lt;/code&gt; even though the string &amp;quot;poly blog&amp;quot; doesn&amp;#x27;t appear in either the title or the URL, but each individual word does.&lt;/p&gt;&lt;p&gt;We use this all the time because it&amp;#x27;s much faster to find specific pages in your history without typing everything out, but it also helps you find pages where you don&amp;#x27;t quite remember the full URL or title.&lt;/p&gt;&lt;h2 id=&quot;context-menu-options-on-images&quot;&gt;Context menu options on images&lt;/h2&gt;&lt;p&gt;We&amp;#x27;ve increased the number of options available when you right-click on images anywhere in Polypane. While previously we let you copy the image location, or save the image, we&amp;#x27;ve now expanded that a lot:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Copy image&lt;/strong&gt; copies the image itself to your clipboard&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Copy alt text&lt;/strong&gt; copies the alt text to your clipboard (We only show this if there is an alt text)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Copy as IMG tag&lt;/strong&gt; copies the image as an IMG tag (wih alt text) to your clipboard&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Copy as background-image&lt;/strong&gt; copies the image as a CSS background-image to your clipboard&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Copy as Markdown&lt;/strong&gt; copies the image as a Markdown image (with alt text) to your clipboard&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Wherever you want to use an image, Polypane can easily create the code for you. If there&amp;#x27;s a specific format you&amp;#x27;d like to see added, let us know!&lt;/p&gt;&lt;h2 id=&quot;accessible-role-and-name-in-track-focus-debug-tool&quot;&gt;Accessible role and name in Track Focus Debug tool&lt;/h2&gt;&lt;p&gt;A recurring question we get is for Polypane to include a screen reader emulator. We&amp;#x27;ve always been hesitant to do this because while we can emulate &lt;em&gt;a&lt;/em&gt; screen reader, they usually are very customized to the needs of that particular user in terms of what they announce and how verbose they are about it.&lt;/p&gt;&lt;p&gt;The risk is that people tweak their site to optimize for our &amp;quot;screen reader&amp;quot;, potentially making it worse for actual screen readers. Instead, Polypane shows the accessible name and role in many different places, as that&amp;#x27;s the information that gets sent to screen readers. If you get those right, then a screen reader will use that to announce them at the users preferred verbosity.&lt;/p&gt;&lt;p&gt;So while it&amp;#x27;s not a screen reader emulator, we now show the accessible name and role in our Track Focus Debug tool. This way you can see the info a screen reader uses while you tab through your page.&lt;/p&gt;&lt;video src=&quot;static/track-focus-c02d6bc64e898bb181ef3352a82b6799.mp4&quot; muted=&quot;&quot; controls=&quot;&quot; preload=&quot;true&quot; loading=&quot;lazy&quot; playsinline=&quot;&quot;&gt;&lt;/video&gt;&lt;p&gt;We think this is the right compromise between the wish for a screen reader emulator and not doing unintentional harm, and want to thank René for the suggestion!&lt;/p&gt;&lt;h2 id=&quot;elements-panel-updates&quot;&gt;Elements panel updates&lt;/h2&gt;&lt;p&gt;We updated the elements panel with a bunch of new features and improvements.&lt;/p&gt;&lt;h3 id=&quot;scoping-root-and-limit-badges&quot;&gt;Scoping root and limit badges&lt;/h3&gt;&lt;p&gt;We extended our support for &lt;code class=&quot;language-text&quot;&gt;@scope&lt;/code&gt; by now showing badges for both the scoping root (the starting element) and the scoping limit (the ending element) in the tree.&lt;/p&gt;&lt;img src=&quot;static/scoping-c7deb9121ecb23f202466824473dbefa.png&quot; alt=&quot;the elements panel showing a scoping root and limit badge.&quot; class=&quot;imgshadow&quot;/&gt;&lt;h3 id=&quot;updated-class-editor&quot;&gt;Updated class editor&lt;/h3&gt;&lt;p&gt;The Elements panel now remembers whether you prefer the input or the list editor for classes (which lets you toggle individual classes). We also added an input to add classes to the list editor so you don&amp;#x27;t have to switch back.&lt;/p&gt;&lt;img src=&quot;static/classeditor-fb0263200181d55e2cff0758e74fd2f5.png&quot; alt=&quot;the class editor in the elements panel.&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;Like the regular freeform input, the input in the class list editor also suggest matching classes from your HTML and CSS as you type.&lt;/p&gt;&lt;img src=&quot;static/classeditor-suggestions-9a596956e6209a5fceb3c8f3117eeab1.png&quot; alt=&quot;the class editor with suggestions in the input.&quot; class=&quot;imgshadow&quot;/&gt;&lt;h3 id=&quot;new-icon-for-forced-element-states&quot;&gt;New icon for forced element states&lt;/h3&gt;&lt;p&gt;To bring Polypane more in line we switched out the &amp;quot;state&amp;quot; icon (a rhombus) for the &amp;quot;:hov&amp;quot; icon. This is what Chrome and Firefox also use, so it&amp;#x27;s more consistent across browsers.&lt;/p&gt;&lt;img src=&quot;static/navigator-cdaf1f0565bf72455c1843a8f226de73.png&quot; alt=&quot;the navigator area in the elements panel with the new :hov icon.&quot; class=&quot;imgshadow&quot;/&gt;&lt;h3 id=&quot;bug-fixes&quot;&gt;Bug fixes&lt;/h3&gt;&lt;p&gt;We fixed a couple of bugs in the elements panel. When copying nested CSS, the copied CSS had an incorrect nesting order.&lt;/p&gt;&lt;p&gt;We also fixed an issue where the specificity for nested elements without a nesting selector (the &lt;code class=&quot;language-text&quot;&gt;&amp;amp;&lt;/code&gt;) was incorrect.&lt;/p&gt;&lt;p&gt;Lastly, the container query tooltips (on the badge and on the &lt;code class=&quot;language-text&quot;&gt;@container&lt;/code&gt; rule) showed the incorrect values for the cqi and cqb.&lt;/p&gt;&lt;h2 id=&quot;narrow-minimum-width&quot;&gt;Narrow minimum width&lt;/h2&gt;&lt;p&gt;As the number of features grew in Polypane, so did we have to update the minimum width of the main window to make sure everything still fit. That&amp;#x27;s not a very responsive thing to do, and Charlie rightfully complained as the browser no longer fit comfortably on a laptop screen alongside a code editor.&lt;/p&gt;&lt;p&gt;We&amp;#x27;ve now added a new minimum width design that lets you toggle between the navigation and the feature buttons, meaning the browser can now be as narrow as 500px.&lt;/p&gt;&lt;img src=&quot;static/narrow-f57089d77567906aa82d34aabfd277b8.png&quot; alt=&quot;Polypane at 500px wide with a nice beach background&quot; class=&quot;imgshadow&quot;/&gt;&lt;h2 id=&quot;consoletable&quot;&gt;Console.table&lt;/h2&gt;&lt;p&gt;The console.table implementation in Polypane has now been expanded to support more complex objects and arrays, and you can now sort the table by clicking on the column headers.&lt;/p&gt;&lt;video src=&quot;static/console-table-10284ec1c37e66c5ee05348f4d7de9c8.mp4&quot; muted=&quot;&quot; controls=&quot;&quot; preload=&quot;true&quot; loading=&quot;lazy&quot; playsinline=&quot;&quot;&gt;&lt;/video&gt;&lt;h2 id=&quot;native-window-controls-on-windows&quot;&gt;Native window controls on Windows&lt;/h2&gt;&lt;p&gt;The minimize, maximize and close buttons are no longer rendered by Polypane, but use native window controls instead. The native window controls in Windows 11 also have a bunch of cool placement features, and you can now use them in Polypane.&lt;/p&gt;&lt;h2 id=&quot;updated-pixel-device-presets&quot;&gt;Updated Pixel device presets&lt;/h2&gt;&lt;p&gt;We removed the Pixel 2 and Pixel 3 device presets and replaced them with the recently released Pixel 7.&lt;/p&gt;&lt;h2 id=&quot;chromium-120&quot;&gt;Chromium 120&lt;/h2&gt;&lt;p&gt;Polypane now runs on Chromium 120.0.6099.56, bringing relative color syntax, horizontal rules inside &lt;code class=&quot;language-text&quot;&gt;select&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;:user-valid&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;:user-invalid&lt;/code&gt; pseudo selectors, the &lt;code class=&quot;language-text&quot;&gt;:dir()&lt;/code&gt; pseudo-class selector and a bunch more.&lt;/p&gt;&lt;p&gt;Polypane ships with some experimental features turned on. We mention the highlights in our docs here: &lt;a href=&quot;/docs/experimental-chromium-features/&quot;&gt;Experimental Chromium features&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;experimental-web-platform-features&quot;&gt;Experimental Web Platform features&lt;/h2&gt;&lt;p&gt;Polypane has the experimental web platform features flag turned on. This enables a bunch of cool features that are still in development but ready for experimentation by web devs.&lt;/p&gt;&lt;p&gt;Unfortunately there is no public place where you can find a full list of all the features that fall under &amp;quot;experimental web platform features&amp;quot;.&lt;/p&gt;&lt;p&gt;So we built one!&lt;/p&gt;&lt;p&gt;Check out &lt;a href=&quot;/experimental-web-platform-features/&quot;&gt;Experimental Chromium Web Platform features&lt;/a&gt; for a full list of features split out by Chromium version. There you can find the feature name and summary, as well as a link to the Chrome Status page where you can find more details.&lt;/p&gt;&lt;p&gt;Not all experimental features are documented, we hope that will improve in the future now that we&amp;#x27;ve made it more visible.&lt;/p&gt;&lt;h2 id=&quot;get-polypane-17&quot;&gt;Get Polypane 17&lt;/h2&gt;&lt;p&gt;Polypane is available for Windows, Mac and Linux (.deb or AppImage) in both 64 bit and ARM versions.&lt;/p&gt;&lt;p&gt;Polypane automatically updates on Mac, Windows and on Linux when using the AppImage. Otherwise, go to
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; to download the latest version!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Try it for free&lt;/a&gt;.&lt;/strong&gt; No credit card needed.&lt;/p&gt;&lt;h2 id=&quot;polypane-17-changelog&quot;&gt;Polypane 17 Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;New&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Meta panel: New overview of missing tags&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Reference image split slider&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Show page title and favicon in history and suggestions&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Accessible role and name in Track Focus Debug tool (Thanks René!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Elements panel: show a badge for scoping roots and limits&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Context menu options on images&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Pixel 7 device&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Chromium 120&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improved&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Viewport warnings now suggest the correct viewport values&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Show a warning when the current URL and the canonical URL are different (Thanks Wes!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: better initial loading of data&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Update suggested max length of title from 70 to 60 characters&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Hide X card when twitter:title is missing (Thanks Pankaj!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: improve performance of getting data&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel/Outline panel: Spin reload button to indicate activity (Thanks Jimmy!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Console panel: Console.table can now be sorted&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Console pane: Set the default levels for new tabs&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: List of classes now also has an input to add classes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: preference for class list editor or input editor is now remembered&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Icon for forced states is now &amp;quot;:hov&amp;quot; for cross-browser consistency&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Main window can now get much smaller (Thanks Charlie!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Form Autofill: when there is a given-name autocomplete hint, use username (Thanks Eric!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Color Picker: updated design and cursors&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Color Picker: better clamping of RGB colors&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Fix missing top left icon on Windows&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Use native window controls on Windows&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Better resize performance for pane size and element attribute inputs&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Pressing Escape on pane size and scale resets the value&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Performance: better performance when scrolling in multiple panes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Browse panel: Set the right context menu items depending on the URL&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Source panel: improve performance of getting data&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: improve performance of getting data&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Better handling of NuxtLinks multiple navigation events (Thanks Flemming!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Ignore cert errors from the main window/support chat (Thanks Bram!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Update Inter to 4.0&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Accessibility Panel: updated rulesets&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated Google Fonts&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Removals&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Removed&lt;/strong&gt; Pixel 2 and 3 devices&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Removed&lt;/strong&gt; Toybox Systems integration&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Hide initial display of pane buttons on loading focus mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent flash of incorrect font on load&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Searching for multiple words works again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Console panel: Support for console.table for nested arrays and objects&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Zoom out focus mode pane on launch when needed&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: Incorrect value for cqi and cqb in container badge tooltips&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: correctly calculate specificity for nested elements without nesting selector&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: Copying nested CSS had the parent nesting in the incorrect order&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; JSON viewer being prevented by Chromium&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Meta panel: prevent resetting dark/light preference on navigation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Browse panel: right-clicking tab no longer activates it&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where the internal size of a pane wasn&amp;#x27;t updated as a result of the side panel toggling.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where full and focus layout would incorrectly show prefers-reduced-transparency as active&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Tooltips for navigation buttons no longer sits behind traffic lights on mac (Thanks Sascha!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Update color scheme for pages with &lt;code class=&quot;language-text&quot;&gt;color-scheme&lt;/code&gt; meta after changing app color scheme.&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Using Selectlist in React]]></title><description><![CDATA[Selectlist is an upcoming element that replaces the native select element with a fully stylable and customizable one, while still keeping…]]></description><link>https://polypane.app/blog/using-selectlist-in-react/</link><guid isPermaLink="false">https://polypane.app/blog/using-selectlist-in-react/</guid><pubDate>Wed, 15 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Selectlist is an upcoming element that replaces the native select element with a fully stylable and customizable one, while still keeping all the native interactions and accessibility features. It&amp;#x27;s a sorely needed improvement and will let you do away with all your custom select implementations.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Selectlist is an experimental feature. &lt;strong&gt;It&amp;#x27;s still being worked on and you can&amp;#x27;t use it in browsers yet&lt;/strong&gt;, unless you use Polypane (...or a Chromium based browser where you have experimental features turned on.)&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This isn&amp;#x27;t a full exploration of what &lt;code class=&quot;language-text&quot;&gt;selectlist&lt;/code&gt; is and can do, but a quick explainer of how to get &lt;code class=&quot;language-text&quot;&gt;selectlist&lt;/code&gt; to play nicely with React. We ran into issues while replacing some of the &lt;code class=&quot;language-text&quot;&gt;select&lt;/code&gt; elements in the Polypane UI, which is built with React, and we hope this prevents you from running into the same issues. For a nice introduction, check out Hidde&amp;#x27;s article &lt;a href=&quot;https://hidde.blog/custom-select-with-selectlist/&quot;&gt;Two levels of customising &lt;code class=&quot;language-text&quot;&gt;&amp;lt;selectlist&amp;gt;&lt;/code&gt;&lt;/a&gt; and for a full explainer, head over to &lt;a href=&quot;https://open-ui.org/components/selectlist/&quot;&gt;OpenUI&lt;/a&gt; which is where the element is being developed.&lt;/p&gt;&lt;h2 id=&quot;select-in-react&quot;&gt;Select in React&lt;/h2&gt;&lt;p&gt;When you want to do something when the value in your regular select changes in th regular React way, you use the &lt;code class=&quot;language-text&quot;&gt;onChange&lt;/code&gt; prop:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;select&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;onChange&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;doSomething&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;hex&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Hex&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;rgb&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Rgb&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;hsl&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;HSL&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;select&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And every time a user picks a new option, the onChange is fired and you can handle whatever you need to do with the event.&lt;/p&gt;&lt;h2 id=&quot;selectlist-in-react&quot;&gt;Selectlist in React&lt;/h2&gt;&lt;p&gt;To &amp;quot;migrate&amp;quot; from &lt;code class=&quot;language-text&quot;&gt;select&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;selectlist&lt;/code&gt;, you&amp;#x27;d expect to be able to just swap them out:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;selectlist&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;onChange&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;doSomething&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;hex&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Hex&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;rgb&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Rgb&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;hsl&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;HSL&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;selectlist&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Unfortunately, that&amp;#x27;s not the case. When you do that you&amp;#x27;ll notice that while the &lt;code class=&quot;language-text&quot;&gt;selectlist&lt;/code&gt; value updates, &lt;code class=&quot;language-text&quot;&gt;onChange&lt;/code&gt; doesn&amp;#x27;t fire. That&amp;#x27;s because the onChange prop is a React concept, not a different notation for the DOM native &lt;code class=&quot;language-text&quot;&gt;change&lt;/code&gt; event.&lt;/p&gt;&lt;p&gt;React has specific code that calls the &lt;code class=&quot;language-text&quot;&gt;onChange&lt;/code&gt; function whenever the &lt;code class=&quot;language-text&quot;&gt;change&lt;/code&gt; event fires on &lt;code class=&quot;language-text&quot;&gt;select&lt;/code&gt; elements, but it doesn&amp;#x27;t know about &lt;code class=&quot;language-text&quot;&gt;selectlist&lt;/code&gt; yet so the &lt;code class=&quot;language-text&quot;&gt;onChange&lt;/code&gt; on &lt;code class=&quot;language-text&quot;&gt;selectlist&lt;/code&gt; doesn&amp;#x27;t get called.&lt;/p&gt;&lt;p&gt;To make it work, we need to add the listeners ourselves using useEffect and useRef:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; useEffect&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; useRef &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;react&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;OurComponent&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; selectlist &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useRef&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;useEffect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; currentSelectlist &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; selectlist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    currentSelectlist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;change&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; doSomething&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      currentSelectlist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;removeEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;change&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; doSomething&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;doSomething&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// do something with the event&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;selectlist&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;selectlist&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;hex&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Hex&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;rgb&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Rgb&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;hsl&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;HSL&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;selectlist&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We use a ref to get the actual DOM element of the &lt;code class=&quot;language-text&quot;&gt;selectlist&lt;/code&gt;, and then use &lt;code class=&quot;language-text&quot;&gt;useEffect&lt;/code&gt; to add (and remove) event listeners to it manually. The listener doesn&amp;#x27;t need to change when we update the element, so we add an empty array as the dependency array of the useEffect.&lt;/p&gt;&lt;p&gt;To prevent event listeners from hanging around and taking up memory after we&amp;#x27;ve removed the element from the DOM, we also add a return function to the &lt;code class=&quot;language-text&quot;&gt;useEffect&lt;/code&gt; to remove the event listener when the component unmounts.&lt;/p&gt;&lt;h2 id=&quot;selectlist-as-a-separate-react-component&quot;&gt;Selectlist as a separate React component&lt;/h2&gt;&lt;p&gt;You probably don&amp;#x27;t want to add that useEffect to each component you use a Selectlist in, so instead you can extract it into its own component:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;Selectlist&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; onChange&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; children&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; value &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; ref &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useRef&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;useEffect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; selectlist &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ref&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;current&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    selectlist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;change&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; onChange&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; selectlist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;removeEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;change&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; onChange&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;onChange&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;selectlist&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;ref&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;children&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;selectlist&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// and then use it like this:&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;OurComponent&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// do your domain specific stuff&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;/* your other component parts */&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Selectlist&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;onChange&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;doSomething&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;hex&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Hex&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;rgb&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Rgb&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;option&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;hsl&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;HSL&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;option&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Selectlist&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And that&amp;#x27;s how you can use &lt;code class=&quot;language-text&quot;&gt;selectlist&lt;/code&gt; in React.&lt;/p&gt;&lt;p&gt;Keep in mind that &lt;code class=&quot;language-text&quot;&gt;selectlist&lt;/code&gt; isn&amp;#x27;t something you can use in the wild and have work for your visitors, and that it&amp;#x27;s still in development so things might change.&lt;/p&gt;&lt;p&gt;We have the luxury of determining our own browser support and we&amp;#x27;re happily using it inside Polypane to improve how our Selects work without sacrificing on accessibility or existing user expectations. If you want to play around with &lt;code class=&quot;language-text&quot;&gt;selectlist&lt;/code&gt; too, &lt;a href=&quot;/&quot;&gt;try Polypane for free&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 16: workflow improvements, scoped styles and Chromium 118]]></title><description><![CDATA[Polypane 16 ships a ton of improvements to common workflows, updates to the meta panel social media previews, support for @scope in the…]]></description><link>https://polypane.app/blog/polypane-16-workflow-improvements-scoped-styles-and-chromium-118/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-16-workflow-improvements-scoped-styles-and-chromium-118/</guid><pubDate>Mon, 30 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 16 ships a ton of improvements to common workflows, updates to the meta panel social media previews, support for @scope in the elements panel, an update to Chromium 118 and more.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;What&amp;#x27;s &lt;a href=&quot;/&quot;&gt;Polypane&lt;/a&gt;?&lt;/strong&gt; Polypane is the web browser for ambitious web developers. It&amp;#x27;s a stand-alone browser that shows
sites in multiple fully synced &lt;em&gt;panes&lt;/em&gt; and helps you make your site more responsive, more accessible and faster.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;scope-support-in-the-elements-panel&quot;&gt;@scope support in the elements panel&lt;/h2&gt;&lt;p&gt;With Chromium 118 bringing support for scoped styles, the Elements panel now also shows them.&lt;/p&gt;&lt;p&gt;When there&amp;#x27;s scoped styles, Polypane shows the scoping root and end (if available), and like our container query support you can hover over the scoping root to see the element highlighted and click to inspect the element.&lt;/p&gt;&lt;img src=&quot;data:image/png;base64,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&quot; alt=&quot;A CSS declaration with a scope. The start of the scope is darker and bold, while the end is struck through.&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;Scoped styles can define an end but that end doesn&amp;#x27;t actually have to be in the DOM. When that&amp;#x27;s the case, the selector is struck through in the elements panel.&lt;/p&gt;&lt;h2 id=&quot;prefers-reduced-transparency-emulation&quot;&gt;Prefers-reduced-transparency emulation&lt;/h2&gt;&lt;p&gt;You can now emulate &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-transparency&lt;/code&gt; in Polypane, along with the pre-existing 7 other media features.&lt;/p&gt;&lt;p&gt;Prefers-reduced-transparency exists for people that have a hard time reading text on patterned background, and most operating systems have a &amp;quot;reduce transparency&amp;quot; accessibility option that this media query will match against.&lt;/p&gt;&lt;img src=&quot;static/reducedtransparency-4fd9dec3043385b5173588dfaaf9e243.png&quot; alt=&quot;The Media emulation popover with prefers-reduced-transparency active and highlighted&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;Learn more about it in our &lt;a href=&quot;https://polypane.app/blog/the-complete-guide-to-css-media-queries/#prefers-reduced-transparency-chromium-118-supported-behind-a-flag-in-firefox&quot;&gt;complete guide to CSS Media Queries&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;meta-panel-improvements&quot;&gt;Meta panel improvements&lt;/h2&gt;&lt;p&gt;The big update here is the new X (formerly Twitter) style.&lt;/p&gt;&lt;h3 id=&quot;new-x-style&quot;&gt;New X style&lt;/h3&gt;&lt;p&gt;X/Twitter removed almost everything in their preview apart from the twitter:image and the domain. That domain can overlap any text in the image, so &lt;a href=&quot;https://polypane.app/blog/where-to-put-text-so-it-doesnt-overlap-in-the-new-x-twitter-preview/&quot;&gt;make sure you put text where it doesn&amp;#x27;t get overlapped&lt;/a&gt;.&lt;/p&gt;&lt;img src=&quot;static/xstyle-fff9c2122a199cfdda254a28d48d22d3.png&quot; alt=&quot;X preview of the Polypane site running on localhost.&quot; class=&quot;imgshadow&quot;/&gt;&lt;h3 id=&quot;domain-overwriting&quot;&gt;Domain overwriting&lt;/h3&gt;&lt;p&gt;Our friend Charlie asked us if we could overwrite the domain in the social media previews. While you develop the domain is most likely going to be localhost, but what you actually want to see is what it will look like on your production domain.&lt;/p&gt;&lt;img src=&quot;static/overwrite-domain-9876252715050ed2971b9b69f5836b56.png&quot; alt=&quot;X preview of the Polypane site running on localhost, but with the domain overwrite of polypane.app&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;So now you can overwrite the domain in the meta panel and have all social media previews update to that domain.&lt;/p&gt;&lt;h3 id=&quot;updated-mastodon-style&quot;&gt;Updated Mastodon style&lt;/h3&gt;&lt;p&gt;In Polypane 15 we mostly focused on the large image display (since that&amp;#x27;s usually what you&amp;#x27;re aiming for!) but we noticed that our small image display had some issues when there was no OG:image. Polypane 16 remedies that so even if you don&amp;#x27;t have a large image for your social media previews, everything should look as expected on Mastodon now.&lt;/p&gt;&lt;img src=&quot;static/mastodon-305492c324c72d69a27ff51d1fd31fae.png&quot; alt=&quot;Mastodon preview of this page running on localhost without an OG image.&quot; class=&quot;imgshadow&quot;/&gt;&lt;h2 id=&quot;reveal-password-field-context-menu-option&quot;&gt;Reveal Password field context menu option&lt;/h2&gt;&lt;p&gt;Right-clicking a password field now shows a &amp;quot;Reveal password&amp;quot; option that changes the input to a regular text input, letting you see the password. Pretty handy when you need to know the password for whatever reason, and much faster than editing the attribute in the elements panel.&lt;/p&gt;&lt;p&gt;When clicked, &amp;quot;reveal password&amp;quot; has a checkmark, click it again to revert the input back to a password field.&lt;/p&gt;&lt;img src=&quot;static/revealpassword-21fbcf6a10d27a70c6a8d00eacf4a1e9.png&quot; alt=&quot;the Polypane dashboard with a focused password field. The context menu has &amp;#x27;reveal password&amp;#x27; highlighted and it has a checkbox. The password field is readable and reads &amp;#x27;hunter2&amp;#x27;.&quot; class=&quot;imgshadow&quot;/&gt;&lt;h2 id=&quot;measure-text-now-counts-sentences-and-supports-more-languages&quot;&gt;Measure text now counts sentences and supports more languages.&lt;/h2&gt;&lt;p&gt;Thanks to the &lt;a href=&quot;https://polypane.app/blog/using-the-intl-segmenter-api/&quot;&gt;INTL segmenter API&lt;/a&gt;, the &lt;a href=&quot;/docs/measure-text-length/&quot;&gt;measure text&lt;/a&gt; feature that counts characters and words when you right-click a selection now also supports sentences is many different languages, and does a better job of determining what is a word and what isn&amp;#x27;t.&lt;/p&gt;&lt;img src=&quot;static/measuresentences-ec17b6bb5bb5c338e96ef4c0a71b1ec1.png&quot; alt=&quot;Selected Japanese text with an open context menu that says there are 84 characters, 46 word and 3 sentences.&quot; class=&quot;imgshadow&quot;/&gt;&lt;h2 id=&quot;accessibility-workflow-improvements&quot;&gt;Accessibility workflow improvements&lt;/h2&gt;&lt;p&gt;A big focus in Polypane is always to make it easier to find and fix accessibility issues. In this release we&amp;#x27;ve made a few improvements to the accessibility workflow.&lt;/p&gt;&lt;h3 id=&quot;copyable-content&quot;&gt;Copyable content&lt;/h3&gt;&lt;p&gt;All content in &lt;a href=&quot;https://polypane.app/docs/elements-panel/#a11y&quot;&gt;the A11y tab in the elements panel&lt;/a&gt; is now copyable. You could get to all that information through other means, but now you can just copy it and paste it wherever you need it. Thanks to Eric for requesting this.&lt;/p&gt;&lt;h3 id=&quot;quickly-zoom-in-to-200-and-400&quot;&gt;Quickly zoom in to 200% and 400%&lt;/h3&gt;&lt;p&gt;Websites being able to zoom into 200% and 400% without breaking is required for WCAG criteria 1.4.4 Resize text and 1.4.10 Reflow, respectively. So zooming to those specific values is something many accessibility testers do a lot.&lt;/p&gt;&lt;p&gt;To help with this, we&amp;#x27;ve now added added them as option to the &lt;a href=&quot;/docs/command-bar/&quot;&gt;command bar&lt;/a&gt;, along with the pre-existing page zoom options. Thanks Ian for asking for this feature.&lt;/p&gt;&lt;img src=&quot;static/pagezoom-dfbeb36ee0fb2badac1a1777ff124540.png&quot; alt=&quot;The Command Bar with a search of &amp;#x27;page zoom&amp;#x27;, and &amp;#x27;zoom page to 200%&amp;#x27; highlighted.&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;&lt;em&gt;While we would love to support zooming in at different levels at different panes so you could check these zoom levels side-by-side in one go, unfortunately Chromium&amp;#x27;s page zoom works on an origin level. This means any open page on the same domain is updated when the zoom percentage changes.&lt;/em&gt;&lt;/p&gt;&lt;h3 id=&quot;highlighted-aria-hidden&quot;&gt;Highlighted aria-hidden&lt;/h3&gt;&lt;p&gt;The aria-hidden attribute removes an element from the accessibility tree, but it&amp;#x27;s easy to miss that attribute being there (or higher up the DOM tree) and wasting time trying to find why the element doesn&amp;#x27;t have the accessible name you think it should have.&lt;/p&gt;&lt;img src=&quot;static/ariahidden-2f5d6e471599c0d8b400716484a11b68.png&quot; alt=&quot;A list of links in the Elements Panel DOM tree. One has an &amp;#x27;aria-hidden&amp;#x27; attribute that is visually highlighted.&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;To prevent you from wasting time there, we now highlight aria-hidden in the tree view in the elements panel. Thanks Scott for helping us come up with this!&lt;/p&gt;&lt;p&gt;&lt;em&gt;Should we highlight more attributes? Let us know!&lt;/em&gt;&lt;/p&gt;&lt;h3 id=&quot;export-cookies-for-polypane-cloud&quot;&gt;Export Cookies for &lt;a href=&quot;/blog/announcing-polypane-cloud-accessibility-testing-for-entire-sites/&quot;&gt;Polypane Cloud&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The storage panel now has an export button for the cookies, that copies them to the clipboard in a format supported by Polypane Cloud, Playwright and Puppeteer.&lt;/p&gt;&lt;img src=&quot;static/cookie3-60c20e37f60cb808cc424cd8c531d4b3.png&quot; alt=&quot;The Export button above the list of cookies&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;If you need to test a website with, for example, a logged in state, or with cookies accepted, then you can configure that in Polypane, then export the cookies and use them in Polypane Cloud so it has the right levels of access.&lt;/p&gt;&lt;h2 id=&quot;updated-react-devtools&quot;&gt;Updated React DevTools&lt;/h2&gt;&lt;p&gt;Due to Electron not supporting some of the newer Chrome Extension APIs, we had to run an older version of the React DevTools. In The most recent Electron versions those newer APIs have become available, so we can now run the latest and greatest again.&lt;/p&gt;&lt;h2 id=&quot;notable-fixes&quot;&gt;Notable Fixes&lt;/h2&gt;&lt;p&gt;We always ship with a bunch of fixes, these are some of the more notable ones.&lt;/p&gt;&lt;h3 id=&quot;browse-panel-reloads&quot;&gt;Browse panel reloads&lt;/h3&gt;&lt;p&gt;When the fragment identifier changed (the part after a # in a URL), the browse panel incorrectly reloaded the entire page. In the case of 1Password and Figma that unfortunately led to issues with getting logged out, or continuously reloading the page. This is now fixed. A bunch of you reported this, thanks for that!&lt;/p&gt;&lt;h3 id=&quot;service-workers&quot;&gt;Service workers&lt;/h3&gt;&lt;p&gt;The work we did to support Cloudflare&amp;#x27;s Captcha in Polypane 15 unwittingly broke service workers for some websites. We had to revise the way we deal with Cloudflare&amp;#x27;s Captcha&amp;#x27;s (and luckily they also improved the support for Polypane on their side in the mean time!) to make sure that service workers still work. Thanks Sander for reporting this!&lt;/p&gt;&lt;h2 id=&quot;chromium-118&quot;&gt;Chromium 118&lt;/h2&gt;&lt;p&gt;Polypane now runs on Chromium 118.0.5993.89. This means we now ship support for scoped styles, prefers-reduced-transparency and the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;search&amp;gt;&lt;/code&gt; element.&lt;/p&gt;&lt;p&gt;We&amp;#x27;ve also enables new flags so you can try out upcoming features like the &lt;code class=&quot;language-text&quot;&gt;scripting&lt;/code&gt; media query and the relative color syntax. View the full list here: &lt;a href=&quot;/docs/experimental-chromium-features/&quot;&gt;Experimental Chromium features&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;get-polypane-16&quot;&gt;Get Polypane 16&lt;/h2&gt;&lt;p&gt;Polypane is available for Windows, Mac and Linux (.deb or AppImage) in both 64 bit and ARM versions.&lt;/p&gt;&lt;p&gt;Polypane automatically updates on Mac, Windows and on Linux when using the AppImage. Otherwise, go to
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; to download the latest version!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Try it for free&lt;/a&gt;.&lt;/strong&gt; No credit card needed.&lt;/p&gt;&lt;h2 id=&quot;polypane-16-changelog&quot;&gt;Polypane 16 Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;New&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Elements panel: Scoped Styles support&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Toggle Password field context menu option&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Meta panel: X social media preview&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Meta panel: Overwrite domain in social media previews (Thanks Charlie!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Prefers-reduced-transparency emulation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Command bar options to zoom to 200% and 400% (Thanks Ian!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Storage panel: Export cookies for Polypane Cloud, Playwright and Puppeteer&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Chromium 118&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improved&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Measure text now also counts sentences, better language support&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: a11y tab content is now copyable (Thanks Eric!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: aria-hidden is now highlighted in the tree view (Thanks Scott!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Support for new CSS properties like overlay and transition-behavior&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Improved Mastodon previews without og image.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Tooltips: More resilient tooltip styling for sites using popovers&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Browse panel: Also support installing extensions from new Chrome Web Store&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Browse panel: now uses local version of favicons&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Browse panel: added Phind search engine&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Debug tools: Contrast checker performance&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Quicker resizing of full layout web page when resizing the browser&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated screenshot tool&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Support the latest react devtools&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Better color-scheme: dark support&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Performance improvements across the app&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improves&lt;/strong&gt; Storage panel: improve the UI of the buttons&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Lorem Ipsum browser extension installation failing&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Debug tools: Aria overlay not removing on removal&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Debug tools: Fix Dyslexia simulator&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Browse panel address bar menus overlapped icons by 1px&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Browse panel no longer reloads when the fragment identifier changes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Browse panel now follows color-scheme of page&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Browse panel resetting search engines now works properly&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: arrow number changing in attributes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: height of tree view was not correctly remembered&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Tooltip: Missing text for accessible names was cut off&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Tightened our Sentry configuration to send less data (Thanks Chris!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Fix issues with service workers (Thanks Sander!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Don&amp;#x27;t scroll to last pane on a hard reload (Thanks Peter!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Main menu now also closes when clicking into a pane (Windows only)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Share popup could fall behind browse and devtools panels&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Storage panel scrolled too far&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Where to put text so it doesn't overlap in the new X (Twitter) preview (2023)]]></title><description><![CDATA[X (Twitter) recently updated their link previews to hide both the title and description, and overlaying the domain on top of the image…]]></description><link>https://polypane.app/blog/where-to-put-text-so-it-doesnt-overlap-in-the-new-x-twitter-preview/</link><guid isPermaLink="false">https://polypane.app/blog/where-to-put-text-so-it-doesnt-overlap-in-the-new-x-twitter-preview/</guid><pubDate>Mon, 09 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;X (Twitter) recently updated their link previews to hide both the title and description, and overlaying the domain on top of the image.&lt;/p&gt;&lt;p&gt;While this isn&amp;#x27;t great when it comes to accessibility, discoverability and the dissemination of fake news, as &lt;a href=&quot;https://mashable.com/article/x-accessibility-concerns-over-removed-headlines&quot;&gt;many have pointed out&lt;/a&gt;, it also means that text in your share image can be obscured.&lt;/p&gt;&lt;p&gt;For example, here&amp;#x27;s what the BBC&amp;#x27;s sharing images currently look like:&lt;/p&gt;&lt;img alt=&quot;BCC Twitter message with previews, where the BBC logo in the bottom left is obscured by the domain&quot; src=&quot;static/bbc-afb637ca854ced7c0770194f6e10665d.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;In their case, they&amp;#x27;ve been putting their logo in the bottom left of the image, which is right where Twitter is now overlaying the domain. To prevent that from happening, we need to find the safe zone for text.&lt;/p&gt;&lt;h2 id=&quot;the-new-url-overlay&quot;&gt;The new URL overlay&lt;/h2&gt;&lt;p&gt;X&amp;#x27;s new URL overlay is positioned in the bottom left of the image, 12px from either side and is itself 20px high. The width is dependent on the length of the URL, but with a font-size of 13 pixels it&amp;#x27;s never going to be extremely wide. For example, the BBC URL in the image above is 64px wide.&lt;/p&gt;&lt;p&gt;Unfortunately, that overlay is shown at the same size on top of differently sized images, so just looking at the default width and height of the image served by X (680px by 383px) and keeping the bottom 32px free isn&amp;#x27;t going to cut it. For example while this image looks fine in the Twitter web ui:&lt;/p&gt;&lt;img alt=&quot;A post shown on the regular site with the overlay bel=ow the text inside the image&quot; src=&quot;static/salma1-f7ccbfb21572bd6f856a24ce506f516f.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;The text is overlapped by the URL when the post is shown in Tweetdeck even though the overlay is slightly less high at a total of 27px because of less spacing and a smaller font-size:&lt;/p&gt;&lt;img alt=&quot;The same post in Tweetdeck with the overlay sitting in front of the text inside the image&quot; src=&quot;static/salma2-fa22fca26a8e7bbb4f006851877d3d58.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;Tweetdeck seems to be the worst case, so we can use the dimension there to calculate the safe zone.&lt;/p&gt;&lt;h2 id=&quot;the-safe-zone&quot;&gt;The safe zone&lt;/h2&gt;&lt;p&gt;To find the safe zone we need to know the percentage that the url overlay takes up of the height of the image in Tweetdeck, and then extrapolate that to the full size of an image.&lt;/p&gt;&lt;p&gt;In Tweetdeck the image is 147px high and the URL overlay takes up 27px of that, which is 18.36% of the height. That&amp;#x27;s the height without any sort of space above the url overlay, so if you want to be safe you can increase that percentage a little to 20%, which is 29 pixels on Tweetdeck and ends up being 77px on the full size image, assuming you use 680x383px images.&lt;/p&gt;&lt;p&gt;If you use a different size, for example 1280px by 720px which we use on our site, or 1360px wide and 766px height which is exactly @2x you can calculate the safe zone by multiplying the height of the image by 0.2:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;dimensions&lt;/th&gt;&lt;th&gt;height&lt;/th&gt;&lt;th&gt;safe zone&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;680x383px&lt;/td&gt;&lt;td&gt;383px&lt;/td&gt;&lt;td&gt;&lt;strong&gt;77px&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1280x720px&lt;/td&gt;&lt;td&gt;720px&lt;/td&gt;&lt;td&gt;&lt;strong&gt;144px&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1360x766px&lt;/td&gt;&lt;td&gt;766px&lt;/td&gt;&lt;td&gt;&lt;strong&gt;153px&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;template-overlays&quot;&gt;Template overlays&lt;/h2&gt;&lt;p&gt;If you want to update your own social media images you can use the template overlays below to find the safe space for your images.&lt;/p&gt;&lt;p&gt;The overlays are transparent pngs with a 20% red fill, so you can put them on top of your images in your image editor of choice and then move your text around until it&amp;#x27;s not overlapped by the red.&lt;/p&gt;&lt;h3 id=&quot;680x383px&quot;&gt;680x383px&lt;/h3&gt;&lt;p&gt;Template for 680 by 383px images:&lt;/p&gt;&lt;img alt=&quot;Template for 680 wide&quot; src=&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqgAAAF/CAMAAACytctkAAAABlBMVEUAAAD/AAAb/40iAAAAAnRSTlMAM8lDrC4AAAFkSURBVHja7dIBDQAADAIg37/0a+gGGUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQQcDREVUEBVRQVQQFVFBVBAVUUFUEBVRQVREBVFBVEQFUUFURAVRQVREBVERFUQFUREVRAVRERVEBVERFUQFUREVREVUEBVERVQQFURFVBAVREVUEBVRQVQQFVFBVBAVUUFUEBVRQVQQFVFBVEQFUUFURAVRQVREBVFBVEQFUREVmj0NT8yJFcR0dQAAAABJRU5ErkJggg==&quot; class=&quot;imgshadow&quot;/&gt;&lt;h3 id=&quot;1280x720px&quot;&gt;1280x720px&lt;/h3&gt;&lt;p&gt;Template for 1280 by 720px images:&lt;/p&gt;&lt;img alt=&quot;Template for 1280 wide&quot; src=&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQAQMAAAD1s08VAAAABlBMVEUAAAD/AAAb/40iAAAAAnRSTlMAM8lDrC4AAADQSURBVHja7c4xDQAACAOw+TcNIpYQjlZBEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4Nw8JygoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKChYWV28qziMm+RCAAAAAElFTkSuQmCC&quot; class=&quot;imgshadow&quot;/&gt;&lt;h3 id=&quot;1366x766px&quot;&gt;1366x766px&lt;/h3&gt;&lt;p&gt;template for 1366 by 766px images:&lt;/p&gt;&lt;img alt=&quot;Template for 1366 wide&quot; src=&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABVAAAAL+AQMAAABxAa0bAAAABlBMVEUAAAD/AAAb/40iAAAAAnRSTlMAM8lDrC4AAADnSURBVHja7c4xDQAADAOg+je9mejTBBSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAz81QVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVXa8+IH06UsKLHKwAAAAASUVORK5CYII=&quot; class=&quot;imgshadow&quot;/&gt;&lt;h2 id=&quot;pixel-perfect-preview&quot;&gt;Pixel perfect preview&lt;/h2&gt;&lt;p&gt;If you want to see exactly how your social previews will look with the new design, keep an eye out for the next release of &lt;a href=&quot;/&quot;&gt;Polypane&lt;/a&gt;. Polypane has pixel-perfect previews for nine different social media platforms, X included.&lt;/p&gt;&lt;p&gt;We immediately went to work to implement the new design as soon as X made the change:&lt;/p&gt;&lt;img alt=&quot;Polypane showing the new X previews&quot; src=&quot;static/xpreviews-ef3ce0cca5b42bd9813c75d140224c6f.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;The upcoming version of Polypane includes a pixel perfect preview of the new X cards, so you can see not just how much space you should keep free vertically, but also see exactly how much space your URL will take up horizontally.&lt;/p&gt;&lt;p&gt;Sign up for the &lt;a href=&quot;/newsletter/&quot;&gt;newsletter&lt;/a&gt; to be notified when the next version is released, or head over to our &lt;a href=&quot;/social-media-previews/&quot;&gt;page on social media previews&lt;/a&gt; to learn more about our pixel perfect social media previews.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Using the Intl segmenter API]]></title><description><![CDATA[The  Intl  API in browsers has a ton of functionality around editing and formatting of text and numbers. While filling in the  State of HTML…]]></description><link>https://polypane.app/blog/using-the-intl-segmenter-api/</link><guid isPermaLink="false">https://polypane.app/blog/using-the-intl-segmenter-api/</guid><pubDate>Tue, 03 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;Intl&lt;/code&gt; API in browsers has a ton of functionality around editing and formatting of text and numbers. While filling in the &lt;a href=&quot;https://stateofhtml.com/&quot;&gt;State of HTML&lt;/a&gt; survey I came across one feature I hadn&amp;#x27;t seen before: the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter&quot;&gt;segmenter API&lt;/a&gt;. Upon looking into it I found out that it allows you to break up text into segments based on the language of the text.&lt;/p&gt;&lt;p&gt;This caught my attention because I recently implemented a &lt;a href=&quot;https://polypane.app/docs/measure-text-length/&quot;&gt;text measurement feature&lt;/a&gt; and I was very annoyed that I managed to only support western languages using latin characters and spaces to separate words.&lt;/p&gt;&lt;p&gt;I spent a lot of time with npm packages, regexes and a lot of trial and error to try and support other languages but didn&amp;#x27;t end up with a solution for them.&lt;/p&gt;&lt;p&gt;Enter the segmenter API.&lt;/p&gt;&lt;h2 id=&quot;how-we-use-the-segmenter-api-in-polypane&quot;&gt;How we use the segmenter API in Polypane&lt;/h2&gt;&lt;p&gt;/Whenever you select text in  Polypane and right-click to open the context menu, we&amp;#x27;ll show you the characters, words and emoji in the text selection.&lt;/p&gt;&lt;img src=&quot;static/measuretext-e20fd1b516efe0d4ed666b128392b18e.jpg&quot; class=&quot;imgshadow&quot; alt=&quot;Measure text length context menu in Polypane.&quot;/&gt;&lt;p&gt;Use this to quickly check if you&amp;#x27;ve written the right number of characters for a tweet, or if you&amp;#x27;ve written the right number of words for a blog post.&lt;/p&gt;&lt;h2 id=&quot;setting-up-the-segmenter-api&quot;&gt;Setting up the segmenter API&lt;/h2&gt;&lt;p&gt;First the bad news. The segmenter API is available in Safari from v14.1 and Chromium from v87, but it&amp;#x27;s not in Firefox yet. There is &lt;a href=&quot;https://www.npmjs.com/package/intl-segmenter-polyfill&quot;&gt;a polyfill&lt;/a&gt; but it seems pretty heavy.&lt;/p&gt;&lt;p&gt;To use it, first you create a new segmenter. That takes two arguments, a language and a set of options.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; segmenter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Intl&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Segmenter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;en&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;granularity&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;word&amp;#x27;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The options object has two properties, both of which can be omitted:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;localeMatcher&lt;/code&gt; has a value of &amp;#x27;lookup&amp;#x27; or &amp;#x27;best fit&amp;#x27; (default) with &amp;#x27;lookup&amp;#x27; using a specific matching algorithm (&lt;a href=&quot;https://tools.ietf.org/html/bcp47&quot;&gt;BCP 47&lt;/a&gt;) and &amp;#x27;best fit&amp;#x27; using a looser algorithm that tries to match the language as closely as possible from what&amp;#x27;s available from the browser or OS.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;granularity&lt;/code&gt; has a value of &amp;#x27;grapheme&amp;#x27; (default), &amp;#x27;word&amp;#x27; or &amp;#x27;sentence&amp;#x27;. This determines what types of segments are returned. Grapheme is the default and are the characters as you see them.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Then, you call &lt;code class=&quot;language-text&quot;&gt;segmenter.segment&lt;/code&gt; with the text you want to segment. This returns an iterator, which you can convert to an array using &lt;code class=&quot;language-text&quot;&gt;Array.from&lt;/code&gt;:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; segments &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; segmenter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;segment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;This has four words!&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
Array&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;segments&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;segment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; segment&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;segment&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// [&amp;#x27;This&amp;#x27;, &amp;#x27; &amp;#x27;, &amp;#x27;has&amp;#x27;, &amp;#x27; &amp;#x27;, &amp;#x27;four&amp;#x27;, &amp;#x27; &amp;#x27;, &amp;#x27;words&amp;#x27;, &amp;#x27;!&amp;#x27;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Each item in the iterator is an object, and it has different values depending on the granularity but at least:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;segment&lt;/code&gt; is the actual text of the segment.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;index&lt;/code&gt; is the index of the segment in the original text, e.g. where it starts.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;input&lt;/code&gt; is the original text.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For the word granularity, it also has:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;isWordLike&lt;/code&gt; is a boolean that is true if the segment is a word or word-like.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Sp you might have looked at the array and said &amp;quot;well those white spaces aren&amp;#x27;t words, are they?&amp;quot;. And you&amp;#x27;d be right. To get the words, we need to filter the array:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; segments &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; segmenter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;segment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;This has four words!&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
Array&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;segments&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;segment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; segment&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;isWordLike&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;segment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; segment&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;segment&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// [&amp;#x27;This&amp;#x27;, &amp;#x27;has&amp;#x27;, &amp;#x27;four&amp;#x27;, &amp;#x27;words&amp;#x27;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And now we know how many actual &lt;em&gt;words&lt;/em&gt; that sentence has.&lt;/p&gt;&lt;p&gt;Instead of words like the example above, you can also ask it to segment sentences, and it knows which periods end sentences and which are used for e.g. thousand separators in numbers:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; segmenter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Intl&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Segmenter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;en&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;granularity&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;sentence&amp;#x27;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; segments &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; segmenter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;segment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;This is a sentence with the value 100.000 in it. This is another sentence.&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

Array&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;segments&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;segment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; segment&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;segment&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// [&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//    &amp;#x27;This is a sentence with the value 100.000 in it.&amp;#x27;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//    &amp;#x27;This is another sentence.&amp;#x27;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// ]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There are no &lt;code class=&quot;language-text&quot;&gt;isSentenceLike&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;isGraphemeLike&lt;/code&gt; properties, instead you can count the number of items directly.&lt;/p&gt;&lt;h2 id=&quot;support-for-other-languages&quot;&gt;Support for other languages&lt;/h2&gt;&lt;p&gt;The real power is that the API doesn&amp;#x27;t just split strings on spaces or periods, but uses specific algorithms for each language. That means the API can also segment words in languages that do not have spaces, like Japanese:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; segmenter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Intl&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Segmenter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;ja&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;granularity&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;word&amp;#x27;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; segments &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; segmenter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;segment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;これは日本語のテキストです&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

Array&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;segments&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;segment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; segment&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;segment&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// [&amp;#x27;これ&amp;#x27;, &amp;#x27;は&amp;#x27;, &amp;#x27;日本語&amp;#x27;, &amp;#x27;の&amp;#x27;, &amp;#x27;テキスト&amp;#x27;, &amp;#x27;です&amp;#x27;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now to be fair, I can not read Japanese so I have no idea if this segmentation is correct, but it sure looks convincing.&lt;/p&gt;&lt;p&gt;Compared to string splitting or regexes, this is a lot more accurate and handles non-latin characters and punctuation correctly, needs less code and doesn&amp;#x27;t need additional checks and tests. Browsers ship with understanding of a large number of languages, so you don&amp;#x27;t have to worry about that either.&lt;/p&gt;&lt;h2 id=&quot;dig-into-the-intl-api&quot;&gt;Dig into the Intl API&lt;/h2&gt;&lt;p&gt;The Intl API has an incredible number of useful tools for creating natural language constructs like lists, dates, money, numbers and more. By and large it&amp;#x27;s easy to work with, but it uses a lot of very precise terminology that you might not be familiar with (for example, &amp;quot;grapheme&amp;quot; instead of &amp;quot;character&amp;quot;, because the latter is too ambiguous), so it can be a bit daunting to get started with. If you&amp;#x27;ve never used it check out &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#static_properties&quot;&gt;the MDN page on Intl&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;As for Polypane, you can bet the next version will have text measurement option that works across languages and also tells you the number of sentences in any text you&amp;#x27;ve selected.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Announcing Polypane Cloud: Accessibility testing for entire sites]]></title><description><![CDATA[Today we're announcing  Polypane Cloud . A new product that allows you to test the accessibility of an entire site in one go, based on all…]]></description><link>https://polypane.app/blog/announcing-polypane-cloud-accessibility-testing-for-entire-sites/</link><guid isPermaLink="false">https://polypane.app/blog/announcing-polypane-cloud-accessibility-testing-for-entire-sites/</guid><pubDate>Thu, 28 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today we&amp;#x27;re announcing &lt;a href=&quot;https://polypane.cloud&quot;&gt;Polypane Cloud&lt;/a&gt;. A new product that allows you to test the accessibility of an entire site in one go, based on all the tests and checks we&amp;#x27;ve developed for Polypane in the last couple of years.&lt;/p&gt;&lt;p&gt;It has two parts:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The cloud environment, where you can test your site and get an overview of the pages and issues found.&lt;/li&gt;&lt;li&gt;An open source generator that creates a HTML or PDF report that can be expanded with manual testing results.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The two parts are glued together by our EARL export. Together these make an end-to-end solution that helps accessibility auditors be much more effective.&lt;/p&gt;&lt;img src=&quot;static/dash-1cf4c9bc8d428a48ea383fa977f47af9.png&quot; alt=&quot;The Polypane Cloud Dashboard&quot; class=&quot;imgshadow&quot;/&gt;&lt;h2 id=&quot;unburdening-accessibility-auditors&quot;&gt;Unburdening accessibility auditors&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;An auditor shouldn&amp;#x27;t have to waste time hunting for and listing all the color contrast violations on a site.&lt;/strong&gt; With Polypane Cloud, we give accessibility auditors time back to focus on the parts where they can make the most impact.&lt;/p&gt;&lt;p&gt;By automating the parts that can be automated, we can make sure that the time of an auditor is spent on the complex situations and provide guidance to their clients.&lt;/p&gt;&lt;h2 id=&quot;sign-up-for-the-closed-beta&quot;&gt;Sign up for the closed beta&lt;/h2&gt;&lt;p&gt;We&amp;#x27;re in the process of onboarding testers in our closed beta. If you&amp;#x27;re interested in helping out and getting early access (and don&amp;#x27;t mind sharp edges), &lt;a href=&quot;https://polypane.cloud&quot;&gt;sign up here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;We&amp;#x27;re specifically looking for accessibility auditors at the moment.&lt;/p&gt;&lt;h2 id=&quot;by-us-and-our-friends&quot;&gt;By us, and our friends&lt;/h2&gt;&lt;p&gt;Polypane cloud is a collaboration between Polypane and various accessibility experts, to make sure that what we&amp;#x27;re creating is directly usable and unburdening. It&amp;#x27;s supported by &lt;a href=&quot;https://sidnfonds.nl&quot;&gt;SIDN Fonds&lt;/a&gt; without which we couldn&amp;#x27;t have built it. We&amp;#x27;re very grateful for their support.&lt;/p&gt;&lt;p&gt;It&amp;#x27;s been a long time in the making, and we have a lot of plans for the future, but we&amp;#x27;re excited to finally be able to share it with you.&lt;/p&gt;&lt;h2 id=&quot;a-preview-of-polypane-cloud&quot;&gt;A preview of Polypane Cloud&lt;/h2&gt;&lt;p&gt;When you sign up for Polypane Cloud, we create a team for you where you can invite your team members and add sites to test. You can add as many sites to a team as you want, and you can test them as long as you have credits (We&amp;#x27;ll have a generous free plan available for anyone looking to get started).&lt;/p&gt;&lt;img src=&quot;static/scan-f6468bd6b14af0038786b3884e7ac4ca.png&quot; alt=&quot;The Polypane Cloud overview of a scan&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;When you add a site, we&amp;#x27;ll crawl it and find all the pages on it. We&amp;#x27;ll then test each page for accessibility issues and show you the results. Currently, you&amp;#x27;ll find our Heading, Landmark, Meta and Accessibility reports in the overview, with more to come. You can then click through to each page to see the issues on that page.&lt;/p&gt;&lt;img src=&quot;static/page-e8078953e78ffe3d303759d4b230c301.png&quot; alt=&quot;The Polypane Cloud overview of a single page&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;We know many auditors have their own way of working and ways of explaining different issues and how to fix them, so in Polypane Cloud all the issues can be customised as well as translated.&lt;/p&gt;&lt;img src=&quot;static/issues-71d6e4ee1b4a7fc075f43a9b61d4e1a2.png&quot; alt=&quot;The Polypane Cloud example of a customised issue&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;These customisations are automatically shared between your team, so you can work together and have a cohesive set of explainer texts for your reports. Each team can have multiple sets and copying values from different sets is easy as well.&lt;/p&gt;&lt;p&gt;This means you can provide reports in different languages, different levels of complexity or whatever else you need.&lt;/p&gt;&lt;h2 id=&quot;the-open-source-reporting-tool&quot;&gt;The open source reporting tool&lt;/h2&gt;&lt;p&gt;For each test Polypane Cloud also generates an EARL file. This is an open JSON format specifically for encoding accessibility results, so perfect for what we need.&lt;/p&gt;&lt;p&gt;With the exported EARL file you can create ready-to-go reports using our open source &lt;a href=&quot;https://github.com/Polypane/eleventy-wcag-earl-reporter&quot;&gt;eleventy-wcag-earl-reporter&lt;/a&gt;, which is based on &lt;a href=&quot;https://github.com/hidde/eleventy-wcag-reporter&quot;&gt;eleventy-wcag-reporter&lt;/a&gt; by Hidde de Vries.&lt;/p&gt;&lt;img src=&quot;static/wcag-1065c696d120ef6e5dc939a49e643428.png&quot; alt=&quot;The first few lines of the readme of eleventy-wcag-earl-reporter&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;This tool can read in the EARL file created by Polypane Cloud and create an HTML report that can also be saved as a PDF. The format is open source and both &lt;a href=&quot;https://github.com/Polypane/eleventy-wcag-earl-reporter/blob/main/schema.json&quot;&gt;an example EARL export&lt;/a&gt; and &lt;a href=&quot;https://github.com/Polypane/eleventy-wcag-earl-reporter/blob/main/example.json&quot;&gt;the schema&lt;/a&gt; are available in the repository for others to work with.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;We&amp;#x27;re hoping that the EARL file will also find a home in other accessibility testing and auditing tools&lt;/strong&gt;, so it can be exported by and imported into the tools you use to build your reports.&lt;/p&gt;&lt;p&gt;We&amp;#x27;re already in touch with a few of them, and if you&amp;#x27;re building such a tool, please get in touch! We&amp;#x27;re excited to make this work for everyone.&lt;/p&gt;&lt;h2 id=&quot;why-we-created-polypane-cloud&quot;&gt;Why we created Polypane Cloud&lt;/h2&gt;&lt;p&gt;Many people love the accessibility features in Polypane because they go a level deeper than what you usually find. While Polypane points out what&amp;#x27;s wrong, it also explains why it&amp;#x27;s wrong and how to fix it in the context of what they&amp;#x27;re working on. This way, accessibility becomes a part of your workflow, rather than something you have to do separately.&lt;/p&gt;&lt;p&gt;However, because Polypane is a browser, and browsers display &lt;em&gt;pages&lt;/em&gt; and not &lt;em&gt;websites&lt;/em&gt;, these checks have only been available to check on a per-page basis. Since we&amp;#x27;ve launched accessibility features in Polypane people have been asking us for a way to test entire websites.&lt;/p&gt;&lt;p&gt;During this time we&amp;#x27;ve also been talking with a lot of accessibility auditors and discussing how they work. We realised that there is a need for a tool that takes what we do in Polypane and runs it across entire websites. We&amp;#x27;ve been working on Polypane Cloud for the last year and a half (!) and can&amp;#x27;t wait to share it with you.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://polypane.cloud&quot;&gt;Join the mailing list here&lt;/a&gt; to be kept up to date with what&amp;#x27;s happening with Polypane Cloud, and a massive thanks for the folks who have been helping us get to here.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 15: Fully featured browser in the browse panel, performance improvements, Chromium 116 and more]]></title><description><![CDATA[In Polypane 15 we rebuilt the browse panel so that it's now a fully featured browser with tabs, pinned tabs, search and autocomplete. We…]]></description><link>https://polypane.app/blog/polypane-15-fully-featured-browser-in-the-browse-panel-performance-improvements-chromium-116-and-more/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-15-fully-featured-browser-in-the-browse-panel-performance-improvements-chromium-116-and-more/</guid><pubDate>Mon, 11 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In Polypane 15 we rebuilt the browse panel so that it&amp;#x27;s now a fully featured browser with tabs, pinned tabs, search and autocomplete.&lt;/p&gt;&lt;p&gt;We also improved performance throughout the app, added new features to the elements panel, added support for remote debugging and we&amp;#x27;re now also running on Chromium 116.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;What&amp;#x27;s &lt;a href=&quot;/&quot;&gt;Polypane&lt;/a&gt;?&lt;/strong&gt; Polypane is the web browser for ambitious web developers. It&amp;#x27;s a stand-alone browser that shows
sites in multiple fully synced &lt;em&gt;panes&lt;/em&gt; and helps you make your site more responsive, more accessible and faster.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;new-browse-panel&quot;&gt;New Browse panel&lt;/h2&gt;&lt;p&gt;Since the inception of the browse panel we&amp;#x27;ve been planning to add tabs and search to it. A major concern was to make sure that the browse panel wasn&amp;#x27;t taking resources from the panes and that it wouldn&amp;#x27;t slow down the app. We found a nice way to do it!&lt;/p&gt;&lt;p&gt;That&amp;#x27;s right, we built a browser into our browser.&lt;/p&gt;&lt;img src=&quot;static/browse-c1021fcddbd0a75441b829a05d982ffa.jpg&quot; alt=&quot;&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;With the browse panel now having tabs (which live alongside your project/main tab) and pinned tabs (which are available in all projects/tabs), you can have all the external resources you need right inside Polypane, doing away with a major source of context switching.&lt;/p&gt;&lt;img src=&quot;static/browse1-8f6761e969d2cca502caf78fa9242fcc.png&quot; alt=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;/&gt;&lt;h3 id=&quot;search-support&quot;&gt;Search support&lt;/h3&gt;&lt;p&gt;People have been asking us for search support for a long time too, and that just didn&amp;#x27;t make sense for the main UI in Polypane. But it does for the browse panel! The address bar in the browse panel works like an omnibox, so if you fill in something that&amp;#x27;s not a URL, we&amp;#x27;ll search for it in your default search engine.&lt;/p&gt;&lt;img src=&quot;static/search1-4e5b181302e7e289e987e3b2e22463e6.png&quot; alt=&quot;&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;That default search engine is configurable, and we ship with a whole bunch of them to make it easy to pick and switch, as well as an editor that lets you add your own (or update the existing ones).&lt;/p&gt;&lt;h4 id=&quot;quick-search&quot;&gt;Quick search&lt;/h4&gt;&lt;p&gt;You probably don&amp;#x27;t always want to search in your default search engine, sometimes you want to look up something in a specific one, like MDN. You can do that by prefixing your search with the first few letters of a search engine name, like &lt;code class=&quot;language-text&quot;&gt;m query&lt;/code&gt; for MDN or &lt;code class=&quot;language-text&quot;&gt;ec query&lt;/code&gt; for Ecosia.&lt;/p&gt;&lt;p&gt;There&amp;#x27;s a bunch more features, like installing Browser extensions and setting a homepage and more. You can read all about it in the &lt;a href=&quot;/docs/browse/&quot;&gt;browse documentation&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&quot;let-us-know-what-to-do-about-shortcuts&quot;&gt;Let us know what to do about shortcuts&lt;/h3&gt;&lt;p&gt;The one thing still missing is browse-panel specific keyboard shortcuts. &lt;strong&gt;We&amp;#x27;d like your input!&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Should we use the same shortcuts as the main UI (like &lt;kbd class=&quot;ShortcutDisplay-styles-module--shortcutdisplay--318pA&quot; aria-label=&quot;Shortcut: ⌘ T&quot;&gt;⌘ T&lt;/kbd&gt; ) but look at whether the browse panel is focused, or should we use different shortcuts (like &lt;kbd class=&quot;ShortcutDisplay-styles-module--shortcutdisplay--318pA&quot; aria-label=&quot;Shortcut: ⌘ ⌥ T&quot;&gt;⌘ ⌥ T&lt;/kbd&gt; )? Let us know!&lt;/p&gt;&lt;h2 id=&quot;search-from-the-regular-address-bar&quot;&gt;Search from the regular address bar!&lt;/h2&gt;&lt;p&gt;Most people&amp;#x27;s muscle memory is likely to still use the main address bar so when you fill in a search query there, we forward it to the browse panel. And here too you can search with the first few letters of a specific search engine to pick that one.&lt;/p&gt;&lt;h2 id=&quot;performance-improvements&quot;&gt;Performance improvements&lt;/h2&gt;&lt;p&gt;In this release we profiled many different parts of the app and made a lot of improvements to make Polypane faster and more responsive.&lt;/p&gt;&lt;p&gt;We had a pretty big performance issue where many network requests (like those done by Next, Gatsby etc) inside the panes would really slow down the UI. A lot of the feedback about performance that we&amp;#x27;ve been getting since the past release was related to this, and I&amp;#x27;m happy to say that we&amp;#x27;ve resolved this problem!&lt;/p&gt;&lt;p&gt;We also improved the responsiveness of a number of debug tools and common actions by decoupling their UI responsiveness from the rest of the application. The result is that Polypane is now much more responsive and snappy.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;If performance was an issue for you in the past, give Polypane 15 a try!&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;remote-debugging-support&quot;&gt;Remote Debugging support&lt;/h2&gt;&lt;p&gt;Many IDEs have a setting where they can open a browser and connect to it for debugging. This is called remote debugging and it&amp;#x27;s a great way to have your site visible in your browser, but get all the debugging info in your IDE alongside your code.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Turns out, we already had basic support for it!&lt;/strong&gt; We only needed to do a little bit of work to bring it up to proper support. Use the CLI command to open Polypane with &lt;a href=&quot;/docs/command-line-options/#remote-debugging&quot;&gt;remote debugging&lt;/a&gt; enabled or configure your IDE to open Polypane with remote debugging enabled.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sh&quot;&gt;&lt;pre class=&quot;language-sh&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;$ polypane --remote-debugging-port&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4321&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Thanks for Benjamin to get the ball rolling on this, and thanks to the WebStorm team to helping me figure out how they call the browser so we can correctly react to it. You can find the instructions for WebStorm here: &lt;a href=&quot;/docs/configuring-web-storm-to-work-with-polypane/&quot;&gt;Configuring WebStorm to work with Polypane&lt;/a&gt; and we&amp;#x27;ll be adding more IDEs soon.&lt;/p&gt;&lt;h2 id=&quot;elements-panel-improvements&quot;&gt;Elements panel improvements&lt;/h2&gt;&lt;p&gt;The elements panel is one of the places where we spent time improving performance, as well as making a bunch of smaller tweaks:&lt;/p&gt;&lt;h3 id=&quot;layout-debugging-for-subtree-of-selected-element&quot;&gt;Layout debugging for subtree of selected element&lt;/h3&gt;&lt;p&gt;You can now turn on layout debugging for just the selected element and its children. Super useful if you want to focus in on the structure of one particular part of the page without having to turn on layout debugging for the entire page. Thanks Rik for suggesting this one!&lt;/p&gt;&lt;img src=&quot;static/layoutdebugging-02296e483b54345e895c57406b58968b.png&quot; alt=&quot;&quot; class=&quot;imgshadow&quot;/&gt;&lt;h3 id=&quot;support-for-complex-layer-nesting&quot;&gt;Support for complex @layer nesting&lt;/h3&gt;&lt;p&gt;We now resolve a whole bunch of advanced and complex nested @layer rules, none of which you should use but that we support anyway. So if you write stuff like this:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@layer&lt;/span&gt; components&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; components.alert&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@layer&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@layer&lt;/span&gt; ihaveaname&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; ... &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@layer&lt;/span&gt; components&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@layer&lt;/span&gt; table&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@layer&lt;/span&gt; thead&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; ... &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@layer&lt;/span&gt; tbody&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; ... &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@layer&lt;/span&gt; table.tfoot&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; ... &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It&amp;#x27;ll be correctly resolved to this:&lt;/p&gt;&lt;img src=&quot;static/csslayers-1534512fc72a19b9ca79e89d5c938dbc.png&quot; alt=&quot;&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;In the screenshot you can see some of the layers are more prominent. We dim all the layers that do not apply to the currently selected element, so you can quickly see which layers are relevant for the element you&amp;#x27;re currently inspecting.&lt;/p&gt;&lt;p&gt;Thanks to &lt;a href=&quot;https://www.projectwallace.com&quot;&gt;Project Wallace&lt;/a&gt; for getting us to improve our existing implementation. While Polypane uses the page&amp;#x27;s CSSOM to get the styles, Project Wallace inspects your CSS sources and gives you all sorts of insights. They have a cool &lt;a href=&quot;https://www.projectwallace.com/css-layers-visualizer&quot;&gt;@layer visualizer&lt;/a&gt; you should check out.&lt;/p&gt;&lt;img src=&quot;static/nesting-344dedbe54f819ce2da197752a393232.png&quot; alt=&quot;&quot; style=&quot;float:right;max-width:400px;margin:2rem 0 1rem 1rem&quot; class=&quot;imgshadow&quot;/&gt;&lt;h3 id=&quot;nesting-indicator-lines-in-the-tree-view&quot;&gt;Nesting indicator lines in the tree view&lt;/h3&gt;&lt;p&gt;Your code editor (probably) draws lines to show you the nesting of your code and that&amp;#x27;s really helpful. So we now do the same in the tree view in the elements panel.&lt;/p&gt;&lt;p&gt;It&amp;#x27;s a small thing but it makes it much easier to see the structure of your page.&lt;/p&gt;&lt;h3 id=&quot;debug-tab-improvements&quot;&gt;Debug tab improvements&lt;/h3&gt;&lt;p&gt;The debug tab in the elements panel is all about showing element properties that often cause issues in a clear overview. We added a couple more:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The rendered font. This is also visible in the navigator and on inspecting elements, but it&amp;#x27;s nice to see here alongside other items.&lt;/li&gt;&lt;li&gt;The currently used source for videos (we already showed this for images) so you know which of your source files is being used.&lt;/li&gt;&lt;li&gt;The container type when an element is a container, so you know container queries use its size.&lt;/li&gt;&lt;li&gt;The natural size of an image, so you can see if it&amp;#x27;s being resized.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;container-query-unit-previews&quot;&gt;Container query unit previews&lt;/h3&gt;&lt;p&gt;Along with the actual size of a container, which we show when you hover over the &lt;code class=&quot;language-text&quot;&gt;container&lt;/code&gt; badge, we now also show you how much &lt;code class=&quot;language-text&quot;&gt;1cqw&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;1cqh&lt;/code&gt; for this container is in pixels, so you don&amp;#x27;t have to do that math yourself.&lt;/p&gt;&lt;h2 id=&quot;mastodon-preview&quot;&gt;Mastodon preview&lt;/h2&gt;&lt;p&gt;We&amp;#x27;re continuing to add more social media previews to Polypane. This time we added Mastodon, the open source social network, bringing the total up to nine, which we think is &lt;strong&gt;the most extensive preview collection of any tool.&lt;/strong&gt;&lt;/p&gt;&lt;img src=&quot;static/mastodon-950af32f02e37d7291db011cdba601cb.png&quot; alt=&quot;&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;Mastodon is interesting because while their code is open source (which makes it much easier to see how they build their preview!) they actually use &lt;a href=&quot;https://polypane.app/docs/meta-information/#structured-data&quot;&gt;json-ld&lt;/a&gt; as their primary source of data, and that&amp;#x27;s a fair bit more complicated than just getting some meta tags.&lt;/p&gt;&lt;p&gt;On the plus side, they get to display much richer previews, including the author, date and publisher, all of which we accurately reproduce in Polypane.&lt;/p&gt;&lt;h2 id=&quot;other-changes&quot;&gt;Other changes&lt;/h2&gt;&lt;p&gt;Smaller but still useful new features that are worth mentioning:&lt;/p&gt;&lt;h3 id=&quot;platform-emulation&quot;&gt;Platform emulation&lt;/h3&gt;&lt;p&gt;Alongside a user agent, your browser also communicates the platform it&amp;#x27;s running on, and this doesn&amp;#x27;t automatically change when you change your user agent. Some sites use this to serve different content to different platforms, so we now support changing the platform in the emulation settings.&lt;/p&gt;&lt;video src=&quot;static/platform-emulation-b9fd0a3ebe150d273539940fbd9e620d.mp4&quot; controls=&quot;&quot; class=&quot;imgshadow&quot;&gt;&lt;/video&gt;&lt;p&gt;All existing devices have been updated to correctly emulate their platform.&lt;/p&gt;&lt;h3 id=&quot;cloudflare-captcha&quot;&gt;Cloudflare captcha&lt;/h3&gt;&lt;p&gt;Cloudflare is a popular CDN and security service that many sites use. They have a captcha that they show when they detect suspicious traffic, and previous versions of Polypane failed that captcha for a number of different reasons.&lt;/p&gt;&lt;p&gt;We worked with the Cloudflare team to prevent this from happening and while they couldn&amp;#x27;t tell us anything about their algorithm, we&amp;#x27;re happy to say that Polypane no longer triggers the captcha.&lt;/p&gt;&lt;p&gt;Thank you Andrew for putting this on our radar and the Cloudflare team for helping us out!&lt;/p&gt;&lt;h3 id=&quot;debug-tools-improvements&quot;&gt;Debug tools improvements&lt;/h3&gt;&lt;p&gt;The macular degeneration debug tool is now interactive, like the glaucoma and tunnel vision ones. All interactive debug tools, like the target size debug tools, have been made more performant by decoupling their update speed from the rest of the page.&lt;/p&gt;&lt;h3 id=&quot;new-installer-image-on-macos&quot;&gt;New installer image on macOS&lt;/h3&gt;&lt;p&gt;We hadn&amp;#x27;t updated the macOS installer background since launching Polypane and it started to show, so we updated it to a more modern look.&lt;/p&gt;&lt;img src=&quot;static/macos-93166dcd7e3d19779578b600e1c16395.png&quot; alt=&quot;&quot; class=&quot;imgshadow&quot;/&gt;&lt;h2 id=&quot;chromium-116&quot;&gt;Chromium 116&lt;/h2&gt;&lt;p&gt;Polypane now runs on Chromium 116.0.5845.141, which means we have support for animating &lt;code class=&quot;language-text&quot;&gt;display&lt;/code&gt;, CSS Motion path and from Chromium 115: &lt;code class=&quot;language-text&quot;&gt;display&lt;/code&gt; with two values.&lt;/p&gt;&lt;p&gt;We&amp;#x27;ve also enables new flags so you can try out upcoming features like &lt;code class=&quot;language-text&quot;&gt;accentcolor&lt;/code&gt;, anchor positioning, &lt;code class=&quot;language-text&quot;&gt;@scope&lt;/code&gt; and exponential functions in CSS. View the full list here: &lt;a href=&quot;/docs/experimental-chromium-features/&quot;&gt;Experimental Chromium features&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;get-polypane-15&quot;&gt;Get Polypane 15&lt;/h2&gt;&lt;p&gt;Polypane is available for Windows, Mac and Linux (.deb or AppImage) in both 64 bit and ARM versions.&lt;/p&gt;&lt;p&gt;Polypane automatically updates on Mac, Windows and on Linux when using the AppImage. Otherwise, go to
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; to download the latest version!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Try it for free&lt;/a&gt;.&lt;/strong&gt; No credit card needed.&lt;/p&gt;&lt;h2 id=&quot;polypane-1501-changelog&quot;&gt;Polypane 15.0.1 Changelog&lt;/h2&gt;&lt;p&gt;This version bumps the Chromium version to fix CVE-2023-5217.&lt;/p&gt;&lt;h2 id=&quot;polypane-15-changelog&quot;&gt;Polypane 15 Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;New&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Full-featured side browser&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Support for search in address bar&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Support for remote debugging&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Debug tools: Interactive macular degeneration (Thanks Severin!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Mastodon preview&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Support Cloudflare Captcha (Thanks Andrew!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Platform emulations&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Chromium 116&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improved&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Console panel: no longer scrolls to bottom when new messages arrive&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: Focus order also shows warning for going straight up&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; You can now hover and scroll over zoom slider to zoom in/out&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Container query info tooltips show the size of 1 cqw/cqh&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; &amp;#x27;Getting started&amp;#x27; is now called &amp;#x27;Quick start&amp;#x27;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Console panel: now also shows the request headers (Thanks Jay!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; User agent overwrites are now consistent for all subresources&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Better support for Wayland&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Full page screenshots now support more website configurations (Thanks Killian!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Focus layout header works the same as the full layout&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated workspace presets&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; New installer image on mac&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Devtools: Open urls in Browse panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements Panel: Layout debugging for subtree of selected element (Thanks Rik!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements Panel: Support for complex @layer nesting&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements Panel: Improved inheritable properties list&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements Panel: draw nesting indicator lines in tree view&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements Panel: improve hidden element styling in tree view (Thanks Ahmad!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements Panel: New features in the debug tab&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements Panel: improved performance of computed tab&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Web vitals: Prevent duplicate requests for CrUX data&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Performance: more responsive interactive debug tools&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Performance: No longer slows down the UI on network events&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Overal UI performance and responsiveness&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Remove full browser layout as option during onboarding&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; .deb installations of Polypane can now also be auto-updated&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Experimental chromium flags added&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated google fonts&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Outline panel: non-http links no longer show a spinner after checking.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Incorrect position of status bar in full layout with address bar hidden&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Reference image didn&amp;#x27;t work on Windows (Thanks Jessica!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Dismissing the Quick Start didn&amp;#x27;t hide it on page load (Thanks Maria!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Page down in horizontal mode sometimes scrolled vertically&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Restart issue on Mac (Thanks Charlie!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: hidden elements could show incorrect box model info&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Element Panel: Computed tab can now edit elements again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Meta panel: The Facebook preview had a scrollable description&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Polypane 14.1: Container query support, forced element state and contrast lines in color pickers]]></title><description><![CDATA[Container queries in the Polypane Elements panel, color pickers now show contrast lines, the ability to force pseudo states like hover or…]]></description><link>https://polypane.app/blog/polypane-14-1-container-query-support-forced-element-state-and-contrast-lines-in-color-pickers/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-14-1-container-query-support-forced-element-state-and-contrast-lines-in-color-pickers/</guid><pubDate>Wed, 12 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Container queries in the Polypane Elements panel, color pickers now show contrast lines, the ability to force pseudo states like hover or focus on elements, a new Cascade layer tree overview, new devices and better handling of forms and URLs across panes.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;What&amp;#x27;s &lt;a href=&quot;/&quot;&gt;Polypane&lt;/a&gt;?&lt;/strong&gt; Polypane is the web browser for ambitious web developers. It&amp;#x27;s a stand-alone browser that shows
sites in multiple fully synced &lt;em&gt;panes&lt;/em&gt; and helps you make your site more responsive, more accessible and faster.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;We also fixed the stupid bug that prevented you from scrolling in panes sometimes. Sorry about that one!&lt;/p&gt;&lt;h2 id=&quot;container-queries-in-the-elements-panel&quot;&gt;Container queries in the Elements panel&lt;/h2&gt;&lt;p&gt;For the container query support in the &lt;a href=&quot;/docs/elements-panel/&quot;&gt;Elements panel&lt;/a&gt; we took a step back to figure out what the questions are that you want answered when dealing with container queries, and designed UI to deal with those.&lt;/p&gt;&lt;p&gt;In the tree view you can see at a glance which element are containers through the &amp;quot;container&amp;quot; badge. Hovering the badge will show you the container query&amp;#x27;s name, type and size, so you don&amp;#x27;t need to click and inspect to get a general idea of the container (is it only inline-size or not, what are the relevant dimensions?) Clicking the badge highlights it in pages just like the &lt;a href=&quot;/docs/elements-panel/#flex-and-grid-layout-overlays&quot;&gt;flex and grid layout overlays&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Then in the style overview, container queries are annotated with the container properties and a link to the containing element. Hover over them to quickly see the same name, type and size information as in the tree view. This helps a lot when you use container query units, as well as figuring out which container you&amp;#x27;re dealing with.&lt;/p&gt;&lt;img src=&quot;static/containerquerystylepanel-8726887d26ae07b0ce88944a29684e4b.png&quot; alt=&quot;&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;You can click the containing element to inspect and edit it so you don&amp;#x27;t have to hunt across the tree view for it. This is especially useful with nested container queries.&lt;/p&gt;&lt;p&gt;Implementing container queries in the elements panel was a huge undertaking. There are no client-side APIs to know whether a container query applies or not so we had to write our own parser for container queries. The result though is that support for container queries is now deeply integrated into the elements panel.&lt;/p&gt;&lt;h2 id=&quot;other-elements-panel-improvements&quot;&gt;Other Elements panel improvements&lt;/h2&gt;&lt;p&gt;Along with container query support, we&amp;#x27;ve made a few other improvements to the elements panel.&lt;/p&gt;&lt;h3 id=&quot;set-the-element-state&quot;&gt;Set the element state&lt;/h3&gt;&lt;p&gt;You can now set the state of an element in the elements panel. This allows you to force pseudo states like &lt;code class=&quot;language-text&quot;&gt;:hover&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;:focus&lt;/code&gt; on elements, or to force the &lt;code class=&quot;language-text&quot;&gt;:active&lt;/code&gt; state of a button. This way you can see how your site behaves in different states without having to interact with it, and you can debug styling issues with pseudo states.&lt;/p&gt;&lt;img src=&quot;static/elementstate-57456abdbca68f1f0cb33cd4ace31b55.png&quot; alt=&quot;&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;Elements with a forced pseudo state get a badge in the treeview so you can see at a glance which elements have a forced state.&lt;/p&gt;&lt;h3 id=&quot;cascade-layer-overview&quot;&gt;Cascade layer overview&lt;/h3&gt;&lt;p&gt;Last year in &lt;a href=&quot;https://polypane.app/blog/polypane-8-better-elements-inspector-new-syncing-features-chromium-98-and-more/&quot;&gt;Polypane 8&lt;/a&gt; we added support for the new @layer CSS rule. We&amp;#x27;ve now updated our support for Cascade layers with a new CSS layers overview.&lt;/p&gt;&lt;img src=&quot;static/layertree-7200c981e54d971e64ebd56b41bb4983.png&quot; class=&quot;imgshadow&quot; alt=&quot;Cascade layer overview&quot;/&gt;&lt;p&gt;The overview shows all your layers in a nested overview so you can quickly see the structure of your layers. In addition, layers that are not applicable to the current element are greyed out, so you can see at a glance which layers are relevant for the styling of the currently selected element.&lt;/p&gt;&lt;h3 id=&quot;send-an-elements-text-and-background-colors-to-the-color-picker&quot;&gt;Send an element&amp;#x27;s text and background colors to the color picker&lt;/h3&gt;&lt;p&gt;Click on the contrast ratio rating in the &lt;a href=&quot;/docs/elements-panel/#navigator&quot;&gt;Element Navigator&lt;/a&gt; or &lt;a href=&quot;/docs/elements-panel/#a11y&quot;&gt;A11y tab&lt;/a&gt; will send the text and background colors to the &lt;a href=&quot;/docs/color-picker/&quot;&gt;color picker&lt;/a&gt;. There you can adjust the colors and see the contrast ratio update in real time, or create a swatch screenshot to share with your team.&lt;/p&gt;&lt;h3 id=&quot;showing-the-resolved-css-selector&quot;&gt;Showing the resolved CSS selector&lt;/h3&gt;&lt;p&gt;The resolved selector is the CSS Selector that your browser uses to match elements, and it&amp;#x27;s not always the selector you write.&lt;/p&gt;&lt;p&gt;With CSS Nesting, the actual selector that the browser uses to match elements is resolved from the nesting where each &lt;code class=&quot;language-text&quot;&gt;&amp;amp;&lt;/code&gt; gets replaced with the parent selector wrapped in &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt;.&lt;/p&gt;&lt;img src=&quot;static/resolvedselector-65f54d3ffd85ce39727b79ac3aebaadd.png&quot; alt=&quot;&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;When hovering the specificity score, we now show the resolved selector. You can still click the specificity to open the &lt;a href=&quot;/css-specificity-calculator/&quot;&gt;CSS specificity calculator&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;contrast-lines-in-all-color-pickers&quot;&gt;Contrast lines in all color pickers&lt;/h2&gt;&lt;p&gt;Color pickers across the app are now aware of the background color and contrast ratio and they will show lines for AA, AAA and APCA contrast ratios.&lt;/p&gt;&lt;video src=&quot;static/colorpickercontrast-566fdba7f69d1b772cdd78fba1cc9022.mp4&quot; controls=&quot;&quot; class=&quot;imgshadow&quot;&gt;&lt;/video&gt;&lt;p&gt;The three lines correspond to 3:1, 4.5:1 and 7:1 for WCAG, and Lc 45, Lc 60 and Lc 75 for APCA.&lt;/p&gt;&lt;p&gt;In &lt;a href=&quot;/docs/elements-panel/&quot;&gt;the elements panel&lt;/a&gt;, the color picker will automatically detect what type of contrast it needs (small text needs 4.5:1, while large text or border colors need 3:1) and in &lt;a href=&quot;/docs/color-picker/&quot;&gt;the color picker&lt;/a&gt; UI you can choose what contrast ratio you want to meet.&lt;/p&gt;&lt;p&gt;The line that is highlighted is the one you should meet, so it becomes very easy to find a better contrasting color.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Though currently exclusive to Polypane, the contrast lines will find their way to &lt;a href=&quot;https://colorcontrast.app&quot;&gt;colorcontrast.app&lt;/a&gt; in the future.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;new-hover-sync-engine&quot;&gt;New hover sync engine&lt;/h2&gt;&lt;p&gt;We&amp;#x27;ve completely rewritten the sync engine for hovers and it&amp;#x27;s now much more robust. Hover styling is now also applied to child nodes and pseudo elements, and we no longer show stale hover styles after editing them. The new sync engine is also faster which should result in more responsive panes.&lt;/p&gt;&lt;h2 id=&quot;distance-between-guides&quot;&gt;Distance between guides&lt;/h2&gt;&lt;p&gt;By default, guides show the distance to the edges of the pane, but you can check &amp;#x27;Show distance between guides&amp;#x27; to show the distance between all shown guides.&lt;/p&gt;&lt;video src=&quot;static/measure-distance2-cd179e4853a26e40b3503aeedf20ecec.mp4&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;max-width:auto&quot;&gt;&lt;/video&gt;&lt;p&gt;This is useful when you want to check the distance between two elements, or when you want to check the dimensions of a group of elements.&lt;/p&gt;&lt;h2 id=&quot;notable-bug-fixes-and-core-improvements&quot;&gt;Notable bug fixes and core improvements&lt;/h2&gt;&lt;p&gt;You can find all changes below in the changelog but we wanted to call out a few:&lt;/p&gt;&lt;h3 id=&quot;scrolls-not-being-captured-by-panes&quot;&gt;Scrolls not being captured by panes&lt;/h3&gt;&lt;p&gt;Many of you noticed this unfortunately, but when your mouse entered the pane from a certain angle, scroll events weren&amp;#x27;t properly sent into the pane but instead to the workspace.&lt;/p&gt;&lt;p&gt;This was due to some work we did to make pane resizing more efficient in 14.0. It&amp;#x27;s now fixed and scroll events are properly sent to the pane.&lt;/p&gt;&lt;h3 id=&quot;better-handling-of-forms-and-urls-across-panes&quot;&gt;Better handling of forms and URLs across panes&lt;/h3&gt;&lt;p&gt;We&amp;#x27;ve made two improvements to the way URLs and forms are handled in a multi-pane setup.&lt;/p&gt;&lt;p&gt;When submitting a form, Polypane will only submit it in a single pane to avoid sending the same form submission multiple times. We&amp;#x27;ve increased the number of situations where we can correctly detect and prevent a form submission.&lt;/p&gt;&lt;p&gt;For URLs, we no longer normalize the search params of URLs when syncing them across panes. This helps in situations where the order of search params is assumed by the JS on the page, or when there is a specific encoding used in the search params (as our implementation also normalized the encoding).&lt;/p&gt;&lt;p&gt;The result is that when dealing with forms or URLs with search params, you should encounter less issues when syncing across panes.&lt;/p&gt;&lt;h3 id=&quot;meta-panel-improvements&quot;&gt;Meta panel improvements&lt;/h3&gt;&lt;p&gt;The meta panel now warns you when the urls to your og images are incorrect, and we&amp;#x27;ve updated the previews for Twitter, LinkedIn and Google. In addition, we&amp;#x27;ve also improved the handling of robots.txt and humans.txt files so you&amp;#x27;ll see requests for those those even less when running a dev server.&lt;/p&gt;&lt;h2 id=&quot;what-can-we-do-for-you&quot;&gt;What can we do for you?&lt;/h2&gt;&lt;p&gt;As you&amp;#x27;ve seen in the changelogs for this release and the past few releases, many features have come from Polypane&amp;#x27;s users. We love getting feedback and one of the best things about having devs as users is that they are &lt;em&gt;very good at feature requests&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;So consider this an open invitation: What is missing from Polypane? What&amp;#x27;s the one thing we should do that makes Polypane amazing for you? What nit would you just love we fix? &lt;a href=&quot;/support/&quot;&gt;Let us know!&lt;/a&gt; 🙏&lt;/p&gt;&lt;h2 id=&quot;get-polypane-141&quot;&gt;Get Polypane 14.1&lt;/h2&gt;&lt;p&gt;Polypane is available for Windows, Mac and Linux (.deb or AppImage) in both 64 bit and ARM versions.&lt;/p&gt;&lt;p&gt;Polypane automatically updates on Mac, Windows and on Linux when using the AppImage. Otherwise, go to
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; to download the latest version!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Try it for free&lt;/a&gt;.&lt;/strong&gt; No credit card needed.&lt;/p&gt;&lt;h2 id=&quot;polypane-141-changelog&quot;&gt;Polypane 14.1 Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;New&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Color pickers now show contrast lines&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Hover sync engine that supports child and pseudo element syncing&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Elements panel: Set the element state&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Elements panel: Support for container queries&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Elements panel: Show container badges in tree view&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Elements panel: Cascade layer tree overview&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Show distance between guides&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; New Samsung Galaxy s22 devices&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improved&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Request robots.txt, humans.txt etc less often&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta Panel: updated Twitter, LinkedIn and Google previews&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta Panel: extra warnings for incorrectly linked og images&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Clicking contrast info opens the color picker with the colors selected (Thanks Eric!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Show the real size, type, name and size query of container elements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: The resolved selector is shown as tooltip when hovering the specificity (Thanks Bart!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Clicking the session in the address bar opens the session manager&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Add a warning for the next dev server with App directory&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; URL handling of urls with search params (Thanks Ferry)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Duplicate tab context menu now allows for picking a new layout (Thanks Dash!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Prevent additional form submissions in panes for &amp;lt;input type=submit&amp;gt; (Thanks Alessandro!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Better visual design for the session indicator of tabs&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Better permission prompt for access to clipboard write access&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Improved scrolling in pane options&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; More known CSS properties&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated accessibility ruleset&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated Google Fonts list&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated Chromium to 114.0.5735.134&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; issue with scrolls not being captured by panes (Thanks Adam and many others!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Screenshots setting to directly save to disk/copy to clipboard work again (Thanks Adrian!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Correct URL for geolocation API info in permission prompt (Thanks Neal!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Browser-sync button opens correct page (Thanks James!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Hide devtools when extension manager or session manager is open&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Panel UI is now clickable on macOS with the header hidden (Thanks Trond!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Chrome devtools bounds were off by 1px&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Storing workspaces on first launch failed (Thanks Ilker)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: workaround for issue where CSSOM returns faulty info for background-clip property&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: Box model overview said NaN instead of &amp;#x27;auto&amp;#x27;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: contrast score in dark mode had incorrect background&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Offset parent and stacking context: positioning elements in all three dimensions]]></title><description><![CDATA[They are fundamental CSS concepts you use every single day whether you know it or not: the  offset parent  and  stacking context . In this…]]></description><link>https://polypane.app/blog/offset-parent-and-stacking-context-positioning-elements-in-all-three-dimensions/</link><guid isPermaLink="false">https://polypane.app/blog/offset-parent-and-stacking-context-positioning-elements-in-all-three-dimensions/</guid><pubDate>Thu, 06 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;They are fundamental CSS concepts you use every single day whether you know it or not: the &lt;code class=&quot;language-text&quot;&gt;offset parent&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;stacking context&lt;/code&gt;. In this article we&amp;#x27;ll explore how you can use them to position elements in all three dimensions, and how to debug them.&lt;/p&gt;&lt;h2 id=&quot;prefer-video&quot;&gt;Prefer video?&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://kevinpowell.co/&quot;&gt;Kevin Powell&lt;/a&gt; and I recorded a video on the offset parent and stacking context as well so if you prefer video, you can find all the info here:&lt;/p&gt;&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom:56.25%;position:relative;height:0;overflow:hidden&quot;&gt; &lt;div style=&quot;position:relative;width:100%;padding-top:56.25%&quot;&gt; &lt;iframe src=&quot;https://www.youtube.com/embed/GS6b9p6edfk&quot; title=&quot;YouTube video player&quot; frameBorder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot; style=&quot;position:absolute;top:0;left:0;width:100%;height:100%&quot;&gt;&lt;/iframe&gt; &lt;/div&gt; &lt;/div&gt;&lt;h2 id=&quot;offset-parent&quot;&gt;Offset parent&lt;/h2&gt;&lt;p&gt;When you position your element with absolute positioning along the X and Y axis, what is it positioned relative to? The answer is the &lt;code class=&quot;language-text&quot;&gt;offset parent&lt;/code&gt;. Whenever you position an element with top, right, bottom and left, the browser looks at this &amp;#x27;offset parent&amp;#x27; to determine where to place the element.&lt;/p&gt;&lt;p&gt;The offset parent of an element is the nearest ancestor with a position other than &lt;code class=&quot;language-text&quot;&gt;static&lt;/code&gt;, or the body if none of the ancestor have positioning. This means that if you position an element with &lt;code class=&quot;language-text&quot;&gt;position: absolute&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;top: 0&lt;/code&gt;, it will be positioned at the top of the offset parent. So when you&amp;#x27;re laying out a page, knowing the offset parent of an element is crucial to understanding where it will be positioned.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Something that could trip you up here is that we&amp;#x27;re talking about placing an element &lt;em&gt;relative&lt;/em&gt; to another element, but using &lt;em&gt;position: absolute&lt;/em&gt; to do so. When an element has an absolute position, it get&amp;#x27;s taken out of the document flow (it no longer pushed other elements down) but it&amp;#x27;s placement is still &lt;em&gt;relative&lt;/em&gt; to the offset parent.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;an-example&quot;&gt;An example&lt;/h3&gt;&lt;p&gt;Let&amp;#x27;s look at an example. Here we have the HTML and CSS for a block quote and we want to put a quote mark behind it for styling.&lt;/p&gt;&lt;p&gt;As you can see, the quote is in the top left of the &lt;em&gt;page&lt;/em&gt; instead of the top left of the block quote, and that&amp;#x27;s because the blockquote itself doesn&amp;#x27;t have an offset. That means the offset parent of the quote mark is the body.&lt;/p&gt;&lt;div&gt;&lt;div class=&quot;offsetExample-styles-module--offsetexample--1uj1c&quot;&gt;&lt;div class=&quot;offsetExample-styles-module--code--3GLGc&quot;&gt;&lt;div class=&quot;offsetExample-styles-module--block--3MRi4&quot; style=&quot;height:224px&quot;&gt;&lt;div class=&quot;gatsby-highlight&quot; style=&quot;translate:-0px -0px&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;parent&amp;quot;&amp;gt;
  &amp;lt;blockquote&amp;gt;
    &amp;lt;span&amp;gt;&amp;amp;ldquo;&amp;lt;/span&amp;gt;
    Lorem ipsum dolor sit amet consectetur adipisicing elit. Tempora
    tenetur molestias consequatur, quidem nam ipsum minima aliquid
    recusandae delectus enim.
  &amp;lt;/blockquote&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;textarea spellcheck=&quot;false&quot;&gt;&amp;lt;div class=&amp;quot;parent&amp;quot;&amp;gt;
  &amp;lt;blockquote&amp;gt;
    &amp;lt;span&amp;gt;&amp;amp;ldquo;&amp;lt;/span&amp;gt;
    Lorem ipsum dolor sit amet consectetur adipisicing elit. Tempora
    tenetur molestias consequatur, quidem nam ipsum minima aliquid
    recusandae delectus enim.
  &amp;lt;/blockquote&amp;gt;
&amp;lt;/div&amp;gt;&lt;/textarea&gt;&lt;/div&gt;&lt;div class=&quot;offsetExample-styles-module--block--3MRi4&quot; style=&quot;height:288px&quot;&gt;&lt;div class=&quot;gatsby-highlight&quot; style=&quot;translate:-0px -0px&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code&gt;blockquote { /*position: relative;*/ }

blockquote span {
  position: absolute;
  top: 0;
  left: 0;
  font-size: 10em;
  font-family: serif;
  font-weight: bold;
  line-height:0.5;
  color: palegreen;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;textarea spellcheck=&quot;false&quot;&gt;blockquote { /*position: relative;*/ }

blockquote span {
  position: absolute;
  top: 0;
  left: 0;
  font-size: 10em;
  font-family: serif;
  font-weight: bold;
  line-height:0.5;
  color: palegreen;
}&lt;/textarea&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;offsetExample-styles-module--result--2kh-T&quot;&gt;&lt;iframe title=&quot;result&quot; sandbox=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;offsetExample-styles-module--buttonbar--1u3I7&quot;&gt;&lt;button type=&quot;button&quot;&gt;Add position to blockquote&lt;/button&gt;&lt;p&gt;Offset parent: &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Click the button above to set &lt;code class=&quot;language-text&quot;&gt;position: relative&lt;/code&gt; on the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;blockquote&amp;gt;&lt;/code&gt; (or edit the CSS directly!) Now without changing the styling of the span with the quote mark, it moved from the top left of the page to the top left of the blockquote. and that&amp;#x27;s because we made the blockquote an offset parent.&lt;/p&gt;&lt;h3 id=&quot;how-to-find-the-offset-parent&quot;&gt;How to find the offset parent&lt;/h3&gt;&lt;p&gt;For a given element, how do you find the offset parent? You could open the element inspector and go through all ancestors to see which one has a position other than &lt;code class=&quot;language-text&quot;&gt;static&lt;/code&gt; set, but browsers also have a built-in way to find the offset parent: the &lt;code class=&quot;language-text&quot;&gt;offsetParent&lt;/code&gt; property on the element in JavaScript. This property returns the offset parent of an element, or null if there is none.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; offsetParent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; element&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;offsetParent&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But selecting an element, switching over to the console tab and typing that in each time is also a bit cumbersome.&lt;/p&gt;&lt;p&gt;There&amp;#x27;s a much easier way to find the offset parent: the &lt;a href=&quot;/docs/elements-panel/#debug&quot;&gt;&amp;#x27;debug&amp;#x27; tab&lt;/a&gt; in the Polypane Elements panel. This tab shows you the offset parent of the currently selected element, you can hover it to highlight it in the page and by clicking it the elements panel immediately jumps to it so you can edit it, in sync across all the panes in your tab.&lt;/p&gt;&lt;img alt=&quot;Element debug panel with an arrow pointing to the offset parent&quot; src=&quot;static/offsetpanel1-d160382b5eeab2d92447220699441dd7.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:1rem auto 1rem;display:block;max-width:100%&quot;/&gt;&lt;p&gt;Now that you know about the offset parent and how to quickly find it, debugging positioning issues becomes a lot easier as you&amp;#x27;ll always know what an element is positioned relative to. But there&amp;#x27;s more to positioning than just the offset parent. Let&amp;#x27;s look at the other dimension: the z-axis.&lt;/p&gt;&lt;h2 id=&quot;stacking-context&quot;&gt;Stacking context&lt;/h2&gt;&lt;p&gt;Where offset parents tell you how an element is positioned in the x and y direction, the stacking context tells you how it gets positioned in the third dimension: how close it is towards the front of the screen.&lt;/p&gt;&lt;p&gt;You&amp;#x27;ll have encountered stacking context before when you used &lt;code class=&quot;language-text&quot;&gt;z-index&lt;/code&gt; to position elements on top of each other and two elements not responding to &lt;code class=&quot;language-text&quot;&gt;z-index&lt;/code&gt; the way you think they should. That&amp;#x27;s because they were in different stacking contexts: regardless of how high or low your z-index is, it&amp;#x27;s only relative to other elements in the same stacking context.&lt;/p&gt;&lt;h3 id=&quot;what-is-a-stacking-context&quot;&gt;What is a stacking context?&lt;/h3&gt;&lt;p&gt;When you create a new stacking context, all the elements inside that stacking context will be positioned on the z-axis relative to each other, initially in source order (they have an implied value of 0, or auto). This is helpful because it means that you can position elements on top of each other without having to worry about other elements on the page, and lets you &amp;quot;group&amp;quot; elements together. The element that you create the stacking context on is called the stacking context parent.&lt;/p&gt;&lt;p&gt;In other words, stacking only happens within the context. There&amp;#x27;s no way to break out of it. In fact, you could look at z-indexes the same as &lt;a href=&quot;https://polypane.app/css-specificity-calculator/&quot;&gt;CSS specificity&lt;/a&gt;: No matter how high your z-index is, any stacking context with a higher z-index will always be on top of the stacking context with a lower z-index and all elements inside it.&lt;/p&gt;&lt;p&gt;Suppose you have this DOM tree:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Stacking context 1: &lt;code class=&quot;language-text&quot;&gt;z-index: 1&lt;/code&gt;&lt;ul&gt;&lt;li&gt;Element 1: &lt;code class=&quot;language-text&quot;&gt;z-index: 10&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Stacking context 2: &lt;code class=&quot;language-text&quot;&gt;z-index: 2&lt;/code&gt;&lt;ul&gt;&lt;li&gt;Element 2: &lt;code class=&quot;language-text&quot;&gt;z-index: 5&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Then despite Element 1 having a higher z-index than Element 2, it&amp;#x27;s still below it, because the z-indexes behave like specificity. The &amp;#x27;real&amp;#x27; z-index of Element 1 is (1,10) while that of Element 2 is (2,5). Because the z-index of stacking context 2 is higher, it and Element 2 are still on top.&lt;/p&gt;&lt;h3 id=&quot;creating-a-stacking-context&quot;&gt;Creating a stacking context&lt;/h3&gt;&lt;p&gt;Unlike offset parents, the default context is not the &lt;code class=&quot;language-text&quot;&gt;body&lt;/code&gt;, but the &lt;code class=&quot;language-text&quot;&gt;html&lt;/code&gt; element. Also unlike offset parents, which only get set with a &lt;code class=&quot;language-text&quot;&gt;position&lt;/code&gt; other than &lt;code class=&quot;language-text&quot;&gt;static&lt;/code&gt;, there are many different properties that can each create a new stacking context:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;position&lt;/code&gt; of &lt;code class=&quot;language-text&quot;&gt;fixed&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;sticky&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;z-index&lt;/code&gt; other than &lt;code class=&quot;language-text&quot;&gt;auto&lt;/code&gt; (with a &lt;code class=&quot;language-text&quot;&gt;position&lt;/code&gt; other than &lt;code class=&quot;language-text&quot;&gt;static&lt;/code&gt; or when in a flex or grid layout)&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;opacity&lt;/code&gt; less than 1&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;mix-blend-mode&lt;/code&gt; other than normal&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;filter&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;backdrop-filter&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;transform&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;perspective&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;clip-path&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;mask&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;mask-image&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;mask-box-image&lt;/code&gt; other than none&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;isolation&lt;/code&gt; set to &lt;code class=&quot;language-text&quot;&gt;isolate&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;container-type&lt;/code&gt; set to &lt;code class=&quot;language-text&quot;&gt;size&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;inline-size&lt;/code&gt; (so any container element)&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;will-change&lt;/code&gt; property set to &lt;code class=&quot;language-text&quot;&gt;mix-blend-mode&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;filter&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;transform&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;perspective&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;clip-path&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;mask&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;mask-image&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;mask-box-image&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;contain&lt;/code&gt; set to &lt;code class=&quot;language-text&quot;&gt;layout&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;paint&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;strict&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;content&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;That&amp;#x27;s quite a list! But it&amp;#x27;s not as bad as it looks. Most of these properties are not used very often, and the ones that are used often are &lt;code class=&quot;language-text&quot;&gt;position&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;z-index&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;opacity&lt;/code&gt;. So if you&amp;#x27;re having trouble with &lt;code class=&quot;language-text&quot;&gt;z-index&lt;/code&gt; not working, check if the elements are in the same stacking context.&lt;/p&gt;&lt;p&gt;If you want to be more explicit in creating a stacking context, &lt;code class=&quot;language-text&quot;&gt;isolation: isolate&lt;/code&gt; is the most explicit one. It also isolates other things, like &lt;code class=&quot;language-text&quot;&gt;mix-blend-mode&lt;/code&gt;, which means it doesn&amp;#x27;t interact with elements outside of the stacking context, but that&amp;#x27;s not likely a change that will affect your design.&lt;/p&gt;&lt;h3 id=&quot;an-example-1&quot;&gt;An example&lt;/h3&gt;&lt;p&gt;Lets look at an example. We&amp;#x27;re building on the previous example. If you look at the previous example you can see that the quote sits on top of the text, obscuring it.&lt;/p&gt;&lt;p&gt;We want to move it behind the blockquote and we can do this by setting a negative &lt;code class=&quot;language-text&quot;&gt;z-index&lt;/code&gt; on the blockquote (step 1). When we do that however, we can see that it disappears, because it&amp;#x27;s now behind the &lt;code class=&quot;language-text&quot;&gt;div.parent&lt;/code&gt; element as well.&lt;/p&gt;&lt;p&gt;The stacking context of the blockquote is the &lt;code class=&quot;language-text&quot;&gt;html&lt;/code&gt; element, so a negative z-index will place it at the beginning of that stacking context, which is behind the &lt;code class=&quot;language-text&quot;&gt;div.parent&lt;/code&gt; element.&lt;/p&gt;&lt;div&gt;&lt;div class=&quot;offsetExample-styles-module--offsetexample--1uj1c&quot;&gt;&lt;div class=&quot;offsetExample-styles-module--code--3GLGc&quot;&gt;&lt;div class=&quot;offsetExample-styles-module--block--3MRi4&quot; style=&quot;height:224px&quot;&gt;&lt;div class=&quot;gatsby-highlight&quot; style=&quot;translate:-0px -0px&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;parent&amp;quot;&amp;gt;
  &amp;lt;blockquote&amp;gt;
    &amp;lt;span&amp;gt;&amp;amp;ldquo;&amp;lt;/span&amp;gt;
    Lorem ipsum dolor sit amet consectetur adipisicing elit. Tempora
    tenetur molestias consequatur, quidem nam ipsum minima aliquid
    recusandae delectus enim.
  &amp;lt;/blockquote&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;textarea spellcheck=&quot;false&quot;&gt;&amp;lt;div class=&amp;quot;parent&amp;quot;&amp;gt;
  &amp;lt;blockquote&amp;gt;
    &amp;lt;span&amp;gt;&amp;amp;ldquo;&amp;lt;/span&amp;gt;
    Lorem ipsum dolor sit amet consectetur adipisicing elit. Tempora
    tenetur molestias consequatur, quidem nam ipsum minima aliquid
    recusandae delectus enim.
  &amp;lt;/blockquote&amp;gt;
&amp;lt;/div&amp;gt;&lt;/textarea&gt;&lt;/div&gt;&lt;div class=&quot;offsetExample-styles-module--block--3MRi4&quot; style=&quot;height:288px&quot;&gt;&lt;div class=&quot;gatsby-highlight&quot; style=&quot;translate:-0px -0px&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code&gt;blockquote span {
  position: absolute;
  top: 0;
  left: 0;
  font-size: 10em;
  font-family: serif;
  font-weight: bold;
  line-height:0.5;
  color: palegreen;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;textarea spellcheck=&quot;false&quot;&gt;blockquote span {
  position: absolute;
  top: 0;
  left: 0;
  font-size: 10em;
  font-family: serif;
  font-weight: bold;
  line-height:0.5;
  color: palegreen;
}&lt;/textarea&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;offsetExample-styles-module--result--2kh-T&quot;&gt;&lt;iframe title=&quot;result&quot; sandbox=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;offsetExample-styles-module--buttonbar--1u3I7&quot;&gt;&lt;div&gt;Step 1: &lt;button type=&quot;button&quot;&gt;Add z-index&lt;/button&gt; Step 2: &lt;button type=&quot;button&quot;&gt;Add isolate&lt;/button&gt;&lt;/div&gt;&lt;p&gt;Stacking Context: &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;To keep the quote behind the text but in front of the background, we can add &lt;code class=&quot;language-text&quot;&gt;isolation: isolate&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;.parent&lt;/code&gt; (step 2).&lt;/p&gt;&lt;p&gt;This will make &lt;code class=&quot;language-text&quot;&gt;.parent&lt;/code&gt; a new stacking context, so &lt;code class=&quot;language-text&quot;&gt;z-index: -1&lt;/code&gt; will only place the quote behind all elements &lt;strong&gt;within&lt;/strong&gt; that stacking context or in our case, only behind the text.&lt;/p&gt;&lt;h3 id=&quot;how-to-find-the-stacking-context-parent&quot;&gt;How to find the stacking context parent&lt;/h3&gt;&lt;p&gt;Unfortunately, there is no &lt;code class=&quot;language-text&quot;&gt;element.stackingContextParent&lt;/code&gt; property in JavaScript, so you can&amp;#x27;t find the stacking context parent with JavaScript as easily as you can find the offset parent. You&amp;#x27;ll have to check parent elements for each of the properties listed above to see if an element is in a specific stacking context.&lt;/p&gt;&lt;p&gt;Instead of that, the &lt;a href=&quot;/docs/elements-panel/#debug&quot;&gt;&amp;#x27;debug&amp;#x27; tab&lt;/a&gt; in the Polypane Elements panel shows you two bits of information:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;If the current element creates a new stacking context&lt;/li&gt;&lt;li&gt;What stacking context the current element is in&lt;/li&gt;&lt;/ol&gt;&lt;img alt=&quot;Element debug panel with an arrow pointing to the stacking context parent&quot; src=&quot;static/offsetpanel2-e978d36518ac4ea630f4b5e44e8a119f.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:1rem auto 1rem;display:block;max-width:100%&quot;/&gt;&lt;p&gt;Like the offset parent you can hover the stacking context parent to highlight it in the page and by clicking it the elements panel immediately jumps to it so you can edit it, in sync across all the panes in your tab.&lt;/p&gt;&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Offset parents and stacking context are two important concepts in CSS positioning. They can be a bit confusing at first, but once you understand them they can help you debug positioning issues (in all three dimensions much faster. The Elements panel in Polypane makes it easy to find them both so you can immediately inspect and fix the issues as you work.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 14]]></title><description><![CDATA[Polypane 14 is here! In this release we added support for testing with multiple sessions, a new Elements Debug panel to quickly help you…]]></description><link>https://polypane.app/blog/polypane-14/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-14/</guid><pubDate>Wed, 07 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 14 is here! In this release we added support for testing with multiple sessions, a new Elements Debug panel to quickly help you debug issues, an updated UI, new screenshot options, performance and UI improvements across the app and now running on Chromium 114.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;What&amp;#x27;s &lt;a href=&quot;/&quot;&gt;Polypane&lt;/a&gt;?&lt;/strong&gt; Polypane is the web browser for ambitious web developers. It&amp;#x27;s a stand-alone browser that shows
sites in multiple fully synced &lt;em&gt;panes&lt;/em&gt; and helps you make your site more responsive, more accessible and faster.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;session-management&quot;&gt;Session management&lt;/h2&gt;&lt;p&gt;When building interactive web apps you have to create both logged out and logged in experiences, and sometimes you&amp;#x27;ll even have to build and test with different types of user. Instead of logging in and out while working, you can now run multiple sessions of your site in Polypane, so you can show a logged in and logged out version of your site at the same time, or show pages for many different types of users.&lt;/p&gt;&lt;p&gt;You can quickly change the session for all panes in a tab so you can test responsive designs for different types of users, or change the session for a specific pane inside your tab to test with different users side by side.&lt;/p&gt;&lt;p&gt;The new &amp;quot;user&amp;quot; icon in the address bar lets you created and manage sessions. When you have selected a session for your tab you can see the session name in the address bar, and the tab will have a blue bar at the top to indicate it using a non-default session.&lt;/p&gt;&lt;img src=&quot;data:image/png;base64,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&quot; alt=&quot;The address bar showing the session&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;When a single pane has a session it shows a &amp;quot;user&amp;quot; icon next to the pane title. To set the session for a single pane, use the &amp;quot;session&amp;quot; tab in the media and emulation settings, which now have a new custom icon.&lt;/p&gt;&lt;img src=&quot;static/tabpane-244a82964bef696d69d4406903bb27aa.png&quot; alt=&quot;The pane header showing the session icon&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;Panes automatically inherit the session from the tab, but you can override this by setting a session for a pane. By clicking &amp;quot;inherit from tab&amp;quot; again this will be reverted to the tab session.&lt;/p&gt;&lt;p&gt;Polypane automatically syncs input between panes which won&amp;#x27;t always work when you have multiple users (They won&amp;#x27;t have the same options available) so to make custom sessions easier to work with, you can now quickly disable all syncing by right-clicking the sync button in the header. Along with turning off the navigation sync this provides a rich environment for testing across different pages and with multiple users.&lt;/p&gt;&lt;h3 id=&quot;inspecting-storage&quot;&gt;Inspecting Storage&lt;/h3&gt;&lt;p&gt;With different sessions, each session has its own cookies, localstorage and sessionstorage. The Storage panel now lets you pick a session so you an inspect and edit it separately from the default session.&lt;/p&gt;&lt;h2 id=&quot;ui-refresh&quot;&gt;UI Refresh&lt;/h2&gt;&lt;p&gt;For this release we took a good look at the UI. While not a redesign (you won&amp;#x27;t have to re-learn where everything is), we&amp;#x27;ve made a lot of small changes to make the UI more consistent, more responsive and easier to use.&lt;/p&gt;&lt;img src=&quot;static/newui-4d2690a71bccb07e0dbf3d0ed2b8e5bc.png&quot; alt=&quot;The new Polypane ui&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;In terms of design, we&amp;#x27;ve increased the font weight of all fonts so they have more contrast and are easier to read. The tab bar and address bar have been changed to floating tabs with increased contrast, and the icons in the address bar and above the panes have been increased in size and have improved contrast. We&amp;#x27;ve also improved the UI consistency across the app.&lt;/p&gt;&lt;h3 id=&quot;horizontal-scrolling&quot;&gt;Horizontal scrolling&lt;/h3&gt;&lt;p&gt;A big feature of Polypane has always been the default horizontally scrolling layout. While there are &lt;a href=&quot;/docs/layouts/#horizontal-scrolling&quot;&gt;many different ways to scroll&lt;/a&gt; this view (shift + scroll, space + drag, pageup/pagedown, dragging the scrollbar), knowing how to scroll horizontally isn&amp;#x27;t as widely known as we&amp;#x27;d like.&lt;/p&gt;&lt;p&gt;Starting in Polypane 14, scrolling your mousewheel in the horizontal layout will now automatically scroll it horizontally. We hope this makes it easier for people not used to regular horizontal scrolling.&lt;/p&gt;&lt;h3 id=&quot;performance&quot;&gt;Performance&lt;/h3&gt;&lt;p&gt;While rewriting the UI we&amp;#x27;ve also made a lot of performance improvements. The UI now responds faster to clicks and drags, and the UI is more responsive when you have a lot of panes open.&lt;/p&gt;&lt;p&gt;Resizing panes and the side panel are both more fluid, as is creating new panes and new tabs. We&amp;#x27;ve also improved the baseline CPU usage of the app, preventing code from continuously running when it&amp;#x27;s not needed. The result should be a more fluid experience.&lt;/p&gt;&lt;h2 id=&quot;elements-debug-panel&quot;&gt;Elements Debug Panel&lt;/h2&gt;&lt;p&gt;The Elements panel lets you inspect and edit elements across all panes at once. It&amp;#x27;s a great way to quickly change styling and debug issues across them. To make this even easier, we&amp;#x27;ve added a new debug tab, alongside the existing style, computed styles, attribute and accessibility tabs.&lt;/p&gt;&lt;p&gt;The Debug panel has a convenient overview of specific CSS properties and element properties that often cause issues, so that you don&amp;#x27;t have to hunt through the style or computed tab to find, for example, if your element has a &lt;code class=&quot;language-text&quot;&gt;position&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;The Debug panel also shows if the element creates a new stacking context and what the offset parent (from which your element will be offset when using top/left/bottom/right) and the stacking context parent (from which your element will be offset when using z-index) are.&lt;/p&gt;&lt;img src=&quot;static/debug-d503db1732b0a573e1aab1460aa27e3c.png&quot; alt=&quot;The debug tab in the Elements panel&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;This panel will quickly help you debug issues with your layout and positioning, like &amp;quot;Why is this element not where I expect it to be&amp;quot;, &amp;quot;Why isn&amp;#x27;t this element Sticking?&amp;quot; and &amp;quot;Why is this element behind this other element?&amp;quot;. We hope you like it!&lt;/p&gt;&lt;h2 id=&quot;bulk-screenshot-options&quot;&gt;Bulk screenshot options&lt;/h2&gt;&lt;p&gt;Instead of creating a single image with an overview of all panes, we now also support bulk screenshot options when you right-click the screenshot button in the address bar. You can choose to take screenshots of all viewports, or of all full pages. Screenshots will be stored in the folder you select. This is a great way to quickly create screenshots of all your panes.&lt;/p&gt;&lt;h2 id=&quot;media-query-ranges-and-breakpoint-edges&quot;&gt;Media query ranges and breakpoint edges&lt;/h2&gt;&lt;p&gt;The &lt;a href=&quot;/blog/the-complete-guide-to-css-media-queries/#range-replacing-min--and-max-&quot;&gt;range syntax for media queries&lt;/a&gt; has been supported in Firefox for a long time, but it only recently came to Chromium and Safari. We&amp;#x27;ve now added support for it in our breakpoint detection as well, so when you use the new range media queries we can automatically create panes for them.&lt;/p&gt;&lt;p&gt;Along with this we&amp;#x27;ve created a new option that we call &amp;quot;Breakpoint Edges&amp;quot;. It creates additional panes that are just outside your specified breakpoints so you can check that things don&amp;#x27;t break there. For example, if you have a min-width of 768px, It&amp;#x27;ll also create a pane at 767px wide. Thanks Eric for suggesting this excellent idea!&lt;/p&gt;&lt;h2 id=&quot;show-response-of-fetchxhr-requests-in-the-console&quot;&gt;Show Response of Fetch/XHR requests in the console&lt;/h2&gt;&lt;p&gt;In Polypane 13.1 we added Fetch and XHR requests to the console so you can see what requests are made by your site and what headers get sent back. In Polypane 14 we&amp;#x27;ve added the response of those requests to the console as well, if they&amp;#x27;re JSON or short text. This way you can see what the response was without having to log it out yourself every time.&lt;/p&gt;&lt;img src=&quot;static/consoleresponse-cfa927d33d98cc368956d94ddf4b8c74.png&quot; alt=&quot;The console showing the JSON for the Polypane Changelog&quot; class=&quot;imgshadow&quot;/&gt;&lt;h2 id=&quot;bluesky-social-media-preview&quot;&gt;Bluesky social media preview&lt;/h2&gt;&lt;p&gt;Bluesky is a new social network that uses an open protocol for it&amp;#x27;s messages. It&amp;#x27;s still in development and invite-only, but we&amp;#x27;ve created a social media preview so you can check how your links look when shared on Bluesky.&lt;/p&gt;&lt;img src=&quot;static/bsky-e219a96b43c195a50e03a5fc29961c2d.jpg&quot; alt=&quot;Polypane with the Meta panel opened. Inside the metapanel a social media preview of the Bluesky embed card is visible&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;If you have a Bluesky account, give us a follow: &lt;a href=&quot;https://staging.bsky.app/profile/polypane.app&quot;&gt;Polypane on Bluesky&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;cmv-retinitis-simulator&quot;&gt;CMV Retinitis simulator&lt;/h2&gt;&lt;p&gt;CMV Retinitis is a condition that causes specks in your vision and is caused by the cytomegalovirus in immunocompromised people. While you&amp;#x27;re not expected to change anything to your site as a result of testing with this simulator, simulations like these help create empathy and understanding for all the different people using your site.&lt;/p&gt;&lt;img src=&quot;static/cmvretinitis-79cc2d4f2832e6207b687b9f5e5df481.jpg&quot; alt=&quot;Three panes in Polypane showing a website, all are covered in light specks.&quot; class=&quot;imgshadow&quot;/&gt;&lt;h2 id=&quot;text-styling-in-screenshot-editor&quot;&gt;Text styling in Screenshot editor&lt;/h2&gt;&lt;p&gt;You can now use &lt;strong&gt;bold&lt;/strong&gt;, &lt;em&gt;italic&lt;/em&gt; and underlined text styling in the screenshot editor.&lt;/p&gt;&lt;img src=&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZYAAAEICAIAAADz9kXyAAAY80lEQVR42u2diVMU176A79/yzF6pJJXKZiqVl0WvevNeYm4SRa/GfTduUaOCiIALiopiECKKGkGiuKNxQ0RxQcBI3BBRAZEdZXXL8t4vOcOx6elpWWZwGL6ur6yxp+nl/H799TmnT/f84/6j/wMA6KT8gyIAABQGAIDCAABQGACgMAAAFAYAgMIAAFAYAKAwAAAUBgCAwgAAhQEAoDAAABQGAIDCAACFAQCgMAAAFAYAgMIAAIVB67j38E9wF0+rwEljFNZ15dX44A9Nw/3fobUYC9BeKO4t8JZvF1CYz8pLzoT6e7/VNz6qbXgo1NQ/gNYipVfX8LCu8ZGUpDKLs1BMBV7njgJXa7DfLqAwn/WXJL1kf8TK1e+//9//xdTuSYpx+YpVYhYpVSlbo008WuA22wUU5sv+kgv49BnfoR73Tt9On1ld0yhlq23SMQXuvF1SHYX5rMKkxSFX7NS0kxjHE9PhlDSxiZSwbtl1TIGbtkuqozCfVZhcqKXdEb4sAt14YloUtrS8qlZKWFeIOqbATdsl1VGYz1bB6u/9Jpfr0IWL0Y0npsCg4JKyailhKWd1u7BjCty0XSyGwny5FVl5pz44dCG68cQ0NzCoqLhcSli16VQvfgcUuGm7KAyF+azCahseVlTXzQ9ZgG48MQXMnVdQVColrDrXVUd+BxS4cbsoDIX5uMLKq2qDgkPtT4m4uLg7hunmzZuJiYnvvPOOV/nihRdekH3r2bOncWZwcPCBAwfcsv5XX3117dq1169fLysrO3bsWL9+/Z74J/4BgTcLS6SEjQprSYG3czJuF4WhMB/vy2+DwtSUkZHRrVu3rqMwWU9KSoqfn59sIjQ0VETWp0+fFqrkr1Gvfw86bUmBv/vuuyLK2NjY5OTkvLy8iIiIpKSk1NTUNiiMHn0UhsKaKWzEiBHDhg2TE0z9t0ePHu1Xw0svvRQUFCRri4yMfPPNN71TYaIVWflrr72m58jezp49+4kquVF4u7UKGzlypKrhisWio6Mdq/L3b5XC9HZRGApDYY8Vpk6t9evXq/++//77bqngDBo0KD8//5lnnvHaWthbb70lK+/Vq1drG3RtUNjbb7+tPuTm5krJyIfnnnuuVXJHYSgMhblU2BtvvJGdnS2f09PT3dUGjIqK2rBhg5c3JOPj48WzssKPP/7YowpTk+iytLT0xRdfbFtfGApDYSjMri/s2LFjurLQ/iknJ0daT16uMKkkTp06VcQtW8nMzBw6dKhHFRYSErJ3717jnPfee8/yMwpDYSispQo7ffr0mTNnKisr5XNaWpqxb6jN0wcffFBRUfHyyy97rcJGjRp1x8UUGBjoIYWlpqbOmjXLKFC5bIwbN65bt24xMTGrVq1CYSgMhbWxL2zKlCnqv2FhYW4YxBQQcOjQIbfUksStn332mXFmeHj4rl27PHEDNCIiYvv27R6qhcm1oaqqylTVeuWVV8RixcXFojD7e8EoDIWhMGuFTZw4cciQIUlJSeq/a9ascctghXnz5rlFKydPnhSz6P8+++yzWVlZixYtav+ax48fn52dbbzhEB0dnZCQ4CGFTZo0SRrXppmircTERCl2+Za+MBSGwto7LkyqCX379m3/eNHy8nJT66/N0+DBg6UiJhb78ssvv/766/379+fm5r7++uvtX7NUi/Lz86VC179/fznqFStWyIbksycUNmzYsPPnz1++fNnPz8/oL4nC6tWrpcV95MiRyZMnozAUhsLaqLCysrITJ06II9rphR49emzevFlWKHWc559/3i0WGzhwoLS2SkpKCgoKpM7SvXt3d7UcP/zwQ1HYrVu3SktL5fA93Z3v3EwePXq0+iwWsy98FIbCUBiTex70aa3C1K0S07Rt2zYGVaAw8GWFffTRR3dsp/bf8ewYhbl9uygMhaEwJhQGKAyFoTAUhsIAhaEwFIbCAIV1kMLa8LId924XhaEw33/l4cLFS9CNJyZRleUrDz1d4Mbt8spDFObjCquorkv++RC68cSUtGO35YunPV3gxu2iMBTmywpTv0ZRVFw+YeIkjOPeafSYcVfyblj+/IdHC9x5uygMhfmswtRvgpWUVV+7UTRvfkj37u+invZP77zT3T8gMOdirpSq5Y+weajAXW0XhaEw3+/RL7xVlnvtpmR/1i8XMrLOnzl7TjidkQ0tRxWalJ6UoZSklKeUquVP4bq3wJ+4XVIdhfl4W1Iu12UVdyXv5eotbZCLV65duJz366Wr0Fqk3KT0pAylJKU8pVSlbHVrznMFbr9dUh2F+azCVL2gtuGhZLxct6X1UVRcXlBUerOwRLhReBtajio0KT0pQylJKU8pVdWRr4raQwX+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&quot; alt=&quot;the text &amp;#x27;font styling!&amp;#x27; in a text box. Above the text box are buttons for bold, italic, underline and strikethrough. &amp;#x27;Font&amp;#x27; is bold, &amp;#x27;styling&amp;#x27; is italic and &amp;#x27;!&amp;#x27; is underlined.&quot; class=&quot;imgshadow&quot;/&gt;&lt;h2 id=&quot;allow-cors-option&quot;&gt;Allow CORS option&lt;/h2&gt;&lt;p&gt;Along with the ability to disable web security and disable content-security-policy headers you can now also quickly allow CORS from the Edit menu.&lt;/p&gt;&lt;p&gt;Disabling CORS is useful when you need to work with APIs that don&amp;#x27;t have CORS enabled, or don&amp;#x27;t have the right settings to allow you to use it on localhost. This option allows you to use those APIs without disabling all web security, so it&amp;#x27;s a safer option. Thanks Ben for requesting this!&lt;/p&gt;&lt;h2 id=&quot;outline-panel-updates&quot;&gt;Outline panel updates&lt;/h2&gt;&lt;p&gt;The outline panel has received a few updates:&lt;/p&gt;&lt;h3 id=&quot;warn-for-long-headings&quot;&gt;Warn for long headings&lt;/h3&gt;&lt;p&gt;When your heading elements now have an excessive amount of text in them, the outline panel will warn you about it. People with assistive technologies use the heading structure to quickly go through your page, so if your headings are too long, it takes a long time to listen to them and it will be hard for them to navigate your page.&lt;/p&gt;&lt;p&gt;We warn you about headings that are longer than 170 characters.&lt;/p&gt;&lt;h3 id=&quot;scroll-delay-on-hover&quot;&gt;Scroll delay on hover&lt;/h3&gt;&lt;p&gt;In the outline panel (and other panels like the accessibility panel) you can hover over elements to highlight them. In previous versions of Polypane, this would instantly scroll the panes to the element you hovered over even if you just moved your mouse across them. The outline panel now waits for a bit before scrolling, so you can move your mouse across the panes without them jumping around while still responding quickly enough when you hover with intent.&lt;/p&gt;&lt;h3 id=&quot;highlight-broken-links-in-overlay&quot;&gt;Highlight broken links in overlay&lt;/h3&gt;&lt;p&gt;When you activate the link overlay, broken URLs are now highlighted in the page as well. Perfect if you want to make a quick screenshot to share to visually show which links are broken.&lt;/p&gt;&lt;h2 id=&quot;chromium-114&quot;&gt;Chromium 114&lt;/h2&gt;&lt;p&gt;We&amp;#x27;re now running on Chromium 114, which brings a lot of new features and improvements like CSS Nesting, the Popover API, the linear easing function, new color functions, text-wrap: balance and more, which are all available in Polypane.&lt;/p&gt;&lt;h2 id=&quot;other-updates&quot;&gt;Other updates&lt;/h2&gt;&lt;p&gt;Some smaller updates worth mentioning:&lt;/p&gt;&lt;h3 id=&quot;robotstxt-and-friends-are-now-only-requested-when-the-meta-panel-is-open&quot;&gt;Robots.txt and friends are now only requested when the meta panel is open&lt;/h3&gt;&lt;p&gt;The Meta panel gives you insight into the meta tags on your page, such as the title, description, open graph tags and more. It also shows you the robots.txt, webfinger and other files that are requested by the browser.&lt;/p&gt;&lt;p&gt;These requests are now only made when the meta panel is open, to prevent requests from clogging up your devserver logs.&lt;/p&gt;&lt;h3 id=&quot;browsersync-handling&quot;&gt;Browsersync handling&lt;/h3&gt;&lt;p&gt;Previous versions of Polypane disabled scroll syncing when detecting Browsersync. Polypane 14 also disables click and input syncing when those are active in Browsersync&amp;#x27;s ghostMode settings. You can now keep using Browsersync without additional configuration needed.&lt;/p&gt;&lt;p&gt;Polypane and Browsersync both sync certain events, such as scroll and click events. Polypane&amp;#x27;s syncing is more performant so events synced by Polypane are overwritten or doubled a few ms later by Browsersync, which causes all sorts of issues around performance and event ghosting. We advice everyone to &lt;a href=&quot;/docs/browsersync-and-polypane/&quot;&gt;switch over to Polypane&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&quot;close-all-other-tabs-context-menu-options&quot;&gt;Close all other tabs context menu options&lt;/h3&gt;&lt;p&gt;When right-clicking a tab you can now close all other tabs or close all tabs to the left or right of the current tab but selecting the &amp;quot;close multiple tabs&amp;quot; option in the context menu.&lt;/p&gt;&lt;h3 id=&quot;work-around-registry-limitations-on-corporate-windows-environments&quot;&gt;Work around registry limitations on corporate Windows environments&lt;/h3&gt;&lt;p&gt;To generate a unique but anonymous device ID, on Windows Polypane reads some information from the registry. Unfortunately in some corporate environments, editing the registry is disabled and unfortunately, merely accessing the registry also counts as editing and is also disabled. This means that Polypane would not start in these environments. We&amp;#x27;ve now updated the method we use to access the registry to prevent this issue.&lt;/p&gt;&lt;h3 id=&quot;new-devtools-extensions-clockwork-and-gimli-tailwind&quot;&gt;New devtools extensions: Clockwork and Gimli Tailwind&lt;/h3&gt;&lt;p&gt;We added built-in support for two new devtools extensions: Clockwork are devtools for Laravel and Gimli Tailwind are devtools for Tailwind CSS.&lt;/p&gt;&lt;p&gt;Keep in mind our support for regular extension is still in beta, so if you run into any issues, please let us know!&lt;/p&gt;&lt;h2 id=&quot;deprecations&quot;&gt;Deprecations&lt;/h2&gt;&lt;p&gt;As announced in 13.1, we&amp;#x27;ve removed Tota11y from our debug tools. It&amp;#x27;s a great tool, but it hasn&amp;#x27;t been maintained for quite a while and its functionality can be found in other tools, such as the &lt;a href=&quot;/docs/outline-panel/&quot;&gt;outline panel&lt;/a&gt; and the other &lt;a href=&quot;/docs/debug-tools/&quot;&gt;Debug tools&lt;/a&gt;, which have a much more thorough and up-to-date set of tests.&lt;/p&gt;&lt;h2 id=&quot;what-can-we-do-for-you&quot;&gt;What can we do for you?&lt;/h2&gt;&lt;p&gt;As you&amp;#x27;ve seen in the changelogs for this release and the past few releases, many features have come from Polypane&amp;#x27;s users. We love getting feedback and one of the best things about having devs as users is that they are &lt;em&gt;very good at feature requests&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;So consider this an open invitation: What is missing from Polypane? What&amp;#x27;s the one thing we should do that makes Polypane amazing for you? What nit would you just love we fix? &lt;a href=&quot;/support/&quot;&gt;Let us know!&lt;/a&gt; 🙏&lt;/p&gt;&lt;h2 id=&quot;get-polypane-14&quot;&gt;Get Polypane 14&lt;/h2&gt;&lt;p&gt;Polypane is available for Windows, Mac and Linux (.deb or AppImage) in both 64 bit and ARM versions.&lt;/p&gt;&lt;p&gt;Polypane automatically updates on Mac, Windows and on Linux when using the AppImage. Otherwise, go to
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; to download the latest version!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Try it for free&lt;/a&gt;.&lt;/strong&gt; No credit card needed.&lt;/p&gt;&lt;h2 id=&quot;polypane-1401-changelog&quot;&gt;Polypane 14.0.1 Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Detached panel rendering as blank window&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;polypane-14-changelog&quot;&gt;Polypane 14 Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;New&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Custom Sessions&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Elements Debug panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; UI refresh&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Bulk screenshot options&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Support for media query ranges&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Breakpoint Edges support (Thanks Eric!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Show Response of Fetch/XHR requests in the console&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Bluesky social media preview&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; CMV Retinitis simulator&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Chromium 114&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Text styling in Screenshot editor&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Allow CORS option (Thanks Ben!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Close all other tabs context menu options&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; New devtools extensions: Clockwork and Gimli tailwind&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Scrolling in horizontal mode now scrolls horizontally by default&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Esc on console panel blurs input&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Browser-sync detection now disables all active sync options&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: Warn for long headings&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: Moving mouse over elements no longer instantly scrolls the panes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: No longer give an error for aside elements in main elements (Thanks Eric!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: Overlay highlights broken links&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Horizontal overflow detection for mobile rendering now more accurate&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Only request robots.txt, webfinger etc when the meta panel is open to prevent 404s&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta Panel: Google preview is moved up&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Pane resizing has better performance&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Now supports color and trig CSS functions and new CSS properties&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Tree view scrolls selected element into view&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements that are focusable without an accessible name get a warning across the app&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Debug tools: Target size 24x24 is now a circle (per latest WCAG updates)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Debug tools: more life-like macular degeneration simulator&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Layouts, screenshots and command bar are now part of the getting started tutorial&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Performance across the app&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Global zoom now works more predictably across layouts&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Loading state for pages now resolves better for SPAs (Thanks Joseph!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Context menu for workspace now has more options&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Better URL handling to prevent full mode from going back in history (Thanks Eric!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Creating full screenshots is now faster&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Console panel: better object styling&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Console panel: now only combines messages between user inputs&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Reload button is no longer wobbly&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Hard reload now also flushes internal chromium session cache&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Panes refresh their instance when web security settings change (Thanks Ben!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Better trial end message in app&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Support Google accounts logins on sites (Thanks Pascal!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Accessibility panel: Now shows a &amp;quot;best practise&amp;quot; label for items that aren&amp;#x27;t WCAG issues&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Accessibility panel: updated ruleset&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Option to turn off overlay scrollbars (Thanks Nic!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; &amp;#x27;Close all panes&amp;#x27; is now renamed to &amp;#x27;remove all panes&amp;#x27;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; &amp;#x27;Disable all&amp;#x27; option for synced interactions&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Tabs now fall back to a default favicon&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated Google Fonts list&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Deprecations&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Deprecated&lt;/strong&gt; Tota11y debug tool is now removed&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Activating tap target from meta panel works again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Pane zoom allowed negative values&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Set correct background for forced colors in dark mode when page doesn&amp;#x27;t provide its own background&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Clicking active inspect button disables it again (Thanks Galen!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Outline panel: No longer shows non-landmarks in overlay when show issues is off&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Outline panel: Switching to links overview now always triggers a test of all URLs&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent permission request popup from forwarding to empty URL&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Clicking links in getting started in Full mode was broken (Thanks Gabriel!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Reference image options toggled images on other pane (Thanks Alex!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Reference image: Support images with # in their file name&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: ::before/::after on html element are now supported&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: Prevent spellchecking in Elements panel data tab&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue with the app not launching on windows for active tabs with HTTP Basic Auth (Thanks Meikel!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue with stored basic auth credentials not being used on launch (Thanks Sandro!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Console now can consolidate HTML elements across panes again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent getting started page from showing console errors&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Correctly rewrite font URLs in more cases (Thanks Jackson!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent error for documents with empty body elements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Crash when accessing registry on Windows is disabled (Thanks Mandip!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Opening undocked devtools&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Correctly update devtools location when moving sidebar&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue with Polypane Peek not showing for specific elements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Live reload no longer ignores &amp;quot;templates&amp;quot; folders (Thanks Tom!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Incorrect label for forward button (Thanks Steph!)&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[ColorContrast.App: a new place for our color contrast checker]]></title><description><![CDATA[We first released our  color contrast checker  three years ago. At the time it was one of the first ones that  gave suggestions , based on…]]></description><link>https://polypane.app/blog/color-contrast-app-a-new-place-for-our-color-contrast-checker/</link><guid isPermaLink="false">https://polypane.app/blog/color-contrast-app-a-new-place-for-our-color-contrast-checker/</guid><pubDate>Thu, 13 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We first released our &lt;a href=&quot;/color-contrast/&quot;&gt;color contrast checker&lt;/a&gt; three years ago. At the time it was one of the first ones that &lt;a href=&quot;/blog/color-contrast-checker-that-makes-suggestions-for-better-colors/&quot;&gt;gave suggestions&lt;/a&gt;, based on the needs I had while working on an open-source corona tracking app.&lt;/p&gt;&lt;p&gt;Later on the contrast checker was updated with support for &lt;a href=&quot;/blog/the-eye-dropper-api-pick-colors-from-anywhere-on-your-screen/&quot;&gt;the new EyeDropper API&lt;/a&gt; so you could pick colors from anywhere on your screen as well as the ability to set your preferred format between hex, rgb, hsl and hwb.&lt;/p&gt;&lt;p&gt;We&amp;#x27;ve been adding a bunch more, read on below!&lt;/p&gt;&lt;h2 id=&quot;a-new-home-colorcontrastapp&quot;&gt;A new home: &lt;a href=&quot;https://colorcontrast.app&quot;&gt;ColorContrast.App&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;And now it&amp;#x27;s time for our color contrast checker to get a new home at &lt;a href=&quot;https://colorcontrast.app&quot;&gt;ColorContrast.App&lt;/a&gt;! It&amp;#x27;ll still be available here &lt;a href=&quot;/color-contrast/&quot;&gt;on the site&lt;/a&gt; as well, but the short, memorable domain should make it easier to find and share.&lt;/p&gt;&lt;h2 id=&quot;dark-mode&quot;&gt;Dark mode&lt;/h2&gt;&lt;p&gt;While moving the contrast checker to a new domain, we also took the opportunity to add a dark mode. The site will by default use whatever your system default is (and change along with it) unless you explicitly set it to light or dark mode, then it&amp;#x27;ll stay that way.&lt;/p&gt;&lt;img src=&quot;static/lightdark-ba2b0009e1680dd5bc873ffd7e019795.png&quot; alt=&quot;Ligth and dark mode side by side in Polypane&quot; class=&quot;imgshadow&quot;/&gt;&lt;h2 id=&quot;apca&quot;&gt;APCA&lt;/h2&gt;&lt;p&gt;Recently, we added support for APCA in &lt;a href=&quot;/blog/polypane-13-1/#apca-support-in-the-color-picker&quot;&gt;Polypane 13.1&lt;/a&gt; and based on that we&amp;#x27;ve also added support for it in our online color contrast checker. While APCA is not a standard yet, it&amp;#x27;s a more reasonable way to calculate contrast (though it is also stricter compared to WCAG 2) so it&amp;#x27;s good to contrast and compare.&lt;/p&gt;&lt;img src=&quot;static/apca-97d073e3da7482be951882e6b0802c9f.png&quot; alt=&quot;APCA rating&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;While WCAG 2 has a well known set of limits for contrast, APCA&amp;#x27;s limits are more fine-grained and are more context and font-dependent. In order to make the resulting values more easily digestible, we&amp;#x27;re grading contrasts on three levels:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;45&lt;/strong&gt;: For large (36px or more) or bold (24px or more) or non-text elements.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;60&lt;/strong&gt;: For medium-size (24px or more) or bold (16px) text.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;75&lt;/strong&gt;: For normal body text.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These roughly correspond to the middle of APCA&amp;#x27;s current &amp;quot;Bronze&amp;quot; level scoring and we&amp;#x27;ve been in contact with &lt;a href=&quot;https://www.myndex.com/&quot;&gt;Myndex&lt;/a&gt; to validate this approach.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;We&amp;#x27;re keen to hear your thoughts on these rating levels&lt;/strong&gt;, so let us know if they work for you (or why not). For a more fine-grained set of scores there is always the &lt;a href=&quot;https://www.myndex.com/APCA/&quot;&gt;official APCA Contrast calculator&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;color-blindness-simulators&quot;&gt;Color Blindness Simulators&lt;/h2&gt;&lt;p&gt;If you&amp;#x27;ve used Polypane you know it ships with &lt;a href=&quot;/docs/debug-tools/#simulators&quot;&gt;over 20 different simulators&lt;/a&gt;. In ColorContrast.App you can now switch between the four most popular ones and get a live preview of what the colors (can) look like for someone with that specific color blindness.&lt;/p&gt;&lt;p&gt;You can now pick from the following simulators and get an instant preview of your selected colors:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Protanopia&lt;/strong&gt;: Red-blindness&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Deuteranopia&lt;/strong&gt;: Green-blindness&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Tritanopia&lt;/strong&gt;: Blue-blindness&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Achromatopsia&lt;/strong&gt;: Total color blindness&lt;/li&gt;&lt;/ul&gt;&lt;video src=&quot;static/simulators-4b0733f17735e6b0be1b7058c6cec546.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;Please keep in mind that &lt;strong&gt;you should not change colors based on what you see with these simulators on&lt;/strong&gt;. Both the WCAG and APCA ratings already take visual impairments into account, so use the rating to determine if a set of colors has enough contrast.&lt;/p&gt;&lt;h2 id=&quot;suggestion-previews&quot;&gt;Suggestion previews&lt;/h2&gt;&lt;p&gt;Lastly, when you now hover over any of the suggested colors, the examples now update to show you what the text or background would look like with that color:&lt;/p&gt;&lt;video src=&quot;static/previews-b3e899c274e24d250b9ada934e693662.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;div style=&quot;text-align:center&quot;&gt;&lt;h2&gt;Get it&lt;/h2&gt;
  &lt;p&gt;Use the new contrast checker at&lt;/p&gt;
  &lt;p style=&quot;margin-top:0;font-weight:bold;font-size:2.5rem&quot;&gt;
   &lt;a href=&quot;https://colorcontrast.app&quot;&gt; &lt;img src=&quot;/blogs/colorcontrastapp/cover.svg&quot; alt=&quot;&quot; style=&quot;width:3rem;height:3rem;vertical-align:middle&quot;/&gt; ColorContrast.App&lt;/a&gt;
  &lt;/p&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Polypane on PodRocket]]></title><description><![CDATA[On April 5th Kilian was a guest on the  PodRocket podcast . Together with Paul Mikulskis we chatted about Polypane, developer experience…]]></description><link>https://polypane.app/blog/polypane-on-pod-rocket/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-on-pod-rocket/</guid><pubDate>Wed, 05 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;On April 5th Kilian was a guest on the &lt;a href=&quot;https://podrocket.logrocket.com/polypane&quot;&gt;PodRocket podcast&lt;/a&gt;. Together with Paul Mikulskis we chatted about Polypane, developer experience, and more!&lt;/p&gt;&lt;h2 id=&quot;listen-to-it-here&quot;&gt;Listen to it here&lt;/h2&gt;&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom:27.027027027027028%;position:relative;height:0;overflow:hidden&quot;&gt; &lt;iframe src=&quot;https://player.fireside.fm/v2/XHXVzqW5+R1mdX2m_?theme=dark&quot; frameBorder=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;position:absolute;top:0;left:0;width:100%;height:100%&quot;&gt;&lt;/iframe&gt; &lt;/div&gt;&lt;p&gt;Thanks PodRocket for having me on!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 13.1]]></title><description><![CDATA[Polypane 13.1 is here! In this release we retooled our build system from webpack to Vite, which has improved the startup time and UI…]]></description><link>https://polypane.app/blog/polypane-13-1/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-13-1/</guid><pubDate>Mon, 27 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 13.1 is here! In this release we retooled our build system from webpack to Vite, which has improved the startup time and UI performance of Polypane by about 20%. 13.1 also adds network requests to the Console Panel, flex and grid overlays to the Elements Panel, APCA support to the color picker and unique URLs per tab to the Browse Panel.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;What&amp;#x27;s &lt;a href=&quot;/&quot;&gt;Polypane&lt;/a&gt;?&lt;/strong&gt; Polypane is the web browser for ambitious web developers. It&amp;#x27;s a stand-alone browser that shows
sites in multiple fully synced &lt;em&gt;panes&lt;/em&gt; and helps you make your site more responsive, more accessible and faster.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;elements-panel-updates&quot;&gt;Elements panel updates&lt;/h2&gt;&lt;p&gt;We&amp;#x27;ve made a bunch of updates to the Elements panel, along with a few bug fixes and newly added property suggestions.&lt;/p&gt;&lt;h3 id=&quot;flex-and-grid-overlays&quot;&gt;Flex and Grid overlays&lt;/h3&gt;&lt;p&gt;While previous versions of Polypane showed badges for elements with a grid or flex layout, they weren&amp;#x27;t interactive. Now if you click a badge we&amp;#x27;ll draw a grid of flex overlay in all panes, so you get a quick overview of how the layout for that element is constructed.&lt;/p&gt;&lt;p&gt;The overlays update as you make changes across panes and you can add as many overlays as you need.&lt;/p&gt;&lt;img src=&quot;static/flexgrid-ca03c7f2ad72ec6820fd2ed124d78a31.png&quot; alt=&quot;Three panes in Polypane with multiple flex and grid overlays visible.&quot; class=&quot;imgshadow&quot;/&gt;&lt;h3 id=&quot;copy-css-selector-or-xpath-to-clipboard&quot;&gt;Copy CSS Selector or XPath to clipboard&lt;/h3&gt;&lt;p&gt;From the navigator you can now copy the CSS selector or XPath for an element to the clipboard. This is useful for debugging and for using in tools like &lt;a href=&quot;https://www.cypress.io/&quot;&gt;Cypress&lt;/a&gt;, &lt;a href=&quot;https://pptr.dev/&quot;&gt;Puppeteer&lt;/a&gt; or &lt;a href=&quot;https://playwright.dev/&quot;&gt;Playwright&lt;/a&gt;.&lt;/p&gt;&lt;img src=&quot;static/copyselector-678fd3cbf02eae2541ecd73979df2f88.png&quot; alt=&quot;a menu showing the option to copy the CSS selector or XPath for an element to the clipboard.&quot; class=&quot;imgshadow&quot;/&gt;&lt;h3 id=&quot;show-color-picker-for-named-colors&quot;&gt;Show color picker for named colors&lt;/h3&gt;&lt;p&gt;Polypane already showed a color picker for properties that took colors (like &lt;code class=&quot;language-text&quot;&gt;background-color&lt;/code&gt;) but now we also show one when Polypane detects that the value is a named color (like &amp;quot;red&amp;quot;, &amp;quot;deeppink&amp;quot; or &amp;quot;olivegreen&amp;quot;) regardless of the property. That means if you now use the &amp;quot;background&amp;quot; shorthand with just a color it gets a color picker too.&lt;/p&gt;&lt;h3 id=&quot;support-for-css-nesting-without-nesting-rule-&quot;&gt;Support for CSS nesting without nesting rule (&amp;quot;&amp;amp;&amp;quot;)&lt;/h3&gt;&lt;p&gt;In Polypane 13 we introduced support for CSS nesting in the elements panel, but because of the Chromium version we were running, we couldn&amp;#x27;t yet display the styling for nested CSS that didn&amp;#x27;t use the &amp;quot;&amp;amp;&amp;quot; selector.&lt;/p&gt;&lt;p&gt;In Polypane 13.1 that&amp;#x27;s now possible and all nesting along with nesting at-rules is shown with the selector in the elements panel.&lt;/p&gt;&lt;h3 id=&quot;non-inherited-css-properties-are-shown-dimmed&quot;&gt;Non-inherited CSS properties are shown dimmed&lt;/h3&gt;&lt;p&gt;The elements panel also shows CSS for parent elements that contain inherited styles. We&amp;#x27;ve updated the display of these so that only the inherited styles (like &lt;code class=&quot;language-text&quot;&gt;color&lt;/code&gt;) are highlighted, while the styles that don&amp;#x27;t inherit (like &lt;code class=&quot;language-text&quot;&gt;padding&lt;/code&gt;) are dimmed slightly.&lt;/p&gt;&lt;h2 id=&quot;network-requests-in-the-console-panel&quot;&gt;Network requests in the console panel&lt;/h2&gt;&lt;p&gt;Polypane has a unified elements panel and console panel that lets you inspect and edit across all panes at the same time, but for network data you still had to use the Network panel in the Chromium devtools.&lt;/p&gt;&lt;p&gt;That panel has a wealth of information and options that aren&amp;#x27;t easily replicated. As a first step to a unified overview of your network Polypane can now show you the Fetch and Xhr requests that happen in your pages in the Console panel. Turn the &amp;quot;network&amp;quot; option in the console panel level settings on to see them.&lt;/p&gt;&lt;img src=&quot;static/network-b1026e9266085d1cab203bab36af58b4.png&quot; alt=&quot;The console showing a fetch request with expanded headers, and a menu option to show network requests in the console.&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;The console will then show fetch/XHR requests as they come in, with inspectable return headers, and will automatically merge identical requests across panes making it easy to see what data is the same and what is different per pane.&lt;/p&gt;&lt;h3 id=&quot;better-level-filters&quot;&gt;Better level filters&lt;/h3&gt;&lt;p&gt;To support this feature we also made the levels multiselectable, so you can now choose if you want to see errors, warnings, info, navigation, network and debug events separately. In addition, these filters will also affect which console notifications are shown under each pane. That overview will now also show counters for debug and network console messages when you have those turned on.&lt;/p&gt;&lt;h2 id=&quot;apca-support-in-the-color-picker&quot;&gt;APCA support in the color picker&lt;/h2&gt;&lt;p&gt;Along with testing against WCAG2 AA and AAA, you can now get the APCA score of colors in the color picker. APCA is a more advanced contrast formula that explicitly takes into account the way colors work on self-illuminating displays (so, uh, screens).&lt;/p&gt;&lt;img src=&quot;static/apca-97d073e3da7482be951882e6b0802c9f.png&quot; alt=&quot;The color picker showing APCA scores.&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;Unlike WCAG2, scoring is a little more complex. With APCA you get a score between -108 and +106, where negative scores are for light text on a dark background and positive numbers are for dark text on a light background. The higher the number in an absolute sense, the better the contrast.&lt;/p&gt;&lt;p&gt;APCA gives a &lt;em&gt;minimum&lt;/em&gt; contrast ratio to hit and an &lt;em&gt;advised&lt;/em&gt; contrast ratio which is 15 points higher. In the color picker, a minimum contrast ratio will give you one check mark, while hitting the advises contrast will give you two check marks. And just like with WCAG2, a cross means the contrast is too low.&lt;/p&gt;&lt;p&gt;The APCA algorithm doesn&amp;#x27;t yet have its own suggested color functionality, though that is coming and we&amp;#x27;re planning on helping them out with that as we&amp;#x27;ve done with various other parts in the past year.&lt;/p&gt;&lt;blockquote&gt;&lt;h3 id=&quot;a-note-on-apca-usage&quot;&gt;A note on APCA usage&lt;/h3&gt;&lt;p&gt;While exciting (in that it feels both more accurate and more reasonable, even though it&amp;#x27;s actually stricter than the WCAG formula) it&amp;#x27;s worth noting that APCA is not part of any official standard. It&amp;#x27;s set to become part of WCAG3, but that itself is many years away from being ready.&lt;/p&gt;&lt;p&gt;We&amp;#x27;re excited for APCA, and part of the reason we implemented it ahead of it becoming a standard is that real-world usage and testing is vital for it to prove itself. If you want to build accessible websites however, WCAG2 is still the formula you should test with.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;meta-panel-updates&quot;&gt;Meta panel updates&lt;/h2&gt;&lt;p&gt;In the meta panel we&amp;#x27;ve updated our Slack preview (small change to the way dates are displayed) and Google SERP preview. Google SERPS now show a favicon as well as a site title, that they get from any structured data on the page that describes the &lt;code class=&quot;language-text&quot;&gt;WebSite&lt;/code&gt;. (but of course, Google being Google means they&amp;#x27;ll also replace it with something else if they deem that better)&lt;/p&gt;&lt;img src=&quot;static/googleserp-4f766ff491fe751e36af3620c0c272cf.png&quot; alt=&quot;comparing the old and new Google Search engine result.&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;Google SERP pages now also often show an image alongside a search result and although we&amp;#x27;ve implemented that design wise, it&amp;#x27;s not currently visible because there is no clarity yet on how they decide which image to show (or when to show one to begin with). Expect that in a future update.&lt;/p&gt;&lt;h3 id=&quot;improved-data-loading&quot;&gt;Improved data loading&lt;/h3&gt;&lt;p&gt;Previous versions of Polypane loaded any manifest or oEmbed files directly from the page&amp;#x27;s javascript context. In 13.1 we&amp;#x27;re loading them from a background process so they don&amp;#x27;t show up in the network panel anymore.&lt;/p&gt;&lt;h2 id=&quot;other-updates&quot;&gt;Other updates&lt;/h2&gt;&lt;p&gt;Some smaller updates worth mentioning:&lt;/p&gt;&lt;h3 id=&quot;browse-panel-with-unique-urls-per-tab&quot;&gt;Browse panel with unique URLs per tab&lt;/h3&gt;&lt;p&gt;When we introduced the browse panel, Polypane didn&amp;#x27;t have tabs yet, and so the URL shown in the browse panel was the same regardless of what tab you had open.&lt;/p&gt;&lt;p&gt;We&amp;#x27;ve now updated the Browse panel so it shows a unique URL for each tab. Thanks Verdi for the suggestion!&lt;/p&gt;&lt;p&gt;Later this year we&amp;#x27;re going to expand the Browse panel with tabs.&lt;/p&gt;&lt;p&gt;In addition, we&amp;#x27;ve removed Avocode since it was shut down recently, and replace it with Ceros Inspect.&lt;/p&gt;&lt;h3 id=&quot;clear-cookies-and-reload-option-in-the-context-menu&quot;&gt;Clear cookies and reload option in the context menu&lt;/h3&gt;&lt;p&gt;When you right-click the reload button in the toolbar, you&amp;#x27;ll now see a new option to clear cookies and reload the page. Use it to quickly reset any state stored in cookies, such as login status or cookie acceptance.&lt;/p&gt;&lt;p&gt;You can still find the previously available options to reload just the CSS, force a hard reload and quick access to the live reload options.&lt;/p&gt;&lt;h3 id=&quot;measure-selected-text-character-and-word-lengths-in-context-menu&quot;&gt;Measure selected text character and word lengths in context menu&lt;/h3&gt;&lt;p&gt;When you right-click on text you&amp;#x27;ve selected, Polypane now shows the number of characters and number of words in your selection in the context menu. This is useful to quickly count the words or character, but also to select a single line and check if the line length is between 45 and 70 characters, which is ideal for paragraphs. Thanks Ryan for suggesting this feature! Ryan also recently wrote about how he &lt;a href=&quot;https://ryantrimble.com/blog/building-with-polypane/&quot;&gt;built his new site with Polypane&lt;/a&gt;.&lt;/p&gt;&lt;img src=&quot;static/measuretext-e20fd1b516efe0d4ed666b128392b18e.jpg&quot; alt=&quot;Selected text with a context menu showing the number of characters and words in the selection.&quot; class=&quot;imgshadow&quot;/&gt;&lt;h3 id=&quot;screenshot-annotations-now-have-fixed-sizes&quot;&gt;Screenshot annotations now have fixed sizes&lt;/h3&gt;&lt;p&gt;In previous versions of Polypane the size of annotations (text, arrows etc) was dependent on the size of the image. For screenshots that doesn&amp;#x27;t quite work, so we&amp;#x27;ve switched those out for absolute sizes. This was the size is always consistent. During the process of this we found a tiny issue in &lt;a href=&quot;https://pqina.nl/pintura/?aff=xLXrx&amp;amp;ref=polypane&quot;&gt;Pintura&lt;/a&gt;, which powers our screenshot editor and Rik, the creator, fixed that within a day. Thanks Rik!&lt;/p&gt;&lt;h2 id=&quot;upgrading-to-vite&quot;&gt;Upgrading to Vite&lt;/h2&gt;&lt;p&gt;&lt;em&gt;If you don&amp;#x27;t care about how Polypane&amp;#x27;s built you can skip this section.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Though a 20% startup time improvement and about the same for general UI responsiveness is nothing to sneeze at, it wasn&amp;#x27;t the main reason we switched.&lt;/p&gt;&lt;p&gt;Polypane has been in development since 2015 and our existing build configuration has evolved from webpack 2 all the way through to 5. Unfortunately with each upgrade the dev build took longer to the point where it was taking 2 minutes before I could start working after running &lt;code class=&quot;language-text&quot;&gt;yarn dev&lt;/code&gt;. Using Vite it takes less than 20 seconds.&lt;/p&gt;&lt;p&gt;I&amp;#x27;ve tried migrating to Vite twice before, with both Vite 2 and 3, and while I liked the way everything was set up, both times I ran into issues with the way Vite handled things that made the process too brittle for my liking.&lt;/p&gt;&lt;p&gt;This time round, I had the help of &lt;a href=&quot;https://github.com/caoxiemeihao&quot;&gt;草鞋没号&lt;/a&gt; who maintains &lt;a href=&quot;https://github.com/electron-vite/&quot;&gt;electron-vite&lt;/a&gt;. I couldn&amp;#x27;t have done it without their help.&lt;/p&gt;&lt;p&gt;For those interested, we use both &lt;code class=&quot;language-text&quot;&gt;vite-electron-plugin&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;vite-plugin-electron&lt;/code&gt;, the former for our main process and the latter for our preload scripts. For the UI we use a plain &lt;code class=&quot;language-text&quot;&gt;@vitejs/plugin-react&lt;/code&gt;. (should we switch to &lt;code class=&quot;language-text&quot;&gt;@vitejs/plugin-react-swc&lt;/code&gt;? Let me know!)&lt;/p&gt;&lt;p&gt;The switch to Vite also gives us a strong foundation for improvements to performance and UI responsiveness in the future, as well as making it much easier to adopt various ESM based packages. Other than better performance though, you shouldn&amp;#x27;t notice any difference. If you do, &lt;a href=&quot;/support/&quot;&gt;Let me know&lt;/a&gt;!&lt;/p&gt;&lt;h2 id=&quot;deprecations&quot;&gt;Deprecations&lt;/h2&gt;&lt;p&gt;In this release we are deprecating the Tota11y debug tool. It&amp;#x27;s a great tool, but it hasn&amp;#x27;t been maintained for quite a while and its functionality can be found in other tools, such as the &lt;a href=&quot;/docs/outline-panel/&quot;&gt;outline panel&lt;/a&gt; and the other &lt;a href=&quot;/docs/debug-tools/&quot;&gt;Debug tools&lt;/a&gt;, which have a much more thorough and up to date set of tests. Tota11y will be removed in Polypane 14.&lt;/p&gt;&lt;h2 id=&quot;what-can-we-do-for-you&quot;&gt;What can we do for you?&lt;/h2&gt;&lt;p&gt;As you&amp;#x27;ve seen in the changelogs for this release and the past few releases, many features have come from Polypane&amp;#x27;s users. We love getting feedback and one of the best things about having devs as users is that they are &lt;em&gt;very good at feature requests&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;So consider this an open invitation: What is missing from Polypane? What&amp;#x27;s the one thing we should do that makes Polypane amazing for you? What nit would you just love we fix? &lt;a href=&quot;/support/&quot;&gt;Let us know!&lt;/a&gt; 🙏&lt;/p&gt;&lt;h2 id=&quot;get-polypane-131&quot;&gt;Get Polypane 13.1&lt;/h2&gt;&lt;p&gt;Polypane is available for Windows, Mac and Linux (.deb or AppImage) in both 64 bit and ARM versions.&lt;/p&gt;&lt;p&gt;Polypane automatically updates on Mac, Windows and on Linux when using the AppImage. Otherwise, go to
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; to download the latest version!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Try it for free&lt;/a&gt;.&lt;/strong&gt; No credit card needed.&lt;/p&gt;&lt;h2 id=&quot;polypane-1312-changelog&quot;&gt;Polypane 13.1.2 Changelog&lt;/h2&gt;&lt;p&gt;This is a bugfix release.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: non-landmarks are now hidden when &amp;quot;show warnings&amp;quot; is turned off&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Command palette can now be opened from View menu&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Live reload: &amp;quot;temp&amp;quot; and &amp;quot;tmp&amp;quot; folders are now ignored by default&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; More precise reload button rotation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Remove close button from screenshot notification (Thanks Zach!)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent console from showing a failed sourcemap download warning&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Live CSS: suggestions in dark mode now use the right theme (Thanks Giovanni!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Screenshot file format selection is now correctly shown (Thanks Jay!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Browse panel: Figma now correctly loads again (Thanks Efekahya!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Panel: Switching from devtools to other panels sometimes kept devtools visible&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;polypane-1311-changelog&quot;&gt;Polypane 13.1.1 Changelog&lt;/h2&gt;&lt;p&gt;This is a bugfix release.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;New Features&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Support for Mate translate extension&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Support for Snapfont extension&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Updated Chromium to 110.0.5481.208&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Zoom option in View menu are now clearer&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Clicking inside panes now closes any open color picker&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Console messages now show faster&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Removed extensions now have their address bar icon cleaned up immediately&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; disabling multiple css styles reset Elements panel (Thanks Saif!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Console popups show up again (Thanks Jay!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; issue with Typekit stylesheets (Thanks Seth!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; issue with late-loading styles not being parsed&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent potential crash with console logging deeply nested objects (Thanks Dan!)&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;polypane-131-changelog&quot;&gt;Polypane 13.1 Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;New Features&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Network requests in the Console panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Browse panel now has a unique URL per tab (Thanks Verdi!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Flex and Grid overlays from the Elements Panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; APCA support in the color picker&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Clear cookies and reload option in the reload menu&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Measure selected text character and word lengths in context menu (Thanks Ryan!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Updated Chromium to 110.0.5481.179&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Startup time and UI performance improvements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Google SERP design&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Slack card preview design&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Webmanifest and oEmbed are fetched out of process&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Copy CSS Selector or XPath to clipboard&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Show color picker for named colors&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Support for CSS nesting without nesting rule (&amp;quot;&amp;amp;&amp;quot;)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Non-inherited CSS properties are shown dimmed&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Updated known CSS properties&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Cache handling is now more strict&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Removed whitespace around logo in Share QR code&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; JSON viewer performance&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Rulers: default alignment for rows is now top&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Full mode now also shows a visual warning for disabled JS, CSS and Content Chaos&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Screenshot editor: Font sizes and line widths now use absolute values&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Only show one &amp;#x27;large CSS&amp;#x27; warning per URL per session (Thanks Andrew!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Console panel: shortcut to clear the console (Thanks Austin!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Console panel: New way to filter different types of console messages&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Pane Console indicator: Add a network and debug type, filter types by console panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Added support for new Google Variable Fonts&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Deprecations&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Deprecated&lt;/strong&gt; The Tota11y debug tool will be removed in 14.0&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Use correct theme background color during loading&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; offscreen webviews no longer being captured correctly for overview screenshots (Thanks Nicolaus!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where finding a previous search term would lock up the browser&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent panel from getting larger than the window (Thanks Kenneth!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Scroll sync not working when scrollingElement can&amp;#x27;t scroll (Thanks Giovanni!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel no longer scrolls the tree to the closing tag&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Browse panel: Replace Avocode with Ceros Inspect&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Clearly disable Extensions button on Getting Started page&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; issue where the element tooltip could show NaN for the contrast ratio&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Using Polypane to check a website with James Q Quick]]></title><description><![CDATA[Together with  James Q Quick  Kilian showcased how Polypane can be used to find issues and suggest improvements on a live website. During…]]></description><link>https://polypane.app/blog/using-polypane-to-check-a-website-with-james-q-quick/</link><guid isPermaLink="false">https://polypane.app/blog/using-polypane-to-check-a-website-with-james-q-quick/</guid><pubDate>Fri, 17 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Together with &lt;a href=&quot;https://jamesqquick.com&quot;&gt;James Q Quick&lt;/a&gt; Kilian showcased how Polypane can be used to find issues and suggest improvements on a live website.&lt;/p&gt;&lt;p&gt;During the livestream Kilian and James went through his new portfolio site and checked what parts Polypane flagged for improvement, and discussed how those improvements could be made.&lt;/p&gt;&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom:56.25%;position:relative;height:0;overflow:hidden&quot;&gt; &lt;div style=&quot;position:relative;width:100%;max-width:100%;padding-top:56.25%&quot; class=&quot;imgshadow&quot;&gt; &lt;iframe src=&quot;https://www.youtube.com/embed/b6zbqPVC1NY&quot; title=&quot;YouTube video player&quot; frameBorder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot; style=&quot;position:absolute;top:0;left:0;width:100%;height:100%&quot;&gt;&lt;/iframe&gt; &lt;/div&gt; &lt;/div&gt;&lt;p&gt;It was great to deep dive into a real website and show how Polypane can be used to improve it. There are a ton of different aspects that make a great website great, and James was already doing a lot of things right. But there were also some things that could be improved, and It was a lot of fun to show how Polypane was able to help with that.&lt;/p&gt;&lt;p&gt;The livestream was a really insightful way of learning how to use Polypane, and we hope to do more of these in the future. If you&amp;#x27;d like to see us do more livestreams, please let us know!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Building a lightbox with the Dialog element]]></title><description><![CDATA[The dialog element lets you overlay content on top of your site in something called the "top layer", which is a special layer that sits…]]></description><link>https://polypane.app/blog/building-a-lightbox-with-the-dialog-element/</link><guid isPermaLink="false">https://polypane.app/blog/building-a-lightbox-with-the-dialog-element/</guid><pubDate>Wed, 08 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The dialog element lets you overlay content on top of your site in something called the &amp;quot;top layer&amp;quot;, which is a special layer that sits above all other content. This way you never have to worry about your dialog being covered by other elements on the page due to z-index issues. While, like the name suggests, it&amp;#x27;s mostly used for dialogs, it can be used for any kind of overlay content, including lightboxes.&lt;/p&gt;&lt;p&gt;Recently we&amp;#x27;ve been helping out with the &lt;a href=&quot;https://devtoolstips.org&quot;&gt;DevtoolsTips&lt;/a&gt; website, adding Polypane tips and going through the list of issues to add and improve some of the features.&lt;/p&gt;&lt;p&gt;While the site has a ton of screenshots, they were shown relatively small and inline. &lt;a href=&quot;https://github.com/captainbrosset/devtools-tips/issues/19&quot;&gt;Adding a lightbox&lt;/a&gt; so people could see the large image was on the list of improvements, so I decided to give it a go.&lt;/p&gt;&lt;h2 id=&quot;the-requirements&quot;&gt;The requirements&lt;/h2&gt;&lt;p&gt;All the devtools tips are written in markdown files, and images are linked with the default markdown syntax: &lt;code class=&quot;language-text&quot;&gt;![alt text](image url)&lt;/code&gt;. We wanted to keep it that way, so we could easily add new tips and images without having to worry about the markup or train people to use an alternative syntax.&lt;/p&gt;&lt;p&gt;That meant we had to either transform the markdown to add the dialog element during the build process, or add the dialog element in the browser. Since we needed JS to open the dialog anyway, I decided to go with adding the dialog element in the browser.&lt;/p&gt;&lt;p&gt;After discussing with &lt;a href=&quot;https://patrickbrosset.com/&quot;&gt;Patrick&lt;/a&gt;, I figured we could use the dialog element to build a lightbox instead of including a big javascript lightbox script. The result is a lightweight function that&amp;#x27;s a little over 40 lines long that uses the platform as much as possible.&lt;/p&gt;&lt;h2 id=&quot;demo&quot;&gt;Demo&lt;/h2&gt;&lt;p&gt;See it in action here: &lt;a href=&quot;https://devtoolstips.org/tips/en/simulate-multiple-devices/&quot;&gt;&amp;quot;Simulate multiple devices that are kept in sync&amp;quot; on DevtoolsTips&lt;/a&gt; or check out the video below:&lt;/p&gt;&lt;video src=&quot;static/demo-5ef777e36141547b9d638d2f0d927e8d.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;h2 id=&quot;the-code&quot;&gt;The code&lt;/h2&gt;&lt;p&gt;We created a javascript function that adds a dialog for all the content image elements on the page and wraps them in a button that opens the dialog. Here&amp;#x27;s the entire code, styling excluded:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// The function&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createDialogs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;selector&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;Missing selector argument&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; buttonTemplate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;button&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  buttonTemplate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;lightbox-button&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  buttonTemplate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;aria-haspopup&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;dialog&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; dialogTemplate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;dialog&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  dialogTemplate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;lightbox&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  dialogTemplate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHTML &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;
    &amp;lt;form method=&amp;quot;dialog&amp;quot;&amp;gt;
      &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;
      &amp;lt;span aria-hidden&amp;gt;×&amp;lt;/span&amp;gt;
      &amp;lt;span class=&amp;quot;sr-only&amp;quot;&amp;gt;Close dialog&amp;lt;/span&amp;gt;
      &amp;lt;/button&amp;gt;
      &amp;lt;span aria-hidden&amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;/form&amp;gt;
  &lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createDialog&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; button &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; buttonTemplate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cloneNode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; dialog &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dialogTemplate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cloneNode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; form &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dialog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;form&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; span &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dialog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;form &amp;gt; span&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    span&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;before&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cloneNode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    span&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;textContent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; img&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;alt&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    img&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;before&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;button&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;after&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dialog&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;click&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      dialog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setProperty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;width&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; img&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;naturalWidth &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;px&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      dialog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;showModal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    dialog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;click&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; dialog &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; dialog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;selector&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;createDialog&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// calling the function with a specific CSS selector&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;createDialogs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;.tip-content img&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;line-by-line&quot;&gt;Line by line&lt;/h3&gt;&lt;p&gt;Lets go through it line by line and see what&amp;#x27;s going on:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createDialogs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;selector&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;Missing selector argument&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The function takes a CSS selector as an argument. If no selector is passed, it logs an error and returns.&lt;/p&gt;&lt;p&gt;After this, we create two templates to re-use for each image: one for the button we wrap an image in, and one for the dialog element itself.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; buttonTemplate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;button&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
buttonTemplate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;lightbox-button&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
buttonTemplate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;aria-haspopup&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;dialog&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We create a button template that we&amp;#x27;ll use to create the button for each image. We add a class to it for styling, and set the &lt;code class=&quot;language-text&quot;&gt;aria-haspopup&lt;/code&gt; attribute to &lt;code class=&quot;language-text&quot;&gt;dialog&lt;/code&gt; so screen readers know that the button opens a dialog.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; dialogTemplate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;dialog&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
dialogTemplate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;classList&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;lightbox&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
dialogTemplate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHTML &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;
    &amp;lt;form method=&amp;quot;dialog&amp;quot;&amp;gt;
      &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;
        &amp;lt;span aria-hidden&amp;gt;×&amp;lt;/span&amp;gt;
        &amp;lt;span class=&amp;quot;sr-only&amp;quot;&amp;gt;Close dialog&amp;lt;/span&amp;gt;
      &amp;lt;/button&amp;gt;
      &amp;lt;span aria-hidden&amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;/form&amp;gt;
  &lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next is the dialog template. We give it a class, again for styling, and add the markup for the dialog. There are a few things worth calling out here.&lt;/p&gt;&lt;p&gt;First, the entire contents of the dialog is wrapped in a form with the method &amp;quot;dialog&amp;quot;. This is a new type of form method specifically for dialogs. What it lets you do is use the native form handling to close the dialog when the form is submitted, which is what the button with type &amp;quot;submit&amp;quot; does. You can also use multiple buttons with different values to build a dialog with multiple choices, but we don&amp;#x27;t need that here.&lt;/p&gt;&lt;p&gt;Second, the close button contains two spans: one that has a &amp;quot;×&amp;quot; character and is hidden from screen readers, and one that says &amp;quot;Close dialog&amp;quot; and is hidden from sighted users. This way we can show a close icon for sighted users without having screenreaders read &amp;quot;times&amp;quot; out loud.&lt;/p&gt;&lt;p&gt;We also pre-add a span with &lt;code class=&quot;language-text&quot;&gt;aria-hidden&lt;/code&gt; to the dialog. This is where we&amp;#x27;ll add the image description later.&lt;/p&gt;&lt;p&gt;Next up is the function that creates the elements for us. We begin by creating duplicates of the templates we created earlier:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createDialog&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; button &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; buttonTemplate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cloneNode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; dialog &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dialogTemplate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cloneNode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For the dialog we pass &amp;quot;true&amp;quot; to the &lt;code class=&quot;language-text&quot;&gt;cloneNode&lt;/code&gt; method, which tells it to clone the entire contents of the template, not just the element itself. If you don&amp;#x27;t, all you get is an empty dialog element.&lt;/p&gt;&lt;p&gt;Next we create variables for the form and span elements so we can easily access them later.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; form &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dialog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;form&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; span &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dialog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;form &amp;gt; span&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Because we want to show the same image as already on the page (only larger) we clone the image and add it before the span. Next, we set the span&amp;#x27;s text content to the image&amp;#x27;s alt text.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;span&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;before&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;cloneNode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
span&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;textContent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; img&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;alt&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;A warning about re-using the alt description&lt;/strong&gt;: My friend &lt;a href=&quot;https://benmyers.dev/&quot;&gt;Ben Myers&lt;/a&gt; warns about showing the alt text as a description, because it can encourage content editors to add non-alt content in there like a caption or image credits. These don&amp;#x27;t belong in an alt text, which is meant to describe the image for non-sighted users.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;In our case, the alt texts were well written, and there is good content moderation in place, so we decided to go with it. Remember that this span has an &lt;code class=&quot;language-text&quot;&gt;aria-hidden&lt;/code&gt; attribute. We add this because the alt text is already set for the image itself, and having it read out twice for screen reader users would be annoying.&lt;/p&gt;&lt;p&gt;Next we add the button and dialog to the page:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;img&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;before&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;button&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;after&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dialog&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This code looks a little weird, but here&amp;#x27;s what happens:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;We add the button to the DOM before the image.&lt;/li&gt;&lt;li&gt;We add the image to the button. Because the image is already in the DOM, it&amp;#x27;s moved &lt;em&gt;into&lt;/em&gt; the button. Now the image is wrapped in the button.&lt;/li&gt;&lt;li&gt;With the button in the DOM, we can add the dialog element after it.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;We now have the DOM in place and we can hook up our events:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;click&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  dialog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setProperty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;width&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; img&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;naturalWidth &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;px&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  dialog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;showModal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We begin with an event listener on the button that opens the dialog as a modal when clicked (You can also show a dialog in-page by using &lt;code class=&quot;language-text&quot;&gt;dialog.show()&lt;/code&gt; instead of &lt;code class=&quot;language-text&quot;&gt;dialog.showModal()&lt;/code&gt;, but that&amp;#x27;s not very lightbox-y).&lt;/p&gt;&lt;p&gt;In it we also set the dialog&amp;#x27;s width to the image&amp;#x27;s natural width, so that the dialog and the alt text are as wide as the image itself. We don&amp;#x27;t have to worry about &lt;code class=&quot;language-text&quot;&gt;naturalWidth&lt;/code&gt; not being available here because the image is already loaded by the time we click on it.&lt;/p&gt;&lt;p&gt;If we don&amp;#x27;t do this, the dialog would be as wide as the text which, if it goes across multiple lines, is usually much wider than the image. This way, the text is always as wide as the image and the dialog looks much nicer. Let me know if there is a CSS-only way to do this, I&amp;#x27;d love to know.&lt;/p&gt;&lt;p&gt;Finally, we add an event listener to the dialog that closes it when the user clicks outside of it.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;dialog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&amp;quot;click&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; dialog &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; dialog&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What happens here is that when the user clicks on the dialog we check if the &lt;code class=&quot;language-text&quot;&gt;target&lt;/code&gt; of the event is the dialog itself. If it is, we close the dialog. Because the entire contents of the dialog is wrapped in a form, the only time the &lt;code class=&quot;language-text&quot;&gt;target&lt;/code&gt; matches the dialog element is when we click on the &lt;code class=&quot;language-text&quot;&gt;:backdrop&lt;/code&gt; of the dialog, and so this way we&amp;#x27;ve implemented a &amp;quot;click outside&amp;quot; feature.&lt;/p&gt;&lt;p&gt;That&amp;#x27;s the end of the createDialog function, and we call that for every matching image found on the page, by casting the NodeList returned by &lt;code class=&quot;language-text&quot;&gt;querySelectorAll&lt;/code&gt; to an array and calling &lt;code class=&quot;language-text&quot;&gt;forEach&lt;/code&gt; on it:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;selector&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;createDialog&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;styling&quot;&gt;Styling&lt;/h3&gt;&lt;p&gt;So far, the above doesn&amp;#x27;t include any styling. You can see the styling in the &lt;a href=&quot;#demo&quot;&gt;demo above&lt;/a&gt;, but there is a specific bit of functionality that lightboxes have and that is that they prevent the lightbox from becoming wider or taller than the viewport.&lt;/p&gt;&lt;p&gt;While most lightboxes will scale down the image in both dimensions, we only shrink the image horizontally. Most screenshots on the site are from desktop versions of browsers and they&amp;#x27;re usually in landscape. If the image overflows vertically, we want the image to scroll instead so that people can see all the detail. For this we don&amp;#x27;t need any additional javascript, we can use modern CSS to fix this for us.&lt;/p&gt;&lt;p&gt;Firstly, we set a maximum width and maximum height to the dialog itself:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.lightbox&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;100vw - 1rem&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;max-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;100vw - 1rem&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;We could also use the newer &lt;code class=&quot;language-text&quot;&gt;vi&lt;/code&gt; for inline (width) and &lt;code class=&quot;language-text&quot;&gt;vb&lt;/code&gt; for block (height) units, but in this case it won&amp;#x27;t make much of a difference, since we&amp;#x27;re using it to size the image in relation to the viewport.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Then, we set a grid layout on the form inside the lightbox.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.lightbox form&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;grid-template-rows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 1fr min-content&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We have three rows:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;A &lt;code class=&quot;language-text&quot;&gt;0px&lt;/code&gt; high row to place the close button in, so that it can overlap the image in the top right corner.&lt;/li&gt;&lt;li&gt;A &lt;code class=&quot;language-text&quot;&gt;1fr&lt;/code&gt; row for the image, that will take up all the space that is left.&lt;/li&gt;&lt;li&gt;A &lt;code class=&quot;language-text&quot;&gt;min-content&lt;/code&gt; row for the alt description, that will be as high as the text content needs it to be.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The button (in the first row) and the text description (in the last row) are both set to &lt;code class=&quot;language-text&quot;&gt;position: sticky&lt;/code&gt;. The button is set to be stuck at &lt;code class=&quot;language-text&quot;&gt;top:0&lt;/code&gt;, while the image is set to be stuck at &lt;code class=&quot;language-text&quot;&gt;bottom:0&lt;/code&gt;. This way, the button will always be in the top right corner, and the text description will always be at the bottom of the dialog.&lt;/p&gt;&lt;p&gt;The image lastly sits in a row in the middle that&amp;#x27;s &lt;code class=&quot;language-text&quot;&gt;1fr&lt;/code&gt;, meaning the row will size to the available space (which is all of it apart from the text content at the bottom) or the height of the image. When that 1fr is shorter than the image, it automatically becomes a scroll area and you can scroll to see all of the image.&lt;/p&gt;&lt;h4 id=&quot;preventing-scroll-on-the-page&quot;&gt;Preventing scroll on the page&lt;/h4&gt;&lt;p&gt;Even though the dialog overlays the entire page, behind it the page still remains scrollable. This can be potentially confusing because you can see the scrollbar move, but the dialog doesn&amp;#x27;t move. This isn&amp;#x27;t a huge problem, so we can use progressive enhancement to fix it.&lt;/p&gt;&lt;p&gt;When the dialog is open we want to prevent scrolling, which we can do with &lt;code class=&quot;language-text&quot;&gt;overflow:clip&lt;/code&gt; on the &lt;code class=&quot;language-text&quot;&gt;:root&lt;/code&gt; element, and we can use the &lt;code class=&quot;language-text&quot;&gt;:has()&lt;/code&gt; selector to only apply it when the dialog is open.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;:root:has(.lightbox[open])&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; clip&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;If you&amp;#x27;re unfamiliar with overflow: clip you can learn more about it here: &lt;a href=&quot;https://kilianvalkhof.com/2022/css-html/do-you-know-about-overflow-clip/&quot;&gt;Do you know about overflow: clip?&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;animation&quot;&gt;Animation&lt;/h3&gt;&lt;p&gt;The last thing we want to do is add a little animation to the dialog. We want it to fade in so the user has a better idea of what&amp;#x27;s happening, but when it closes we want to close it without animation, so visitors don&amp;#x27;t have to wait before interacting with the rest of the page.&lt;/p&gt;&lt;p&gt;Because the dialog is hidden, we can not use transitions and instead we have to use an animation when it becomes visible. To do this, we can hook into the dialog&amp;#x27;s &lt;code class=&quot;language-text&quot;&gt;open&lt;/code&gt; property, which is automatically added and removed by the browser when the dialog is shown and hidden.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-reduced-motion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no-preference&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;.lightbox[open]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; show 0.25s ease-in-out normal&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@keyframes&lt;/span&gt; show&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token selector&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token selector&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We wrap the entire block in a media query that checks if the user is &lt;a href=&quot;https://polypane.app/blog/the-complete-guide-to-css-media-queries/#prefers-reduced-motion&quot;&gt;fine with motion&lt;/a&gt;. If they don&amp;#x27;t mind motion, we add the animation.&lt;/p&gt;&lt;h2 id=&quot;future-improvements&quot;&gt;Future improvements&lt;/h2&gt;&lt;p&gt;There are two improvements we can make to this script:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Instead of a global function, it would be neater to wrap this functionality up in a web component.&lt;/li&gt;&lt;li&gt;Instead of the simple fade, we could use the upcoming &lt;a href=&quot;https://github.com/WICG/view-transitions/blob/main/explainer.md&quot;&gt;View Transition API&lt;/a&gt; to zoom in the image when it&amp;#x27;s clicked.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Work for the View Transitions API is underway in &lt;a href=&quot;https://github.com/captainbrosset/devtools-tips/pull/67&quot;&gt;this issue&lt;/a&gt;, and I welcome anyone that wants to to refactor the function above into a web component.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 13: CSS Nesting, extension support in beta, search by selector and Chromium 110]]></title><description><![CDATA[Polypane 13 is here! We're launching beta support for regular browser extensions, have a new way to search for elements and have added…]]></description><link>https://polypane.app/blog/polypane-13-css-nesting-extension-support-in-beta-search-by-selector-and-chromium-110/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-13-css-nesting-extension-support-in-beta-search-by-selector-and-chromium-110/</guid><pubDate>Wed, 01 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 13 is here! We&amp;#x27;re launching beta support for regular browser extensions, have a new way to search for elements and have added support for CSS Nesting in the elements inspector. Polypane 13 also runs on Chromium 110, and has UI improvements across the board.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;What&amp;#x27;s &lt;a href=&quot;/&quot;&gt;Polypane&lt;/a&gt;?&lt;/strong&gt; Polypane is the web browser for ambitious web developers. It&amp;#x27;s a stand-alone browser that shows
sites in multiple fully synced &lt;em&gt;panes&lt;/em&gt; and helps you make your site more responsive, more accessible and faster.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;support-for-browser-extensions-beta&quot;&gt;Support for Browser extensions (Beta)&lt;/h2&gt;&lt;p&gt;Polypane now supports regular Chrome extensions, such as &lt;strong&gt;1Password&lt;/strong&gt;, &lt;strong&gt;Grammarly&lt;/strong&gt;, &lt;strong&gt;MetaMask&lt;/strong&gt;, &lt;strong&gt;VisBug&lt;/strong&gt; and more. You can install them much in the same way as our previous support for devtools extensions.&lt;/p&gt;&lt;img src=&quot;static/visbug-8447cce8c1aaafa3b8d23c38bdb7b332.png&quot; alt=&quot;Visbug in Polypane&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;After installing an extension it becomes available in our new Extension list in the address bar, which you can keep open or collapse:&lt;/p&gt;&lt;img src=&quot;static/extensions2-11deb20e0831a606e94a8da639d4d273.png&quot; alt=&quot;The extensions icon in the header, expanded to show the extensions&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;Since extensions can only act on a single pane at once, We&amp;#x27;ve added a new indicator to the left of a pane title to tell you which pane is currently the one that extensions use. Clicking into any pane will focus it automatically, so whatever pane you interact with becomes the active one, including the websites shown in the browse panel.&lt;/p&gt;&lt;img src=&quot;static/activepaneicon-63012017bb909a935e08a52d074716d8.png&quot; alt=&quot;The extensions icon above a pane indicating it&amp;#x27;s active for extensions.&quot; class=&quot;imgshadow&quot;/&gt;&lt;h3 id=&quot;this-feature-is-in-beta&quot;&gt;This feature is in Beta&lt;/h3&gt;&lt;p&gt;Because Electron doesn&amp;#x27;t have full support for the Chrome extensions api and only implements a subset of the APIs there are some limitations:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Polypane only supports manifest v2 extensions. We&amp;#x27;ll hopefully be adding v3 support in the future, but it&amp;#x27;s dependent on patches landing for Electron.&lt;/li&gt;&lt;li&gt;It doesn&amp;#x27;t support synced storage, this will fail silently.&lt;/li&gt;&lt;li&gt;Extensions using the webRequest api will not be able to find any external resources.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Please &lt;a href=&quot;/support/&quot;&gt;let us know&lt;/a&gt; which extensions you wanna use in Polypane and if they work or not so we can build up a larger set of supported extensions and learn which APIs we could help implement in Electron to support even more extensions.&lt;/p&gt;&lt;p&gt;To start with we have quite a list that we definitely support: 1Password, Grammarly, VisBug, MetaMask, Simple Translate, Lorem Ipsum generator, LastPass, Linuix, WAVE and a few more.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/docs/browser-extensions/&quot;&gt;learn more in the docs&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;elements-panel-css-nesting-and-toggling-classes&quot;&gt;Elements panel: CSS Nesting and toggling classes&lt;/h2&gt;&lt;h3 id=&quot;css-nesting-support&quot;&gt;CSS Nesting support&lt;/h3&gt;&lt;p&gt;We are really excited for native CSS Nesting support, for which support has been turned on in Polypane 13. This is native CSS that works in Polypane:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;&amp;amp; a&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;text-decoration&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; underline&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token selector&quot;&gt;&amp;amp;:hover,
    &amp;amp;:focus&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; deepink&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We&amp;#x27;re using CSS nesting through &lt;a href=&quot;https://preset-env.cssdb.org/&quot;&gt;postcss-preset-env&lt;/a&gt; for this site and it&amp;#x27;s going to be amazing when we no longer have to transpile that.&lt;/p&gt;&lt;p&gt;In terms of browser support, Safari&amp;#x27;s technology preview already supports it, and it&amp;#x27;s set for release in Chromium 112. It&amp;#x27;s not clear when it will land in Firefox, but support is being worked on. Chromium 110, which Polypane 13 uses, only supports the strict syntax, so be sure to always include an &lt;code class=&quot;language-text&quot;&gt;&amp;amp;&lt;/code&gt; in your nesting.&lt;/p&gt;&lt;p&gt;To help you use CSS nesting we also implemented CSS Nesting support into our elements panel and, like &lt;a href=&quot;https://polypane.app/blog/polypane-8-better-elements-inspector-new-syncing-features-chromium-98-and-more/#cascade-layer-support&quot;&gt;@layer in Polypane 8&lt;/a&gt;, we&amp;#x27;re again one of the first browsers to land proper support in their devtools.&lt;/p&gt;&lt;img src=&quot;static/nesting-f559d1d3f8f05bf3c9c23e6df39e2316.png&quot; alt=&quot;Nested CSS rules in the elements inspector&quot; class=&quot;imgshadow&quot;/&gt;&lt;h3 id=&quot;toggling-classes&quot;&gt;Toggling Classes&lt;/h3&gt;&lt;p&gt;While our class editor already made working with classes really easy by automatically suggesting classnames from your HTML and CSS as you typed, we&amp;#x27;ve now also made it easier to turn specific classes off without having to edit text with the new Class toggle list.&lt;/p&gt;&lt;video src=&quot;static/classlist-2b9bc5fb335443f23887ffb612f475d2.png&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;Switch to it and from it by clicking the list icon, then use the checkboxes to toggle specific classes to quickly see their effect. If you want to add or edit a class, just switch back to the editor and make your changes.&lt;/p&gt;&lt;h3 id=&quot;top-layer-tooltip-support&quot;&gt;Top layer tooltip support&lt;/h3&gt;&lt;p&gt;We now have tooltip support for elements in the top layer, such as dialog elements. In previous versions of Polypane these elements were inspectable and editable from the Elements panel but because they were in the top layer, our tooltip rendered behind them. The new tooltip now always shows on top of all elements.&lt;/p&gt;&lt;h2 id=&quot;search-by-selector&quot;&gt;Search by selector&lt;/h2&gt;&lt;p&gt;Since Polypane 9 you could search for text in all panes, and now you can also search by selector in all of them. Open the search UI with the new &lt;kbd class=&quot;ShortcutDisplay-styles-module--shortcutdisplay--318pA&quot; aria-label=&quot;Shortcut: ⇧ ⌘ f&quot;&gt;⇧ ⌘ f&lt;/kbd&gt; shortcut to search by selector directly, or use the command bar.&lt;/p&gt;&lt;img src=&quot;data:image/png;base64,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&quot; alt=&quot;Find element interface&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;Then fill in any CSS selector and all matching elements will be highlighted. Use the arrow keys to cycle through them.&lt;/p&gt;&lt;p&gt;We also automatically calculate the specificity for the CSS selector and display that. Click that to open the selector in our &lt;a href=&quot;https://polypane.app/css-specificity-calculator/&quot;&gt;CSS specificity calculator&lt;/a&gt; to get a visual explanation of the specificity.&lt;/p&gt;&lt;h2 id=&quot;layout-alignments&quot;&gt;Layout alignments&lt;/h2&gt;&lt;p&gt;Both the horizontal and vertical layout now let you pick the alignment: whether panes start left, center or right aligned. The existing behavior stays the same: the horizontal layout always scroll horizontally and the vertical layout always scrolls vertically.&lt;/p&gt;&lt;img src=&quot;data:image/png;base64,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&quot; alt=&quot;layout align&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;/&gt;&lt;h2 id=&quot;content-chaos-debug-tool&quot;&gt;Content Chaos debug tool&lt;/h2&gt;&lt;p&gt;The content chaos debug tool lets you test how resilient your CSS is to having much more or much less content. While previously the debug tool would randomly choose between less and more content, it now provides three options: less, both and more. Both is the same as the old behavior, while less always shows less content (useful for testing languages with fewer characters per word, like Chinese) while more always increases the content in each text node (useful for testing languages that are on average longer, like german). With more control you can now more effectively test your pages.&lt;/p&gt;&lt;img src=&quot;static/contentchaos-d7ff7f3b60f7b77193ab07dd32b70e51.png&quot; alt=&quot;Three panes each with a different level of content chaos&quot; class=&quot;imgshadow&quot;/&gt;&lt;h2 id=&quot;meta-panel-new-resources&quot;&gt;Meta panel: new resources&lt;/h2&gt;&lt;p&gt;After adding security.txt and humans.txt we took a look to find out what else was there and we&amp;#x27;ve now added support for WebFinger and Ads.txt.&lt;/p&gt;&lt;h3 id=&quot;webfinger&quot;&gt;WebFinger&lt;/h3&gt;&lt;p&gt;The WebFinger protocol is a way to give more information about the people or entities related to a webpage or web site. It&amp;#x27;s a JSON file that, for a personal site, could contain links to for example social media accounts to prove those accounts are really you.&lt;/p&gt;&lt;p&gt;Polypane&amp;#x27;s implemention sends along the current page as resource. You can find out more over at &lt;a href=&quot;https://webfinger.net/&quot;&gt;webfinger.net&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&quot;adstxt&quot;&gt;Ads.txt&lt;/h3&gt;&lt;p&gt;Ads.txt (&amp;quot;Authorized Digital Sellers&amp;quot;, but the acronym itself also works) is a format created to help advertisers figure out where they can book advertisements for the website. Find out more at &lt;a href=&quot;https://iabtechlab.com/ads-txt/&quot;&gt;iab tech labs&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&quot;split-up-resource-hints&quot;&gt;Split up resource hints&lt;/h3&gt;&lt;p&gt;We&amp;#x27;ve split out resource hints (preload, preconnect, dns-preconnect and prefetch) from the list of link tags so you can more clearly see the difference between them.&lt;/p&gt;&lt;h2 id=&quot;disabling-web-security&quot;&gt;Disabling web security&lt;/h2&gt;&lt;p&gt;We got a lot of requests for this and while turning web security off is very much a &amp;quot;you better know what you&amp;#x27;re doing!&amp;quot; type of option, we also realise that many front-end developers do not have a choice due to the inflexibility of external parties and resources.&lt;/p&gt;&lt;p&gt;Turning web security off is now easy to do from the Edit menu. We urge everyone to look for better solutions, like using proxies or staging servers, but the feature is there for when there is no other choice.&lt;/p&gt;&lt;h2 id=&quot;custom-headers-now-apply-to-all-requests&quot;&gt;Custom headers now apply to all requests&lt;/h2&gt;&lt;p&gt;In previous versions of Polypane custom headers only applied to the requested HTML page. Now the custom headers are also sent along with any resource requested from the page, such as CSS, JS etc.&lt;/p&gt;&lt;p&gt;If you manage access to resources based on custom headers, you can now use Polypane for your development!&lt;/p&gt;&lt;h2 id=&quot;web-vitals-inp-attribution&quot;&gt;Web Vitals INP Attribution&lt;/h2&gt;&lt;p&gt;Along with CLS and LCP, you can now toggle attribution for the INP web vital and see which event on which element affected your ICP score.&lt;/p&gt;&lt;img src=&quot;static/inp-attribution-0d6a0e63fb8787ffe3888aa68cb09e4b.png&quot; class=&quot;imgshadow&quot; alt=&quot;A bell icon on the polypane homepage with a blue border and a text that reads &amp;#x27;pointerdown&amp;#x27;.&quot;/&gt;&lt;h2 id=&quot;better-screen-reader-compatibility&quot;&gt;Better screen reader compatibility&lt;/h2&gt;&lt;p&gt;Thanks to a thorough review by David we&amp;#x27;ve now improved the usage of Polypane with a screen reader. We fixed missing labels and also more strictly manage which parts of the UI are read out.&lt;/p&gt;&lt;p&gt;We would like to thanks David very, very much for his time and expertise. If there is anything we can do to improve your experience using Polypane, please let us know.&lt;/p&gt;&lt;h2 id=&quot;outline-panel&quot;&gt;Outline panel&lt;/h2&gt;&lt;p&gt;The link checker now batch-sends results so you can see results come in much faster. This also
fixes a bug where sometimes the result wouldn&amp;#x27;t be sent back to the UI. Additionally, 500 errors accidentally weren&amp;#x27;t shown in the error style but in the warning style, so were easy to overlook. They&amp;#x27;re now more noticable.&lt;/p&gt;&lt;p&gt;In Polypane 12 we introduced non-landmarks into the landmark outline with explanations of why they&amp;#x27;re not landmarks. We now show these non-landmarks in the overlay as well.&lt;/p&gt;&lt;h2 id=&quot;chromium-110&quot;&gt;Chromium 110&lt;/h2&gt;&lt;p&gt;We now run on Chromium 110.0.5481.100 which supports &lt;code class=&quot;language-text&quot;&gt;:initial-letter&lt;/code&gt; and from 109 the &lt;code class=&quot;language-text&quot;&gt;lh&lt;/code&gt; length unit and the &lt;code class=&quot;language-text&quot;&gt;hypenate-limit-chars&lt;/code&gt; property.&lt;/p&gt;&lt;p&gt;We&amp;#x27;ve also enabled the flag that lets you use the new view timeline api, CSS Nesting, Style queries, CSS Color level 4 syntax, Trigonometric functions in CSS and nth-child complex selectors. Enjoy!&lt;/p&gt;&lt;h2 id=&quot;what-can-we-do-for-you&quot;&gt;What can we do for you?&lt;/h2&gt;&lt;p&gt;As you&amp;#x27;ve seen in the changelogs for these past few releases, many features have come from Polypane&amp;#x27;s users. We love getting feedback and one of the best things about developers as your users is that they are &lt;em&gt;really good at feature requests&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;So consider this an open invitation: What is missing from Polypane? What&amp;#x27;s the one thing we should do that makes Polypane amazing for you? What nit would you just love we fix? &lt;a href=&quot;/support/&quot;&gt;Let us know!&lt;/a&gt; 🙏&lt;/p&gt;&lt;h2 id=&quot;get-polypane-13&quot;&gt;Get Polypane 13&lt;/h2&gt;&lt;p&gt;Polypane is available for Windows, Mac and Linux (.deb or AppImage) in both 64 bit and ARM versions.&lt;/p&gt;&lt;p&gt;Polypane automatically updates on Mac, Windows and on Linux when using the AppImage. Otherwise, go to
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; to download the latest version!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Try it for free&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;polypane-1303-changelog&quot;&gt;Polypane 13.0.3 Changelog&lt;/h2&gt;&lt;p&gt;Bugfix release for 13, solves issues with overview screenshots.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;New&lt;/strong&gt; Update to Chromium 110.0.5481.100&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt; overview screenshots work again&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;polypane-1302-changelog&quot;&gt;Polypane 13.0.2 Changelog&lt;/h2&gt;&lt;p&gt;Bugfix release for 13, solves issues with input event syncing, window popups and non-clickable notifications.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;New&lt;/strong&gt; Update to Chromium 110.0.5481.77&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Improved&lt;/strong&gt; Copy selected text is visible before extensions in context menu.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Improved&lt;/strong&gt; Faster element screenshots&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated screenshot editor&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt; Form input events not syncing&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt; Remove double Content Chaos test button&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt; Turn support for popups on again (Thanks Dev!)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent playing GIFs in social media previews&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt; Bug where notifications weren&amp;#x27;t clickable on mac&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt; Bug where tab bar was vertically scrollable on windows (Thanks Jon!)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;polypane-1301-changelog&quot;&gt;Polypane 13.0.1 Changelog&lt;/h2&gt;&lt;p&gt;Bugfix release for 13, solves issues with the panel, extensions and login flow on mac.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;New&lt;/strong&gt; Add Dashlane password manager to known extensions&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;New&lt;/strong&gt; Add CSS Shapes Editor to known extensions&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt; Downgrade 1Password for support&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt; Detached Panel being blank&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fix&lt;/strong&gt; Activation flow on mac sometimes not accepting mouse events&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;polypane-13-changelog&quot;&gt;Polypane 13 Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;New Features&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Support for chrome extensions (BETA)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; CSS Nesting support&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Search in panes by Element Selector (Thanks Valter!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Element inspector: toggle classes support&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Allow aligning the horizontal and vertical layouts (Thanks Charles!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; WebFinger support in Meta panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Ads.txt support in Meta panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Option to disable web security&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Chromium 110&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Node tooltips now supports elements in the top layer&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: Broken link checker now returns results much faster&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Debug tools: &amp;quot;More&amp;quot; and &amp;quot;Less&amp;quot; options for the Content Chaos Debug Tool&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Custom headers are now applied to all requests from a pane&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Inspecting a new element scrolls style list back up&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: New CSS values, properties and units autosuggestions.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Support for &lt;code class=&quot;language-text&quot;&gt;:host&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;:host()&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;:host-context()&lt;/code&gt; specificity calculations. (Thanks Bramus! Paul, your new homework!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Workspaces: The overwrite button is moved away from the title (Thanks Mathias!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline: non-landmarks are now also highlighted in the landmark overlay&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Fallback location for security.txt is also checked&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Preloads are split into a separate resource hints list&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; View page source is now available in context menu (Thanks Evan!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Better support for Wayland (Thanks Bea!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Getting Started tutorial now has a progress bar&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; New Chromium flags: CSS Nesting, CSS Colors level 4, View timeline, Color contrast, Style Queries, Trigonometric Functions, Nth-child complex selectors&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Screen reader compatibility (Thanks David!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Web Vitals: INP attribution&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; All color contrast checkers in Polypane now use the same normative calculation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Resize performance&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; New icon for integrations&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; logic for which elements iOS-emulated devices consider focusable&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; updated list of supported google fonts&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; updated list of rules in accessibility panel&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Element panel: bug where some elements couldn&amp;#x27;t be inspected&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Element panel: bug where not all classes where shown as suggestions&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Element panel: Color swatch overlapped copy styles button in computed styles panel (Thanks Felipe!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Workspaces refactoring to prevent saving issues (Thanks Vivian, John and Felipe!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Outline pane: Server errors weren&amp;#x27;t appropriately highlighted in link list&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Breakpoints list no longer falls behind chromium devtools&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; New window handlers correclty opens things in new tabs or side browser again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Remove obsolete workaround for twitter.com headers&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Corner radius setting in screenshot editor was broken (Thanks Bryan!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Align tooltip of navigational buttons to the bottom to prevent overlapping with macos window controls (Thanks Felipe!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Detached Panel: OS-specific monospace font wasn&amp;#x27;t correctly set (Thanks Vasiliy)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; New User Agent to support logging in with Google services&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Disable navigation sync is no longer visible for the full layout&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Polypane on Syntax.fm]]></title><description><![CDATA[On December the 30th Kilian was a guest on the  Syntax.fm  Supper Club to talk about Polypane. Wes, Scott and Kilian spoke about Kilians…]]></description><link>https://polypane.app/blog/polypane-on-syntax-fm/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-on-syntax-fm/</guid><pubDate>Wed, 04 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;On December the 30th Kilian was a guest on the &lt;a href=&quot;https://syntax.fm/show/556/supper-club-polypane-with-kilian-valkhof&quot;&gt;Syntax.fm&lt;/a&gt; Supper Club to talk about Polypane. Wes, Scott and Kilian spoke about Kilians background, how he came up with Polypane, how it&amp;#x27;s built and how different features in the app work.&lt;/p&gt;&lt;p&gt;To read the show notes, go to &lt;a href=&quot;https://syntax.fm/show/556/supper-club-polypane-with-kilian-valkhof&quot;&gt;Supper Club × Polypane with Kilian Valkhof&lt;/a&gt;!&lt;/p&gt;&lt;p&gt;Thanks Wes and Scott for having me on!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 12: introducing the Command bar]]></title><description><![CDATA[Polypane 12 introduces our new command bar, that you can use to control any part of the app without leaving your keyboard.
We also improved…]]></description><link>https://polypane.app/blog/polypane-12-introducing-the-command-bar/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-12-introducing-the-command-bar/</guid><pubDate>Mon, 12 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 12 introduces our new command bar, that you can use to control any part of the app without leaving your keyboard.
We also improved the reference image, color picker and screenshot features, added new accessibility checks and implemented
support for proxies. Polypane 12 runs on the latest Chromium, version 108.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;What&amp;#x27;s &lt;a href=&quot;/&quot;&gt;Polypane&lt;/a&gt;?&lt;/strong&gt; Polypane is the web browser for ambitious web developers. It&amp;#x27;s a stand-alone browser that shows
sites in multiple fully synced &lt;em&gt;panes&lt;/em&gt; and helps you make your site more responsive, more accessible and faster.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;command-bar&quot;&gt;Command bar&lt;/h2&gt;&lt;p&gt;We&amp;#x27;ve wanted to add a command bar for ages, so we&amp;#x27;re extremely happy to finally have one. It&amp;#x27;s built on &lt;a href=&quot;https://cmdk.paco.me/&quot;&gt;cmdk&lt;/a&gt; where we&amp;#x27;ve added our own improvements &lt;a href=&quot;https://github.com/pacocoursey/cmdk/pulls?q=author%3AKilian+is%3Apr&quot;&gt;and contributed them back&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Whether it&amp;#x27;s adding panes, opening new URLs, navigating to specific panels or even quickly copying lorem ipsum, a UUID or your own
IP address, or, uhm, shoot confetti.&lt;/p&gt;&lt;video src=&quot;static/confetti-3e666af3c74ab7e8fd1c8a2f5d9b6efd.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;There is a ton of stuff to explore in the new Command bar. Open it by pressing &lt;kbd class=&quot;ShortcutDisplay-styles-module--shortcutdisplay--318pA&quot; aria-label=&quot;Shortcut: ⌘ k&quot;&gt;⌘ k&lt;/kbd&gt;. Let us know what you think, and what more you want the command bar to do!&lt;/p&gt;&lt;h2 id=&quot;reference-image&quot;&gt;Reference image&lt;/h2&gt;&lt;p&gt;For the reference image we added a quick way to toggle the image on and off without needing to change its opacity, and a new
overlay mode that doesn&amp;#x27;t invert colors.&lt;/p&gt;&lt;p&gt;We now have two overlay modes: difference and invert. Difference blends the image and website together and shows the difference. Everything that&amp;#x27;s the same is black, everything that&amp;#x27;s not is highlighted.&lt;/p&gt;&lt;p&gt;Invert turns the image into a negative. When overlaying it on the website, everything that&amp;#x27;s the same cancels out to grey, and the differences are shown such that the website retains its original colors,
and the image is inverted.&lt;/p&gt;&lt;video src=&quot;static/referenceimage-238e8a09a6c665a436795eb376c669a1.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;The benefit of the invert mode is that the website colors are the same, so you can see which part of the difference is coming from the website, and which one is coming from the overlaid image. Thanks Quang and Vladimir for suggesting this feature!&lt;/p&gt;&lt;h2 id=&quot;screenshots&quot;&gt;Screenshots&lt;/h2&gt;&lt;p&gt;You can now set a delay before taking a screenshot, and add white-space around the image while editing so you have more space for annotations.&lt;/p&gt;&lt;h3 id=&quot;delays&quot;&gt;Delays&lt;/h3&gt;&lt;p&gt;Before making a screenshot you can set a delay of 5 or 10 seconds. This lets you get the page in order by hovering, inspecting or clicking before the screenshot is actually taken.&lt;/p&gt;&lt;p&gt;During the delay a countdown timer is shown:&lt;/p&gt;&lt;video src=&quot;static/delay-450b298c56338a544ca1d6b63e2587d3.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;We like to use this to make screenshots of our node tooltips: set a delay, press &lt;kbd class=&quot;ShortcutDisplay-styles-module--shortcutdisplay--318pA&quot; aria-label=&quot;Shortcut: ⌥&quot;&gt;⌥&lt;/kbd&gt; to inspect and all its info shows up right in the screenshot ready to be shared.
Of course, it&amp;#x27;s useful for any hover-related or timing dependent UI!&lt;/p&gt;&lt;h3 id=&quot;white-space&quot;&gt;White space&lt;/h3&gt;&lt;p&gt;We now support adding additional space around your image by zooming out in the crop feature of our screenshot editor.&lt;/p&gt;&lt;video src=&quot;static/crop-b5e914816aabcd3b33a099bd2c3bea52.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;This
lets you add a border around your image where you can put annotations before saving and sending it to your colleagues or customers!&lt;/p&gt;&lt;h2 id=&quot;proxy-support&quot;&gt;Proxy support&lt;/h2&gt;&lt;p&gt;If you require a proxy to access pages and you can&amp;#x27;t set that at an operating system level, Polypane now supports
&lt;a href=&quot;&quot;&gt;configuring a proxy&lt;/a&gt; with all the options that &lt;a href=&quot;https://www.electronjs.org/docs/latest/api/session#sessetproxyconfig&quot;&gt;Electron proxies&lt;/a&gt; have.&lt;/p&gt;&lt;h2 id=&quot;easily-get-links-to-fragment-identifiers&quot;&gt;Easily get links to fragment identifiers&lt;/h2&gt;&lt;p&gt;When right-clicking any element that has an &lt;code class=&quot;language-text&quot;&gt;id&lt;/code&gt; attribute, you can now copy the link to their fragment identifiers.
Like copying regular links, you can copy the URL, or copy it as markdown. The markdown link will use the text inside the element as the name:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[Easily get links to fragment identifiers](https://polypane.app/blog/polypane-12-the-one-with-the-command-bar/#easily-get-links-to-fragment-identifiers)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We found ourselves often wanting to link quickly to different sections of our &lt;a href=&quot;/docs/&quot;&gt;docs&lt;/a&gt; and with this it&amp;#x27;s just a right-click and we&amp;#x27;re good to go.&lt;/p&gt;&lt;h2 id=&quot;meta-panel&quot;&gt;Meta panel&lt;/h2&gt;&lt;p&gt;Along with updates to the Slack and Discord previews made for Polypane 12, we now show the &lt;code class=&quot;language-text&quot;&gt;security.txt&lt;/code&gt; file when available.&lt;/p&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Security.txt&lt;/code&gt; is a new standard, like &lt;code class=&quot;language-text&quot;&gt;robots.txt&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;humans.txt&lt;/code&gt; (which we also show) that lists information to allow
security researchers to easily report security vulnerabilities. You can learn more about it at &lt;a href=&quot;https://securitytxt.org/&quot;&gt;securitytxt.org&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;static/security-b2168ee72ddce691a89f094f14785375.png&quot; class=&quot;imgshadow&quot; alt=&quot;contents of the security.txt for securitytxt.org.&quot;/&gt;&lt;p&gt;Thanks Paul for suggesting this feature!&lt;/p&gt;&lt;h2 id=&quot;outline-panel&quot;&gt;Outline panel&lt;/h2&gt;&lt;p&gt;We&amp;#x27;ve added new functionality to the various lists in the outline panel, the biggest update being the Landmarks panel.&lt;/p&gt;&lt;h3 id=&quot;landmarks&quot;&gt;Landmarks&lt;/h3&gt;&lt;p&gt;Some elements are landmarks when they&amp;#x27;re used at the top level, like &lt;code class=&quot;language-text&quot;&gt;header&lt;/code&gt;, but not when they&amp;#x27;re used in other landmarks.
Likewise, a &lt;code class=&quot;language-text&quot;&gt;section&lt;/code&gt; can be a landmark but not if it doesn&amp;#x27;t have a label. Hidden elements are also taken out of the landmarks list.&lt;/p&gt;&lt;p&gt;Up until Polypane 11, those not-landmark elements were simply not displayed in the landmark list. With Polypane 12, we&amp;#x27;re
now showing those elements and explain why they&amp;#x27;re not landmarks. This helps you debug situations where you expect something to be
in the landmarks structure but it isn&amp;#x27;t.&lt;/p&gt;&lt;img src=&quot;static/landmarks-a6cd169f4bed7acd380b35ceab7ef148.png&quot; class=&quot;imgshadow&quot; alt=&quot;Landmark overview with two items that have a warning icon to indicate they&amp;#x27;re not landmarks&quot;/&gt;&lt;p&gt;If you want to learn more about how these landmark rules work exactly, check out &lt;a href=&quot;https://www.htmhell.dev/adventcalendar/2022/4/&quot;&gt;landmarks and where to put them&lt;/a&gt;, which Kilian recently wrote
for the &lt;a href=&quot;https://www.htmhell.dev/adventcalendar/&quot;&gt;HTMHell advent calendar&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&quot;images&quot;&gt;Images&lt;/h3&gt;&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;src&lt;/code&gt; is a required attribute, so if an image element doesn&amp;#x27;t have one, it doesn&amp;#x27;t display an image right? Turns out
we made the wrong assumption here, since if it does have an &lt;code class=&quot;language-text&quot;&gt;srcset&lt;/code&gt; for example, browsers will still find a way to show
an image on screen. Browsers are such forgiving beasts.&lt;/p&gt;&lt;p&gt;So the Polypane outline panel now also happily displays these, albeit with a warning about that missing &lt;code class=&quot;language-text&quot;&gt;src&lt;/code&gt; attribute, since it&amp;#x27;s still required. Thanks Eric for helping us find this issue!&lt;/p&gt;&lt;h3 id=&quot;focus-order&quot;&gt;Focus order&lt;/h3&gt;&lt;p&gt;We improved the focus order in two ways: we now more accurately list all focusable elements, including links in
&lt;code class=&quot;language-text&quot;&gt;summary&lt;/code&gt; elements (which themselves are focusable too) as well as &lt;code class=&quot;language-text&quot;&gt;iframe&lt;/code&gt;s. This will make the list more accurate.&lt;/p&gt;&lt;p&gt;Secondly, we improved our algoritm to determine if elements had a logical focus order. Previously, it compared the center of two elements, but we now use the
top left corner instead. The result is that Polypane is better at assessing what a &amp;quot;logical&amp;quot; focus order is.&lt;/p&gt;&lt;h3 id=&quot;links&quot;&gt;Links&lt;/h3&gt;&lt;p&gt;For links, we now show the &lt;code class=&quot;language-text&quot;&gt;hreflang&lt;/code&gt; attribute value when available.&lt;/p&gt;&lt;h2 id=&quot;color-picker&quot;&gt;Color picker&lt;/h2&gt;&lt;p&gt;The color picker will now switch to a set of icons when you&amp;#x27;re testing for non-text contrast.&lt;/p&gt;&lt;img src=&quot;data:image/png;base64,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&quot; class=&quot;imgshadow&quot; alt=&quot;color picker with icon example&quot;/&gt;&lt;p&gt;You can now switch between AA and AAA levels to determine if something has enough contrast or not. This paves the way for APCA to be included in the future.&lt;/p&gt;&lt;p&gt;Lastly, when exporting a color swatch screenshot, we now include the suggestion in the file name as well.&lt;/p&gt;&lt;h2 id=&quot;lang-emulation&quot;&gt;Lang emulation&lt;/h2&gt;&lt;img src=&quot;static/pagelang-333cc1d4039ef5015b65e3b84a159762.png&quot; class=&quot;imgshadow&quot; alt=&quot;new Page Language option in Emulation popup&quot; style=&quot;float:right;margin-left:1rem;max-width:60%&quot;/&gt;&lt;p&gt;The Emulations popup in Polypane already let you quickly change the direction of the page with the &lt;code class=&quot;language-text&quot;&gt;dir&lt;/code&gt; attribute, and you
can now also quickly change the &lt;code class=&quot;language-text&quot;&gt;lang&lt;/code&gt; of a page from the same UI.&lt;/p&gt;&lt;p&gt;This is different from the &lt;em&gt;browser locale&lt;/em&gt; that you can also set in the same popover. That&amp;#x27;s used to send along with the
request headers and tells your JavaScript which languages the &lt;em&gt;browser&lt;/em&gt; understands, while the &lt;code class=&quot;language-text&quot;&gt;lang&lt;/code&gt; attribute determines
what language the page is written in. You can also find the page language in the &lt;a href=&quot;/docs/meta-information/&quot;&gt;meta panel&lt;/a&gt; under &amp;quot;language&amp;quot;. Thanks to Daniel for suggesting this feature.&lt;/p&gt;&lt;h2 id=&quot;click-outside-support&quot;&gt;Click outside support&lt;/h2&gt;&lt;p&gt;Polypane can now also sync &amp;quot;click outside&amp;quot; style interactions, where clicking outside an popup dismisses it. Because this
click doesn&amp;#x27;t happen on an interactive element previous versions didn&amp;#x27;t sync it.&lt;/p&gt;&lt;video src=&quot;static/click-outside-f94837d45aef518f4b79ebc5404f6ef0.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;h2 id=&quot;hiding-the-main-menu-on-linux&quot;&gt;Hiding the main menu on Linux.&lt;/h2&gt;&lt;p&gt;On Windows, the menu is integrated in the header and on macOS the menu sits at the top of the screen. On linux however,
a native menu is rendered wherever the OS determines it should be.&lt;/p&gt;&lt;p&gt;If that happens to be at the top of the app (as opposed to in a global menu, which I recommend to everyone) that doesn&amp;#x27;t look great.
So if you&amp;#x27;re on Linux you can now show and hide the menu with &lt;kbd class=&quot;ShortcutDisplay-styles-module--shortcutdisplay--318pA&quot; aria-label=&quot;Shortcut: ⌥ m&quot;&gt;⌥ m&lt;/kbd&gt;. Thanks Philipp for requesting this feature!&lt;/p&gt;&lt;h2 id=&quot;chromium-108&quot;&gt;Chromium 108&lt;/h2&gt;&lt;p&gt;We now run on Chromium 108.0.5359.62 which supports new viewport size units (more on that in a future post). We&amp;#x27;ve also
enabled the flag that lets you use the new lh (for line-height) unit and Polypane can now animate &lt;code class=&quot;language-text&quot;&gt;grid-template&lt;/code&gt;.&lt;/p&gt;&lt;h2 id=&quot;get-polypane-12&quot;&gt;Get Polypane 12&lt;/h2&gt;&lt;p&gt;Polypane is available for Windows, Mac and Linux (.deb or AppImage) in both 64 bit and ARM versions.&lt;/p&gt;&lt;p&gt;Polypane automatically updates on Mac, Windows and on Linux when using the AppImage. Otherwise, go to
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; to download the latest version!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Try it for free&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;polypane-1201-changelog&quot;&gt;Polypane 12.0.1 Changelog&lt;/h2&gt;&lt;p&gt;Bugfix to solve an issue with the Next.js devserver not loading a site properly.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Add support for the &lt;code class=&quot;language-text&quot;&gt;::slotted()&lt;/code&gt; CSS selector&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue that prevented Next.js dev server from loading&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent removal of trailing slashes on URLs&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;polypane-12-changelog&quot;&gt;Polypane 12 Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;New features&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Command bar&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Inverted reference images (Thanks Quang and Vladimir!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Delayed screenshots (Thanks Andrew!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Emulate page language (Thanks Daniel!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Proxy support (Thanks Brad!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Security.txt support (Thanks Paul!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Right-click elements with an ID to copy url to document fragment&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Allow hiding the main menu on Linux (Thanks Philipp!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Ultrawide device preset&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Chromium 108.0.5359.62&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated list of supported Google Fonts&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: Landmarks now show elements taken out of the landmark tree&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: show warning for images without &lt;code class=&quot;language-text&quot;&gt;src&lt;/code&gt; attribute (Thanks Eric!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: Links show the &lt;code class=&quot;language-text&quot;&gt;hreflang&lt;/code&gt; value if available&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel Focus order: Offsets now test from the top left of element instead of center&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel Focus order: Links inside summary elements and iframes are now correctly detected if focusable&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta Panel: Improved Slack and Discord previews&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Screenshots: Now support adding white space around screenshots (Thanks Julian!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Pressing &lt;code class=&quot;language-text&quot;&gt;?&lt;/code&gt; now opens shortcut overview&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Support for click-outside-to-close interactions&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Wording in License flow (Thanks Jim!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; QR Code: Show IP or full URL to copy&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Newly added panes using &lt;code class=&quot;language-text&quot;&gt;cmd n&lt;/code&gt; now get added to the end&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Color picker: When testing non-text contrast, the preview now shows icons&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Color picker: Suggested color is added to file name suggestion&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Color picker: You can switch between AA and AAA Levels&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Custom Headers UI more clearly shows applied headers&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Devtools extensions: Support CSS Feature Toggles extension&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent ellipsis from being shown in the wrong instances in Twitter preview (Thanks Charlie!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Overflow issue for long classnames in node tooltip&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Alignment issue in collapsed pane headers&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Support for click-outside-to-close interactions&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Load new Google Variable Fonts correctly&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Active dot for emulation in Full mode moved during deactivation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Empty workspace message animates out smoothly again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue with synced focus after re-opened main window on macOS&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Navigating the live/auto reload options could clear out settings (Thanks Carlos!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Inconsistent indentation in debug tools (Thanks Vladimir!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Different text size wasn&amp;#x27;t applied in detached panel (Thanks Mac!)&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Polypane 11: JSON viewer, new accessibility tools, Chromium 106, iPhone 14 devices and screenshot updates]]></title><description><![CDATA[Polypane 11 now renders JSON files in a completely new viewer, adds a ton of new accessibility testing features and improves upon existing…]]></description><link>https://polypane.app/blog/polypane-11-json-viewer-new-accessibility-tools-chromium-106-i-phone-14-devices-and-screenshot-updates/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-11-json-viewer-new-accessibility-tools-chromium-106-i-phone-14-devices-and-screenshot-updates/</guid><pubDate>Tue, 04 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 11 now renders JSON files in a completely new viewer, adds a ton of new accessibility testing features and improves upon existing ones, updates the rendering engine to Chromium 106, includes new iPhone 14 devices and has new screenshotting features.&lt;/p&gt;&lt;p&gt;We&amp;#x27;ve also made improvements to the Element, Live CSS and Meta panels as well as added more into to the node tooltips.&lt;/p&gt;&lt;h2 id=&quot;json-viewer&quot;&gt;JSON Viewer&lt;/h2&gt;&lt;p&gt;Polypane now included a JSON viewer that lets you visualize your JSON, inspect and filter it. There are two modes: you can show the JSON as it&amp;#x27;s sent from the server (optionally pretty-printing it), or show it in an interactive tree view.&lt;/p&gt;&lt;img src=&quot;/doc-img/json/tree.png&quot; class=&quot;imgshadow&quot; alt=&quot;JSON viewer showing GitHub user details&quot;/&gt;&lt;p&gt;In the tree view you can quickly collapse, expand and filter your JSON object. Each property has an icon matching the type of the value, like text, number or URL. Where possible, values are richly displayed: URLs get a favicon and are clickable, datetimes get a pretty printed preview etc.&lt;/p&gt;&lt;p&gt;In the treeview you can expand and collapse individual objects and arrays, but you can also expand and collapse all properties or pick which properties you want to expand in one go. This really helps when you&amp;#x27;re dealing with large JSON files and want to hide a lot of info you don&amp;#x27;t currently need.&lt;/p&gt;&lt;p&gt;The JSON viewer is automatically launched whenever you open a JSON file, locally or from a server, in both the panes and in the Browse panel. We have a lot of plans on where to take the JSON viewer next and look forward to your feedback.&lt;/p&gt;&lt;h2 id=&quot;accessibility-features&quot;&gt;Accessibility features&lt;/h2&gt;&lt;p&gt;This release we&amp;#x27;ve been working with a lot of you (❤️ thank you!) to figure out where the gaps in Polypane&amp;#x27;s tooling are when it comes to assessing accessibility issues effectively.&lt;/p&gt;&lt;p&gt;With the new and improved tooling, we hope we closed the gap letting you use Polypane end-to-end when auditing websites for accessibility issues. If you&amp;#x27;re missing functionality, &lt;a href=&quot;/support/&quot;&gt;let us know&lt;/a&gt;!&lt;/p&gt;&lt;h3 id=&quot;new-visualization-debug-tools&quot;&gt;New visualization debug tools&lt;/h3&gt;&lt;p&gt;One of the first things that came up discussing with the team at &lt;a href=&quot;https://elevenways.be&quot;&gt;ElevenWays&lt;/a&gt; was tooling to quickly show all the roles and ARIA attributes on a page. With the new &amp;#x27;Show Roles&amp;#x27; and &amp;#x27;Show ARIA attribute&amp;#x27; debug tools you can now not only get an overview with a single click, you can also easily export screenshots to use in auditing reports or issue tickets.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Show Roles debug tool&lt;/strong&gt;&lt;/p&gt;&lt;img src=&quot;/doc-img/overlays/roles.png&quot; class=&quot;imgshadow&quot; alt=&quot;Roles used on the Polypane homepage&quot;/&gt;&lt;p&gt;The Show Roles debug tool highlights all elements that have a &lt;code class=&quot;language-text&quot;&gt;role&lt;/code&gt; attribute and lists both the role and the element name. This helps you verify that the role is applicable and valid for a given element.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Show ARIA attributes debug tool&lt;/strong&gt;&lt;/p&gt;&lt;img src=&quot;/doc-img/overlays/arias.png&quot; class=&quot;imgshadow&quot; alt=&quot;Aria attributes used on the Polypane hompage&quot;/&gt;&lt;p&gt;The show ARIA attributes debug tool on the other hand lists &lt;em&gt;all&lt;/em&gt; ARIA attributes and values that are applied to a given element. Test if ARIA attribute usage makes sense and if the right combinations are used.&lt;/p&gt;&lt;h3 id=&quot;updated-achromatopsia-simulator-and-new-photophobia-simulator&quot;&gt;Updated achromatopsia simulator and new Photophobia simulator&lt;/h3&gt;&lt;p&gt;Recently, &lt;a href=&quot;https://natebaldw.in/&quot;&gt;Nate Baldwin&lt;/a&gt; release the &lt;em&gt;amazing&lt;/em&gt; &lt;a href=&quot;https://colorandcontrast.com/&quot;&gt;Color &amp;amp; Contrast&lt;/a&gt;. It&amp;#x27;s an amazing online resource with everything there is to know about, well, color and contrast. Included are lots of visualizations and examples, including for achromatopsia (full color blindness). We highly recommend you check it out.&lt;/p&gt;&lt;p&gt;Comparing Nate&amp;#x27;s visualization to the one available in Polypane, we realized that ours was simulating &lt;em&gt;cerebral&lt;/em&gt; achromatopsia. So we set out to create a more true-to-experience visualization for achromatopsia itself:&lt;/p&gt;&lt;img src=&quot;/doc-img/overlays/achromatomaly.png&quot; class=&quot;imgshadow&quot; alt=&quot;The new achromatomaly simulator shown next to a regular pane&quot;/&gt;&lt;p&gt;In the process, we renamed our existing visualization to indicate it&amp;#x27;s simulating cerebral achromatopsia. We also added a new Photophobia simulation:&lt;/p&gt;&lt;img src=&quot;/doc-img/overlays/photophobia.png&quot; class=&quot;imgshadow&quot; alt=&quot;The new photophobia simulator shown next to a regular pane&quot;/&gt;&lt;p&gt;With these updates, we hope to create a more true-to-life experience, though it&amp;#x27;s worth noting that no two people experience anything we simulate the same way. The simulators are indicative and you should use them for broad-strokes analysis, not for specific styling tweaks.&lt;/p&gt;&lt;h3 id=&quot;focused-element-in-focus-order-outline&quot;&gt;Focused element in focus order outline&lt;/h3&gt;&lt;video src=&quot;static/focus-b0f225efe8c0cef0087851da3f188e4d.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;The &lt;a href=&quot;/docs/debug-tools/#track-focus&quot;&gt;Track Focus debug tool&lt;/a&gt; can be used to highlight the element that is currently focused in a pane, but if you don&amp;#x27;t want to turn that debug tool on, we now also highlight the focused elements in the &lt;a href=&quot;/docs/outline-panel/#focus-order-tab-order&quot;&gt;focus order outline panel&lt;/a&gt; and in the focus order overlay provided by it. Thanks &lt;a href=&quot;https://yatil.net&quot;&gt;Eric&lt;/a&gt; for requesting this feature!&lt;/p&gt;&lt;h3 id=&quot;target-size-debug-tool-wcag-22-support&quot;&gt;Target size debug tool WCAG 2.2 support&lt;/h3&gt;&lt;p&gt;This request by &lt;a href=&quot;https://twitter.com/toegonline&quot;&gt;Ronny&lt;/a&gt; was made all the way back in June but it took me a while to get around to it. One of the new success criteria in WCAG 2.2 is a specification for minimum sizing for clickable elements (&amp;quot;targets&amp;quot;).&lt;/p&gt;&lt;video src=&quot;static/target-7c6e8f3f1929abf664ba3c19d44480c7.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;Polypane already included a &amp;quot;Target size&amp;quot; debug tool that tested using 48 by 48 pixels, following Google&amp;#x27;s &amp;#x27;mobile friendly&amp;#x27; algorithm. Now you can choose whether to use the WCAG 2.2 version (24px), Apple HIG (44px) or Google&amp;#x27;s Mobile Friendly heuristic (48px with some allowed overlap). Thanks Ronny!&lt;/p&gt;&lt;h3 id=&quot;contrast-checker-debug-tool&quot;&gt;Contrast Checker debug tool&lt;/h3&gt;&lt;p&gt;We improved a bunch of stuff to the Contrast Checker debug tool. This started after we noticed there sometimes was a 0.01 difference in the calculated contrast ratio that our debug tool and our new color picker gave us.&lt;/p&gt;&lt;h4 id=&quot;getting-it-001-more-correct&quot;&gt;Getting it 0.01 more correct&lt;/h4&gt;&lt;p&gt;After investigation, it turned out that in some situations we were incorrectly handling opacity on elements. We updated the algorithm we used to calculate accurate color contrast, and now there is no longer a difference between picking colors on screen and having Polypane generate them from your CSS, even in complex situations with many layers of transparency.&lt;/p&gt;&lt;h4 id=&quot;choosing-between-aa-and-aaa&quot;&gt;Choosing between AA and AAA&lt;/h4&gt;&lt;p&gt;You can now choose if you want to test against AA or AAA color contrast, bringing it in line with our &lt;a href=&quot;/color-contrast/&quot;&gt;online color contrast tester&lt;/a&gt;.&lt;/p&gt;&lt;h4 id=&quot;click-to-apply&quot;&gt;Click to apply&lt;/h4&gt;&lt;p&gt;When Polypane finds contrast issues, we automatically calculate the closest color that does have enough contrast with the background. In previous releases, you could hover the suggestion to preview it and click the color to copy it to your clipboard.&lt;/p&gt;&lt;video src=&quot;static/contrast-1bec7b95bd5cd7bde9cb8cca5265f923.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;In Polypane 11, clicking now copies and applies the suggestion, making it easy for you to head over to the &lt;a href=&quot;/docs/elements-panel/&quot;&gt;elements inspector&lt;/a&gt; and tweaking the color to your liking.&lt;/p&gt;&lt;h3 id=&quot;detect-small-text-debug-tool&quot;&gt;Detect small text debug tool&lt;/h3&gt;&lt;img src=&quot;data:image/png;base64,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&quot; class=&quot;imgshadow&quot; alt=&quot;A warning shown for small text with a &amp;#x27;increase&amp;#x27; button.&quot;/&gt;&lt;p&gt;Like the Contrast Checker tool, the Detect small text debug tool now applies the suggested font size with the click of a button, letting you see the effect of a font change instantly.&lt;/p&gt;&lt;h2 id=&quot;color-picker-updates&quot;&gt;Color picker updates&lt;/h2&gt;&lt;p&gt;We added three new features to our &lt;a href=&quot;/docs/color-picker/&quot;&gt;color picker&lt;/a&gt;:&lt;/p&gt;&lt;h3 id=&quot;test-non-text-contrast&quot;&gt;Test non-text contrast&lt;/h3&gt;&lt;p&gt;Alongside Small text and Large text, you can now also check against the WCAG guideline for non-text contrast (3:1). Thanks Eric for requesting it!&lt;/p&gt;&lt;h3 id=&quot;visible-suggested-color&quot;&gt;Visible suggested color&lt;/h3&gt;&lt;p&gt;Instead of only showing the overlaid square, the color suggestion is now also shown as text below the contrast ratio. Click it to quickly copy the suggestion to your clipboard.&lt;/p&gt;&lt;h3 id=&quot;export-swatches&quot;&gt;Export swatches&lt;/h3&gt;&lt;p&gt;Click the new screenshot button in the color picker to export a swatch image:&lt;/p&gt;&lt;img src=&quot;static/swatch-c1b8b8d06930d845b368f34929dc1afb.png&quot; class=&quot;imgshadow&quot; style=&quot;border-radius:1em&quot; alt=&quot;Color Swatch #a1779d on #2f4853 with contrast ratio 2.591 and suggestion #aa84a6&quot;/&gt;&lt;p&gt;We hope this will make it easier to communicate color changes across your team or in your audits. Additionally, the file name contains a textual description of the image that you can use as alt text when distributing the image. This was another great request by Eric.&lt;/p&gt;&lt;h2 id=&quot;screenshot-updates&quot;&gt;Screenshot updates&lt;/h2&gt;&lt;p&gt;The screenshotting functionality has received a number of quality-of-life improvements.&lt;/p&gt;&lt;h3 id=&quot;dimensions-are-back-in-the-overview-screenshot&quot;&gt;Dimensions are back in the overview screenshot&lt;/h3&gt;&lt;p&gt;When creating the new fast overview screenshot we left out the pane dimensions, showing just the title for each pane. We&amp;#x27;ve re-activated them:&lt;/p&gt;&lt;img src=&quot;static/overview-f2017b2fd35b55e05299b02354b46a16.png&quot; class=&quot;imgshadow&quot; alt=&quot;Three pane overview with the dimensions shown.&quot;/&gt;&lt;h3 id=&quot;path-tool&quot;&gt;Path tool&lt;/h3&gt;&lt;p&gt;The screenshot editor (powered by &lt;a href=&quot;https://pqina.nl/pintura/?aff=xLXrx&amp;amp;ref=polypane&quot;&gt;Pintura&lt;/a&gt;) has been updated to the latest version and now includes a new &amp;quot;path&amp;quot; tool that you can use to draw polygons on top of your image.&lt;/p&gt;&lt;video src=&quot;static/path-635616340fccf33699ce19fc75fdab4f.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;h3 id=&quot;set-preferred-action-for-screenshots&quot;&gt;Set preferred action for screenshots&lt;/h3&gt;&lt;img src=&quot;static/screenshot-options-ed28ff33f55f6881c87e9612b94896f1.png&quot; alt=&quot;Options menu with the screenshot part highlighred.&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem;css-float:right;max-width:100%&quot;/&gt;&lt;p&gt;Instead of always opening the screenshot editor, you can now select what you want to do when creating a screenshot: open the editor, save it directly to disk, or copy it to clipboard.&lt;/p&gt;&lt;p&gt;Depending on what you make screenshots for this really speeds up your workflow. Find the option in the settings menu.&lt;/p&gt;&lt;h3 id=&quot;new-ui-for-selecting-element-screenshots&quot;&gt;New UI for selecting Element screenshots.&lt;/h3&gt;&lt;p&gt;When selecting elements on a page for the &lt;a href=&quot;/docs/making-screenshots/#element-screenshots&quot;&gt;Element Screenshot&lt;/a&gt; (or &lt;a href=&quot;/docs/live-css/&quot;&gt;Live CSS&lt;/a&gt; panel) we now dim the rest of the page, rather than draw a blue line around an element. This makes it easier to see which element you&amp;#x27;re selecting.&lt;/p&gt;&lt;video src=&quot;static/inspect-e9450112d5b4534d76ae64ca569f1b3f.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;h2 id=&quot;elements-inspector&quot;&gt;Elements inspector&lt;/h2&gt;&lt;p&gt;We&amp;#x27;re continuing to refine the &lt;a href=&quot;/docs/elements-panel/&quot;&gt;Elements inspector&lt;/a&gt;, which lets you inspect and edit elements in all panes at the same time. This time, we&amp;#x27;ve updated the box model visuals, made it easier to get element information and fixed some annoying bugs.&lt;/p&gt;&lt;h3 id=&quot;updated-box-model&quot;&gt;Updated box model&lt;/h3&gt;&lt;p&gt;This came about when &lt;a href=&quot;https://meijer.ws/&quot;&gt;Stephan&lt;/a&gt; asked if the box model visualization in browsers could be more useful and show more information about the display of the element. That&amp;#x27;s exactly the type of stuff we want to do with Polypane, so we quickly came up with a way to show the border-radius and if an element had a box shadow inside the box model:&lt;/p&gt;&lt;img src=&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARsAAADUCAIAAAAjhhCjAAAj6UlEQVR42u2deVRT59b/+8d97R1+v/tru95VX1ZZohbfiy0qsbSC16Gk0mqutUprralDNVaKiFNEhSgiRMYAkoIDkwyGKYAiBAXEISAoMgfj1GLrUKxYUxGNSu/1t5MnhAQCJCFAhr3XXqznnJxMz96f7P18c3J45SUaGprh7BWcAjQ0JAoNDYlCQ0Oi0NDQkCg0NCQKDc3SiHrx4gX8ffjw4Y9dRvbjpkE2nz59SsZ3797FTePZbGlpgTEMDEzUgwcPWltb8RMIzQINaskff/xhSKIeP35MkEVDs1iDMtXR0WEYogDQf//73zinaBZeqbSpK6hMoKFpa7CmMgxRypW0QezYsWNCoRAGDQ0NDx8+VN1jWLtx40ZKSorGm4b6qdEs1kaAKGhGnz17BgNId/LIyj1atqCDJ0q/p0ZDG3KiIiMjjx8/Dn9DQkJu374NeyQSSUREhL+/f1RUVHt7O+z54Ycf2Gz2nj174EjYFAgEFy5cuHTpEpPJhMOgXJA9cNP169cDAwP9/PzS09PJyg0OOHLkSFBQUFJSEmz+8ssv27Zt6/ECsrOz4QAYnzlzZteuXXAXUnaURN28eRMOCAgISExMhIft/dTwvPHx8eQB09LS6uvrybvYvXt3dHT0o0ePjCVcotyEKglm7UiZNqVlsOsoSOiTJ0/CAHAKDQ2FwcGDB2tra2FQVVUFGQyDffv23b9/HwbFxcWQ0Ep+lIWC7IGbgIe2tjZyU0VFBQw8PT0fPHgAg9jYWOhi//Of//QQ8eEFVFdXw+DOnTtABRzQ2dnJ4XCgqVMSBQ9F1pQAZ1NTU++nhnsBxnBHGMBrgDUoPBT5gBCJRMCYkURUmk6nhrVgZps5Ub/++isZQxWCXGSxWGQTstPX1xcGpIgBYFKpVJnEvdMaMhhoVL50UjR27txJ9sCDEFB7vwCyIjp16hQ8dbDcAI9r164piXr+/DncNz8/H2pOZWVl76eGQUZGRnNzM+wkxXDr1q3koaC4xcTEDEe4OltyN9MoDhSKE41VJPvUEAdR6emyGXsp4bm5clpuJNDt/+c1Wwo1AN6CtG4/3RkOdnBmJImlmOymRVT/Xd+9e/fIGPIYiFIyoCQK7NatWwUFBfDx//TpU52Igrv0IKrHOkqVKDCN6ygoWUVFRfCYR48ePX/+vEai4GCoYLm5uY2NjbC5Y8eO4Q7XbQGHWyZr6W7H0ICf3kSp1qh6NnUeR0aStI7tQuVcwWw3o3XUsWPHyGIJllKk6yNJCcsV0vXl5OSQkzjCw8Oh+1ItC9BTqXZ9UEMIHpDcpOvrQZTGdRS5C0ALa7Bnz57B4wCNT548gZeUnJxMiid0dLAflkaEqB5PTfjfu3cvVCQ4kjSZFy9eJF0fNKvDEwzJlTIel83yoI6zZ9V19kdUK5fmFqdYULVEUmlxuLgyL2WCzWZDNiuVCdgZEBAAyyeiTEC/B2BAvkKJUE3imzdvQhGDVZCqMgEP5e/vr1QmehClcR1FiAI7ffo0HA9YEgYAKtgUCoUAJ1ROAD4uLo4Q1fupwbKysgiBL+WnLxJ9JSwsjCzkhnyNVORJcWUmHC+ru5JAd2JVqhLVlqCBqKQuorhAFJ4gZkbrKGVCow3GABIqV0aLtJxJsZcR1ZpEo3hXAlKSPPq4GXKisunOu+q6ur4YMVRTqZjjil0fEoWmASkB02XiREdnmgeD5igj6qWkjOUKe6huPp5UFxlRL9sEnk7jKJvLpEplwpGKyoRZKRNoaGhIFBoaEoWGZgnrKDQ0JAqJQkMbUaKw60NDw3UUGpplEPVDc03nTxX+G5a/0mUvxPnguImbBty0HfsWpNmzBz+Z+TqKyWTSZjuSd46OPtQe6r0KUs5sieLxeLPet39++RhGGn14HJINUg4SzzyViTs1BW3VGRhm9OH0q8WHsg6Fmec66sWVAgww+gj4lQLzJEq5dkRHH06f/cEk81xHIVHoI+KQeEiUnh62bdVPZw+bfBKIovZMsx47ZvTYMa+/9urfFoaky3fGZX892WGCtd2UWdF5fOTEhIky2Dpq6OfuXhXPnLTE+wk0p+mrmkTycdQsp5WB98X57YWr5s10v46oaO2lyWwzVSb6fs/h2xk53/tChYkL9CpOCgz1XhW89ZvHDTlwkzA91G893W/90pOJAbCZf3BXYtDGYObKG6XxwA8MdnvRCw7t9veik8e5f4EHx6SFMzk7GHDHq8WHTDUVzjC/sndOLVVsthcGVgvl4/pAj6mLhSJERQe3OGUCSKjKjoABd9d3JclsGPC5PpXZnOeX8/NiWYDWs+ZjgEd7PR9oSQ7dTO71vd93NUejYXAiMQCQUyXqcIjsmB/LEiN9vzXRJCj+evRrdrN8wmPb1fdf3+vstDq0HTlBZaJ/on6t4sEAaktTYSwMylKDSuVoPajOOHskJHPf9o0rF9yrPAK0VGSGk3v5uC8mg99rs3d5qhFVnhEm/4Ivn5Bmmqsp/v3S0OhPxi8MSVbubM9Y5jJ1YfFF5ASViYGIAhJ6EAXFSlKbvXPdEmj8Wk4nhm9f3apOFMtjiSLP6nN6EKU8huw3PZZqusYZix0W7GhX9oFTnA+dREhQmdBiHaWRqNvClOid7qRSbfrmsx5EQUcnkh98Oi3YrIgqdXeZslAoK0T8pu3vOXlEyXbWhPpMn+xzJB0JQWVCf6JgkBK2BcrUPtbaoC0rexB1tyKVvXm5vxcd1lo91lGmTRSAFEJzmWBtN97aaYF7tbxeNW0a/+e/vi6X1EePneCajY0fKhMG/z7qemm8pCZLrkAkRPqswbxBR2ViUN5ctD9w03LwsG2rbgmTMXXQUZlAR0dlwojPmUBHR2VCK5eCi/I7RHkdTXkdDegW4xBuUR6EXorKhAG7PqlINrkPa/lt1ZmtVZl3K9PvVPDQzd4h0BBuCDqEHhIA0gCVCQMQBfP4qI5/ryrzhzOpohOJtcfjLh49WHX0ALrZOwQawg1Bh9BDAkAa6AcVKhM9cYKPK9HJxNAda50pdq+O+q9X0CzGINwQdAg9JACkgX5QoTLRvXaCWg8fTvAptebLee/YWi+YQ5nm8PZU+7H9+x83ktBNwgcMJYQbgg6hhwSANIBkkLV/qEzoSZQoHxpoqPjwEQVzSnlnTCbXo73pICai5TiEG4IOoYcEgDSAZICUkIpQmdCr6+sQ5cGqFD6ZoO7DBxXMLGaYZTqEHhIA0gCSAVKiQ8fGD5WJbqJaqzJhbQrNNFR/rE6WXKkgASANIBkgJXQlCpWJLqKa8u5Wpl88ehDuiKsji3L3pR/+XBHRY8UFaQDJACkBiYHKhD7rKFiD3j3Pqzp6AImyKC9O2RrBWtpbw4A0gGSAlIDEQGVCT6LuVAxAVGIo48bpUD3C1nxy75EodxPIsFrvAOqYieOtHD5eUlFr/jhJr8QvXzRd0rC/L6IgJXQlCpUJJErph0pXjZm3JwzGN/ZMdlrDMnuiksPXZER/B4NlC6cbiihUJnQjKne/V8DmRbs3LBSXBMGe51cTICq71i8I2OxGYDsevykpjBGybfGPZ8MaiwL9NnwGN/FjPQlRv9XFhPss8fP6LGoX/WF9LOyBcXzwqhTOtyOfYVdZWybNLGiWjxs9VzvOr7lqzjg9qI1Z4fZPiCCMF33ynqGIQmVCN6KAFhj8cmGf77pPX1xLLDuyjSdH5W5VFHDVeT0RiCJ4PLua4LtuPoSt83rS/oAVhKhDe7/5qVy2CG4QBJDDPJd/9OslrlEkWePapY5uIkLRVX9fByd+szkTVZCwac4/3/2XyxTwD6aMX7NktnkSZeTrqMvFe8k4cufSO5VRMXuW36qIVO4BroCo8zk7YfOmkHMgcAW5qa5gDyFqC2Pu3q1fyJz5OXf3Mtizc/0CY0kyCyNK1Q1Yo1CZ0I0oWBEp+GHJ+AGibp9XEBW1k96DKChN5Kba4/6EqO3utB6PaURE9ej6HMy86xsiolCZUCPq/EBEgffo+jK562DPvYvRsCIiXR8hCro+H4/5bTXfQ9cHxYoQFeO/vCp3FwwaBYEnDjONi6gbh0pXqCkTHRZ8BiCkwXlUJgZJ1K0KXsVAROXHbQzc4ua34TPS/hFlYveGhewtnyuVCUIUeH1hwC6vBXDTsUMbCFFttTJlAo4P2f7lffnyyZiISvqj2tt3ttU4GysHqpslqOf9EwXJcAuVicEQ9TMQlYvf8KJ3EZV74GdUJvReRz0Cosp5FTkyojCl0GVE5RyAlHiEyoT+RAmRKHR1ooQ6E4XKhOLnho/qkCh0TUTV6fajQ1QmuoiqRaLQNRFVqxtRqEzIryXWRVQ5EoXeRVS5ClFSVCZ0vTpfF1H7kSj0LqL2K4jS5Qp+qEyoESXMiR0kUY2ngq6JuOs85ymvsFPbGAk+mM33HN8mm3GJ64xnc637x2QTBsazCa/t1VF/mvn+/57O8hkkUZAMehBl6crEcxWifho0UZsZn8ydSyEYoI+U1zRE5At8hZVBty7HDpKon1SIeo7KhPYFihDVIjwyGKLSItfCp3hNA+a0sfg+LkPvK/AQoiAlFERpXaYsXZlQJypNyI/Rm6jKM+xzFUGYx8bjucd2QPunP1H8GEgJkydqmNdR6kSlCrP1J6oek9j42j9YU+lPVDYQlaorUZauTBiQKKWQgG5UPsxEWboyoSTqdzlR55AoJKormufkRP2uI1GoTCiIekiIyhp5onKObQ8KWa6651J9hLvHJzCI2Lc64fD6Icy/Co91s98aN270P6gLDleYA06DiSYkA6TEQ1NfR0mlUhMlylBJ0A9RFRdCqi6FDVn+hR1c/tY/WTthfJw1cfI3G5AocyBqpNZRD2tzW86lnh0aorZ4fxbFZWzZ+tmGTfNPlOyGPQUndq7f8K/v1s312/MVAAN7svO2ATbr1tPCI1cRosrOBcLxHp7zuLHfEqKiY75NObLxWIGv784vtvt8DnePS/SE/dV1HD//JWu/+2Tn7i83bVlQXhWsT/7VbVj27jRutXxc9c1Cypz0OosmCpIBUgISA5UJbYl6rkZUziCJ6qfrA6Ji9q+FQVGJH0ACg8Rkr5On/GHADvo6K8cbkGB8O+dsxV7Y47tzMSFq2w63rFxvGByMX9eDKNiEu1ysDYd71TREHIjzCA1fCQcUntj1+WJnPYmqWjaXQsshFNUxGZOnhldb9Dqqi6gcJVHPTVGZuHv37rB1fcNJ1KkzAWQMhQVIuFATzsvcEhnNgMJyOHWDoNiPtWsxOSCDv5UQBbSQPZXVoT2I2hO4lNwEFQlaQR/WFydLdysfH4kaQaIsWpkYTqJKTu8h42/dPwaiNjMXfL9/7XEBK2LfakIUlCZyQHo2kxC1eo2CqPMXexIVwKYriGLKejzoAEu7Hh/6RsN0fZOx69OHKItWJgxLVP/rKCAHBvmFLK+N80klgbYNGrbNWz8DomAM/JwpZ8NNUKyUXV8mf2tX1ze3H6KgpYyMlj1+8Sn/L76cridRjWEHl6opE1WNSJTpEzWc6ygZTpdViDo7tMoEVA8Pz3mwlII9SSlea9a6Al07/b4EomBPZo43dICeXjQ4khB16mzA+g3/Wrd+HlQzuGM/REHRAw7h7vAX7gJ9oJ4peM6DMWP0W2NG/2M2DdVzGVFnVYi6rJU4YdHKhDpR/EES1X/Xd6Z879DlDTz4Cfk6qupSGIBKxEN0A6yjzir+caj2RFm0MmHYGjWiRLGZ2xZCDYQClZG9FSkyKFG61SiLViaGrUahm3LXp1uNsmhlwrBEYfoiUahMIFFIlIGJQmUCuz5cR6EygesodGMlyvSUCemNstykmJi43LIbUiQK3ZTWUW11uftjEkpaIHGlra2STiNQJlri3Cgz6KywmJhIFsOF4hbXgsoEuokQ1cJxdaZHxjBdqex6qTiMSvEqk4ywMtFZ5unEEDzu2nwMm55lnWaiTKQXhMWXFs5bvkp5sb7wwrPg/W+Ot59CNr8L3mfYTVf6N2QTBoPchAckm/AU2m9OmTETJuTYmQNmokx0Chgu7LrOl9LjDDduy8vOSiYkc+fIKhOdcoSUNUxqXEQNputbtuJDh1kfEUjQVX3Wwi9hcsxCmZCUeTPYp1ulVzhuXmXS2zz6DGZl50grE2IujeLqyd6fwIvjeLpSaFyxGayj9gYvg4/nsIIzyE9vh2mByYEpMnllorOM6Thxou24ifbwd+JEJzdWUatRKBMSkYDH5XC4PIFIYh7KRGR2qn96PsLTl/ul5fpG63khREdHWzxnom9lorMuJkygglELzyemrnMgokRRe6ZZjx0zeuyY11979W8LQ9LlO+Oyv57sMMHabsqsSD5/YKJqvQOoYyaOt3L4eElf/6BW72uhRAiwOg3gMEX6za3e0ewmqjrM/4P+8ic6j68tURKxICmGE8RmEw/LFY+gMiEpT+AE0Sl2bqwwDkfubB83ygy2WOt11P0EmtP0VU0i+ThqltPKwPvifEnhqnkz3a8MQNSh0lVq/0Rda6K0uhaKUmYYpAdwPCbZ2bxpM8H28xA/lf3BgYtsaZHBZDM/fu5kmzesrN6weuMvo/7PpC2F2j74jn+9KbuX1Ruvj/qTzfJN+X09Yx7j86lvWtu8aTdncWyJoYh6e5KD3nOrXzR716h78bRpvfKnXZ4/17U6Z6KF4zqRupmTkMrjpROvbB3BcyZkzV4Sk+pAj1G+oGyBuE3rcybOML+yd04tVWy2FwZWC+VdX32gx9TFZxr6Jeoqa8ukmQXN8nGj52rH+TVXNcQAGgz9roViGKJkqDgtSoRxIYP27nT/ku79jrMWJ/ciJHCRDcXDO199f3pegGJPoV+aJh7yUxY5TvjAr7CvZwzYMectagDQFcxl2E728DYQURo6au3mNi5xnX7R7EnUKeaSd52T1fNHNpbnj1CkhTLRKWC49lkARkqZkLbelOh3zkTx16Nfs5vlEx7brr6OurLX2Wl1qKT/GtW4dqmjm4jM+1V/XwcnfrN26yjtrtxgoBqVtykohRQiH3enSZsUxcdv0yy7lSk9D07eSZkwi57Y80G83Z1sPw0JKCxZv9LJdllscM+nKFn/1VSbxcr9vZ+xZMWcCbM5ilsXfzB1fuKQEaX1VTH0jqYqUSfosvzZrp4/4Nfl+dOu1TkTksogBitPLHkslRLv96vXYVEmOstYLs7OTiruwirr1E6ZEPHvl4ZGfzJ+YUhy93+zzljmMnVhUeVAysQQE2XgVUdO7OzJXUUpK2T65CXuObKMp3h3N3jun1r9Zfycj7xTejFT6P75VBvKVJtPAvx6P3Kat92frWw/3eie3NczZixydFqUpnyWd2eHGeZNfRe8T7+51aBM6EWUtIF/ryQ0Sj1/2uX5U3xRO2VCl+wdvnMmZFwrEJeIs1mMoErpgDUKWKrpesMZix0W7GhX9oFTnA+d1ELr69EnOGjuE8j/KdPjWigGJSqPTn130qYMsrnpq6mULXmyGrJqqtqSKb8kIDF20YwJk+S3qrrPljlv/beN3ZresMmXZDl53n5LbN9Zvj5f4zNmLKIMCVHg+s2t3tFUUSbS713s0vo05Y/eWp/kZqvUuH7N0Slmu3oKBlQmSt1dpiwUyj5I+E3b33PyiJLtrAn1mT7Z50i6dur5odIVamvZDu2VCS2uhWIoZULWlS2barMwMqBrBfXRhDf+L5ET/j7qT6/bTPcrkbGU03U8ZzmseVTJ8fNfZOPosSk9ZfHsdyneGeqFqKTryEL6jHfnxmp6Ruj6qEPS9WlWJrSbW/2i2U1UAePDyQvPQiNzmV/fK390+zVHm1iQ3aUCpMbQHajMpAG+BBpqolor05UvKCFmM3Wia0zLwMoEvymE5jLB2m68tdMC92p5vWraNP7Pf31dLomOHjvBNaNyIPW82tt3ttU4GysHqltfeqsGZUK7a6EYiig/7zk2s7198jXc1F2jEjfa2i1ZnyXLfu81TjZfxavJFWEh8pvOhueluAepElXi/umESV7yPWkh0+3m0NM1P2OAt6oywRhCZUK7udWgTGgXTZWuL70+iPahrbXdOOtpfeRP9kVtlAkxewbFzYfNUYjVLDc7Cj2Ik1AuGUFlQpwb1qXlB3E4SQKxxBy+4TUMUTkBlL+P+st/yyuSlY3tynjNRAFIWxbZ2ti8aW1jQ924KUfrx0+PnOs8QSaLj3ea7ZfX9zPmrVg49U0rqzft5iziGkw9H8wZXkZzzkRdjA9PpQBIBGF9fpuK15kYFFH4De+A7hm6zzzOmVCc8bN/4GZvmJSJ1iKW2wyK7LQo+4nj4K8jU1utb+iJ0qBMaOcxBfyg3GLEpi8PyT8VX1poBr+PEu93k52Vyk1I4LIZrhS3/eKRvs5EZyVzBp13W1rm5ca5Im09zWb49PkLExP6NUdI+Dew8g49fhrh0XimLExO9AEv0/81h/ovJx4LPB09y0b61xwChpPsBPgWrhvjuBQaU7YLQ2A0v+bQrExo/WuOie87Iz+9qxPgNJhfc2hWJkbk1xyEqO5f9wkYw0NUv8qEpMyLQo0US+vZ1HnMmEiGsyunxVx+FZ+Y4Qe9jdt3Xgb/6Z42mwP+tHH4fwcJayeYEL2rkxFeZ0Ic50ZxYch+gR7Gos+guMUNS9c30HdQklbZ12LSlqIEDpdX14bXmUA3JWVCdpWUuIGvkvISr4A5GGUCHa+AaRznTBjZ9fowfZEovAKmsSgT6EPkRqRMjBRReAVMdLwCJp4zgUShMoH/mwOVCVxHoTKBysTQuhbXQkGiUJlAZULr/2ytxbVQUJlAZQLXUdq5dtdCQWUClQkkSjvX+looqEygMoHKhIUShcoEKhNG0/VNNoeuD5UJVCZGVJnQ4looqEygMoHrKK1di2uhoDKBygQShedMoDKBygQ6KhOoTKAjUahMGIwoZ+d/1DREYBIblSckeaIyYarKxMz3/zdf4ItJbDx+sTb8moiLyoSpKhNpkWuXrZiNeWwkDv2Co+PbRclMVCZMVZkAv3U5FmIpKN6F7d+IVyfAaTPjE71DicrEyK+jiF87z4H279VRf3rP8W3yDSO5VtYwb5JFObGR3YTXQzaJFjoMm7B2gmZPoG91QmXCuIhCNw9HZcIouj50JAqVCSQKHZWJISEqB4lC10RUDioTuI5CH7EahcoE1ih0Q9Yoi1YmnhOolESdUxA11X6shWZSrXcAdczE8VYOHy/p6x/UWoJDAiiIOqdClDxhUJlAorT3Q6Wr1P6JOhKlB1EWrUwgUWp+lbVl0syCZvm40XO14/yaq0iU6RM1nOsoJErNG9cudXQTEYqu+vs6OPGbkSidibJoZeKFGlG5SBQSpYmoXCVRL1CZ0IWovBZh6jns+pRdn4Old32QDJASkBg6EWXRygQS1VOZWKGmTHTcQKJ0JsqilQlVon4nRGVbtnpe7e0722qcjZUD1Q3Vc0gGSInfTZ2okVpHPZITJbRwotBViBLKiXqkI1GoTHQTdVOYJsyORaLQu4iKhZTQlShUJrqIqs+7WX6kIgeJQlcQBckAKQGJgcqEXkQ15P1ckVF19MCro/5rmsPb7U0HMbEs0yH0kACQBpAMkBKQGKhM6ECU8ktemLhfqjJrBfHOFLsFcyiZXA/MLct0CD0kAKQBJAOkhIIo7b7eRWWiu0x1NOS3VfOvnEoO3rb2HVtryjtjYGaxUlladYKgQ+ghASANIBkgJSAxdFpEWboy0U2UXJy4VZFRWxjHWDwP5hQ+qKD6Q0vdv2MimtDqqH+HcEPQIfSQAJAGkAyQEh06yhKWrkwoiFKUqbwHl/gtwtSa4/FB29ZA3Ydm+hU0izEINwQdQg8JAGkAydDR1fJpT5SlKxM99AmYwbZLmbeEvMvFh6uPxwlzDpzOii1OjzmZ9n1RKrcwJfp4cvTRpH05Cfv4CVHZh6KyDkVlHoxMPxDBOxCRBr4/InV/REpMRHK3c4gfRh8yT+52xbRDCCAQEI40eWggQBAmCBaEDAIH4YMgQighoBBWCC6EGAIN4YagQ+ghASANOhp01s1RmVAhqrlb9HtYy79XlXmrgvfjWd71sjTxqZTLJSlNxckNJ5Lrig7XCpKqC5IuHE+sPJZ4/miCMC9BmBt/Lif+DF/mp/lxZdlxZVlxpzK7vRR9iF11tmHyIQQQCBIRCA0ECMIEwYKQQeAgfBBECCUEFMIKwYUQQ6Ah3BB0CD0kQLfE12ziRA3/OqpHmZJBJcp7VJ/3oJbfBmhdALr4dyuzb1dk3irPvHku88dzmTfOpl87w7taxhOf4jWX8kQlR5pKjjSeTGuQe73MU+vkXqv0E+hD5l2TTOa8XuaKWEBQIDQQIAgTBAtCBoGD8EEQIZQQUAgrBBdCDIGGcEPQIfSQAMpkkOqYSKhMaChTHTLPg6L/SO4Pa2XeVptzv5p/r5p/t4p/p4p/q5L/c0XWTxWZLeWZPwozfwDMzmVePyv3M5nXzmRc7ctPoxvI+5hhmHwIAYkFBAVCAwGCMEGwIGQQOAgfBBFCCQGFsJL4klhD0GWhV+LUrDNRqExoLlN9QJXXJoeKcAV+G9A6n03QAr9ZLouczIWyKGr2c+gG8j5muEWoiMJNOUUKkM5n365SRI1EsE2GU15/OIn0wQmVCQ2iXxdUeWpQ1cum/jd5sVJy1XpREaQ7crpuV8pqFwSPOAQSfZhdOfkQCAjH7SpFRQKHYKmwlPMbwam+B05q/Z4eRKEy0ef1xnpDpSxWv5F6dYmvREsJ2C8XZH63ynS8Imz7e2+NsX5zjPVrfx/1N5pfsnxnbPxie/vxb02wn7E3Nd2U3o7cSRSUCHWDdElWl35TL02acbqsD06oTAzQ+3W3f03qXNWpo1Wb21YjK1xt8tYc/Fe53zMpv/b9XMdpK8rlTdG14BmO9N3Xqvk/Z6/4aDqj2nTeBZl5EgUSEVloIEAqIEH41Fhq6tXsifTECZUJXaCSF6t2Fa5U0VL6b3J/IPc2E/KizZ+/43SwQLF5J3fP6RL5uGoPw+GLomqTeSNk5n9T5UcTSI/koVSWJkPhhMqEtu2fGleNavWqh0vA6+Wk1WngzWj92Fej/98/ZjL3clvV99fvdnp/RXCribwL5bRDCCR9x0gGUmMfLF0eLE6oTGgrVPTkqqtqEX9k6l6bdasomOM6bgE7Sbnz11T6LMqCgnKTf3fKMKnFTtQzuPpJEahM6A5Vc6+p742W0psURcxkvDbrbmXXOPWLKfO3PSDj4s1fTnaKLTCp96L0RuXqqLdriCb53mnwOKEyMViulP5EwRj4sT4Caaxe/O3syQvKACpRVq331GnuEbKdF4O3OU/alpJmYu9FzY+RiDwR9Rc4A7KEyoReXIn7DY9JOr8+iPahrbXdOOtpn7pfuCjbWb9x/J//+vrYMaNlbuuaWWl+77o7oAZPFVQm9OJKbI5JZgkuHkKWUJnQ35/3oKsvv4w+jK5FRJ4PZVagMjFUsCldij6MrjrzIxV981UmrhS8GLlpRbdYL0sLNk9l4k5Nwa1zyRhg9OH0J015nT9VmKcywePxZn9g/6z5KIYZfdgcUq70pMA8lQkwJpO5hDYLw4w+PNUJcPrjXrOhstfolAlirS3NUIU3r3IjF7spTWbDm5/1vj1u4qYBN2HtBGlmqOpkpMoEGprZGxKFhqatadOsDasygYZm0maMygQaGhJlYGUCDc1ETZtmDddRaGiGNCTKpEyUm1AlwWkYKUNlwuwimk6nhrXgPJj8OgptOKyzJXczjeJAoTjRWEWtsEMcRKWnyz8UJTw3V07LjQS6/f+8ZkuhBlQCXHX76c5wsIMzI0mMy1wTIwqVieGw2wIOt0zW0t2OoQE/vYlSrVH1bOo8jowkaR3bhcq5gtOHygRaL5NcKeNx2SwP6jh7Vl1nf0S1cmlucYoFVUsklRaHiytUJtB6NAJFnhRXZsLxsrorCXQnVqUqUW0JGohK6iKKC0S14gSiMoGmZgAJlSujRVrOpNjLiGpNolG8KyGGkjz6uBlyorLpzrvqurq+GHEn7BJzXLHrQ2UCTQNSAqbLxImOzjQPBs1RRtRLSRnLFfZQ3Xw8qS4yol62CTydxlE2l0mVyoQjFZUJVCbQ0FCZQENDQ2UCDc0YlYm2tjacTTS0lpYWwxCFhob24sULg62j/vjjDyxTaBZuz5496+joMFiNevDgAQAKaOHMollgdQKctDxYh67v8ePH8NAv5UIFMbIfN3FTm82nT5+SMemdTGUT1k4wfvLkieGJQkNDQ6LQ0JAoNDQkCg0NDYlCQ0Oi0NCQKDQ0JAoNDU1n+/+r8NOyCv8EEgAAAABJRU5ErkJggg==&quot; class=&quot;imgshadow&quot; alt=&quot;Box model showing border radius&quot;/&gt;&lt;p&gt;Each border with a radius has a thickened line, and if all border radii are the same their value is shown in the top right, otherwise each border radius is shown in the corner. Lastly, if an element has an explicit overflow, like &lt;code class=&quot;language-text&quot;&gt;auto&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;scroll&lt;/code&gt;, that&amp;#x27;s shown in the bottom right:&lt;/p&gt;&lt;img src=&quot;data:image/png;base64,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&quot; class=&quot;imgshadow&quot; alt=&quot;Box model showing overflow info&quot;/&gt;&lt;p&gt;All three of these additions help you get a better idea of what the element looks like. Thanks Stephan! And if you have ideas on how to make the box model visualization more useful, let us now!&lt;/p&gt;&lt;h3 id=&quot;click-to-copy-font-info-and-dimensions&quot;&gt;Click to copy font info and dimensions&lt;/h3&gt;&lt;p&gt;To quickly copy the font declaration and the dimensions of an element you can now click their display in the element panel:&lt;/p&gt;&lt;img src=&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAABhCAIAAAB3ZGCTAAAgRUlEQVR42u2djVNTd7rH7WAz3qY7ynRl7VK33N0O4906TLneeussuyzhhqUQlEUWpEIxIA1gTAnmBULCSwgkkAQOIYSjggXf1ioVtjIuvaWjtDLFXi+Xol505FYuk7XZ0Yw4t3/Afc45Ie+BgMEqPs98hzk5L7/8zjnP+Zznec4vhzWHDx9FoVCoZ0Jr8BCgUCgEFgqFQiGwUCgUAguFQqEQWCgUCoXAQqFQCCwUCoVCYKFQKBQCC4VCIbCClbk4Zu2aNT9Nlln8LZUkrn9hjbcFWhmFQqFWCliWIIBVX5i4Y8eOf2UU8/pLFK9eequw2dGCBc8B6rmSxUIajS0tLYRzjl5vNJnMeGRWEFityuK0f319/duF5kWB5aaavb9+6YU1rF/tlJkcc8xF29ZHbUsrUrYG2rZFVZgjqjEfPWyqK8oWVrU9xt6SrbJ972eV1JsDrUBoK+WqeuKxWyON5XnvZwu1nU/PmV5k3ztrSt7PKlAa8ZJYSQGYSksP/OlPWfv28fPy3s/J2fvhh2IgV11d/YEDwqekkyR5hCBMbW3tIJiAj4/fZnV1bVlZOQgmnjCwLA3CPb/dsiEMsrwXWBv/rdwNWIkCQfI//eylsDDW+l9sy65s89q2uWTHxrA1YZGJZUa3+eLEjSwq5goLf+O3u4U1Jp/bkaqEl1HeRB49XHdw586DdeTjXLRG0e70pPer2wOtUHeQl5wlqHvs1sjmkvT0dwvqLU8RsBbed0vl++lJf5I0IVZWTBpNI6BKqVQ5EQBRVUVFJcwEikmlsuU1Cw0KBCXvv58Pggn4+Jj9BHoKhQcPHZKAYAI+Pk5rCoWypKS0vl5jNneAYAI+Pg62ggaW2SDLS4x5labLup/HJOw5UGvxqGGxXlr/09djdvxuW9SGMFgn/HdlZrfNm/Ni1gGWNm7bK2/2opKp8cAeZ8sbY/4tr0zHtGyRZafEx3sqcb+yoz6fm5Jc2EivQ5TtTonPrCRg5ZyU+F0lov25yRwel5dfDNcm3T5RLcri7eJwMjIFkoK0lPgcZTv9paK8nOREHoebmclX6jqOHm4QpSY4viV5fxPFSm1lwe4MDrSWxl+kNW86NBW9m8J5T1yWl83l8JIzBLImkl5E6iuEmdTm1MwyDewm2fBBZnxivqQVlraIMnicdInOB8pGUU58Qn5x2f6dXB7n3fzSmiZJPtUyd5dA5qC/b8uBe0u215TydybxOIkZ6fsqqX13HD2xDsmyMoJQJSfnvYYGrftMAFZTk14ikaal7ZTJKpbaJuSVfH4BMAVQCGEaCCbgI8yERcvoZHOzoba2DjjV0dHJzIEJ+FhTUweLlpH5SiQyYKhvjFZeLlk2s4IFVln8BjoO+vUf8sobzP6K7mGvZ9QyZSnlH16F+OvnaUq3dRryYn66Yf06CmVhL7/xB3Gbn9hNnJe4hYbdy78rozJE0thQV7ybl5xXWVNTL8rexX1PVqNpaScDAythV3phpVKpLEjnxXP5MqBAqzKHm8JJE4hkSlFuNieBuWjJmsKM+KTc4or6mnIBcCpd1HK4g1CL8rnxu7JE9Q16C2Sg+ckp3IwSiaK6LC+Tw8kVNQVq7ejhDku7ySEL6QBWPGBiv0xWLsxMSolPEzWQRy1qIXxXaq5EoagsyODFJ/EV0ENTdW5SSur+RqJKwE3ILKij0GZpdzZIOoAVz0vNk8hkIqo1TkaWQKko2w+tcfOpOM5/ywF6qz+Yw0nIzDlYraRbS95X347AWmFBNiSTyb1mAq327y8SiT6EOAv8ZkkNQrSyd2+uSlXd2Xn4gw8EEKaBYAI+wkxYBCssqUGtVgfQBGAZDB6wg48wExbBCkvd66KiDyoqFEyDLS2t7oJFAPEVBFbNnpj1a+k0cMvvMgR1HiUnBlgOyoDa+DFha17YmCjzl1EWUYnhmvU7DnjGWa2q4oy4X9PpYdj6N/fUME11NBWn8bJk7RYLgImXWUbQOAgMrCQBsyFcwMnxvByZpV2Wz4nPYChwuKMuP8kVE4GLWEyEXi3JSkzh7qPj3poSbsKughpqabucz0nILtUddW6YfrAlQGukItcZA9KbM8DaLWNKQsay3PiEzOIGsmbfrnjufmU73aaWCugyy6nATV+Wy+Fk7kxJ4b5XTVARUGNB8nyDCXxFBxNh5dKpNFmTvys+qaSGisJaSncx++6/Zf+9JZuKeSncXEduqIeWIWi1ILBWVtnZe9rbO0LYIFzwTFAGkJLLK+hUTg0T8BGmYRGssKQGy8sPAUDdUrkqkDtbISxaat0KEkAIKiFAk0rl0J/c3DwANPQNBFkwsGyFa1hGJZ+37fWX6Chp/Rs7dhZWNbsBa30AYJktrSaLW623MeMXsHRDooQJxwxVBTt3/IoOrMJeev3tnXxn8YuCjndKCNRYCFi7xHpHqV6WScVNhONSb2G+mr7CaWAZFcLMlF0QkSWnZSdzHHGKO7AgDKG+kcPj0KLyxMLGQK0RukaIASnVNerb51PC/DqmhmVRCiBwy6+2SLKpUMuR8ZmUWRATleiZ6RwO7F1GQQ1zm7Xo1c4G9YQjJcyl08ajFJveFapJJoV07Lvflv331lKXnwgcdOwXFXZRLSOwVlAQUOTn80PYoFpdz/AI4ikIrGACUFVaKgRmwUeYSRNNAKsF3yZABPrJTJeUlEI8BYIJ5y4sNWmFoBKiPAijlEoVcIqZCZ10RoiwwhN5Smg2lO1NjPkZHQu95faU0D+wLIJ/hjXD3shqnKde8baXYcbP01SOp4Rh3qWrebUTDRUlqZzc0rqmBqVwJyenSNmkN9ERVhIVE1E4IPUQL7iABVFGB82ImhIqwpJDhMXnOEEAUQaXuWhp5OUpjRaqtYIkP8CiNkzILq5rMRoJo7FFryeMJtJ/awFqWPEZEqOrAuWKsBRMHNTgFmGJcjicjFTIQHOUhN9qxSLA8t+y/95ChAWhXK5ST+0XYdS36I3t7SQC60cGFqzg5EVwwBK4A6ujo5OJsx4fWJB5iERlzEyYYHLVZQMLJnS6pvz8fJPJDAJyMQWyJwis+eSuRrg7cXf5YsA6apYkvkrnkq9u2UaNw3qZAtT6f54fhyWGRvw8HHSoWsBlLk6NMJUrUDrap6OqxJwCcWVZYS7ER241LF5qjkgikeTy6BoW4azj7BdJKkuddRwGUplipbpRIcjlzleCqG+JT0nNkyi0lsMEVVpKzhJJqupkpfnJCbtyFRb/rQUCFicjs1AmETtqWBD+WOroStN7YplcRlXZklxVttT9jcaq/dyEjIJqy9KBtVDLvr3VHcjhJGbni6qVClnBLh4HOEVCVgtb5ZfWEBZEzBNPCWERrPCYKSETZy07JXSPsIqLSxi+wMSyIywmJaTZZIF8E2KrgoJCCNngI8yERcuru4dupPv6gDWsVtmexJifr18XRo14ePWNHenChuCGuRPluRy6EmSp4HPSxM7HZ5YGWQ4giZORXlhZnOkGrDRhWQmFME6K51PCFGrlzBJZkSslLMl8l0c9PtsvzufNA4skFPwc2Dx5PxUPtjfI8jMy4DrnJGXnlNYTgVvzCyxunkSSl81N4CWnCyQ6z6eE9Ez6WZ6lhp/hYCuAOJNHlectSwaWv5YD95YklCX5O5N4FN93l8jovrXXiNKTeMzDAeTLkym6u8FCvtRwI+RFd3dgQR538KAI5KyLLwNYTGrpFmYSCkWVXm/0XfR8/pYQkxrUMzasgRHMhEXLeGQW2mENEJ357R6jxkatXF65jPGiTKmeJI+o1RoQM8ThSQxrQGChUKEdOAoT8BFmwqJlNxuqgaNabZNUKmfGi/oKFsEKyxvjDsFUZaUCArSmJv0THDiKwEKhQvfTHBAzxt2ZJT0NYSDzixxfLW/MlFMVFQqBoPhH+WkOCoUKwY+fQUsdLIpCYKFQKAQWCoVCIbBQKBQCC4V67tTVdWxk5Mrt29M22/25uf979OgH1JMXHHk4/nAW4FzAGXkagYWO8vS7xarXl1+O/u1vNnSMp0pwRuC8hBJYHR0WZsw+TKCjrGK3WMXq7T0xMXEd3eCpFZwdOEePCywgVFZO/i9+Ffviy5tfZL/2s82/3vnH7CVhCx3lGXKLVSx0wmfCOR8LWACmHb/9w9p/iPRS7NvxwTMLHeUZcotVnAnieX8mFCgJCApYEFv50ooRxFnoKKvPLVZrlR3LEc9Q4cJvsXVNMOEVZIKBgAW54aJB1gKOMjv7/enT/adPD8zO3sOT9PS4xarUyMgVvwehr+9ic3NnT8/Z//qvm146efI8LIK/z5djzEwMfTXzxL7O+s3lkdtzvvPhfC0HWCaT+cWXNwcC1ovs11pbiYWZFchR6Dv8N3/5y78PDV3+4gsMwZamyRMG4vMHj9+OX7dYlbp9e9rvEaira4W/jY3tQC4vVVU1wSJg1vPkWg9GLET3N3NP7hunBtX64bs+8+F8LRdY7NcCAuvlzaWlpXv35lZUVAbCViBHAen1nZ999uX3398nyZMPHjwMvFdzo6SGHJ27c96sPQ/snxtpUxKXAh/Te7eGBiesT+ZwP7zVW9U1fO/BcKuu91vfu8cgoaoVCmsVur6R7zw7/HCmv9HQO748z5jp15gvfOf4aL99pVtdW6weuuN35WtnpMUVxQ4pzSNzi7mFSajgx0n4Oxt9fvLaUZ8phUWCwlafn8gZJRwJP04mqXpa/6e3zXbf78GEAKq+vg3wtKRFj+5dI6uIsze9T59t9KTCeNn98rONDzl8QN83OrOMcz03YnaePkrV5zzCH/t4X3Vt37gtRP48e1lf1Tf+0OmltvHzXdJSpfmrucWPwOy103qdWKgUV3WdveYvqbJbR3rMCrFSKDWYP71lczmz4fRN75XhfC0zJYS8LxCwXvvHmLy8vHdpKy094JdZgRzl1q3/6ek5d/z4JzANQdbXX4+HDFjTQ+qqgcmHPzawZq8QcvPZcdujhw8mPyWlGg+gWL/oUpjHlklV62V97cAUvYO2b/qqq8jTp7qkAYBl+6JLTE7YAzTlxy1MqlQJP15WGKdQNXv9oL+pLF5SGC/jc+sNnu8mPVxVUxQnK4yXFL1n6Hw6gbXAoL8FYqgAix6MHjHoB33yJvut07We17B1zCw39I7Z7OAD58zSxmHfc2SdnrE56fPdzF1fv304Z7dTuvt5l7TqzFWr26L7t06ribPXQxYQWT8jpeS1eW+ZuaDXVZODcDv0AZbvEbBe0Gm0H9+wPpyzjvVVS7uGrd6NT50jFK3DU7Y5+/QYWQVXtCNFmDylU5+b8R08uMyi+84/ZgcCVlp61rtuBnFW8I7y179evnp14pNPLl6/fnt6+n9PnPhkGcAaP6bTnxoiNTrpoVpF2/DkfcjAL+sPKYtLleJDhtPj1OZ3vxrQV9UKxZrq1oGrs7RbfNUjNvZRd4PKM66bif1Gt9xwdsrx8c55Qnrshv3R3J1LfbC5WFQrbTwzPD3nvbk9MLCmLnefv+HwxftjhLhn1O70s4lulbl/2uvOdrL/XFd1pUZaSZAXp8Fp7NcHqivPXKVvnncGCOk84OxfnVR0ORhkn7oxdY8OowIAC7yk+uPpBcaUep2v5obSOFl5eRNETKUlHm+vtpQrC+OUNVK1IE5e4fFPbS3a92T8VE1DiYLPqdG2P5XAWuAqXSqwIIxSm6/43mzuDprhvNi8rn/LmG3ewXqrXA7mvM6HjDrtuVvU6b49rK8E3vnvif3moFpu7p9yB8fc5Cmz/tOZwLFSsB7l1PgxjfZTq7Nvk+NW+yPbkM4bWH6OwO0hdWXfuN11wWoHqSDrzqdmqY7BNERSutPX548VzD92w9HapS5x25jvPXX5wxpi3473pdW/vJMgkUjcgQW5oW+Q5f/o2+c6O0/8/e/2iYn/7u8fgjmffPLXyclbgfzGPjtjBRjds96994MnsDRCzcAknAA73A1qHcfaPcKaguPYdeHmAyq4/dgsbaWOMhBHKCb7b3rVgObGe5ykpw5u97W5R7aJ3sau/uuw5tzdQVLadsXmvfmc9TsrzLTNWK32gJeEbeykonHorjtETtyyP5y+YO4btTrcSytUMo77yAo40/XCtz+au3oMujRthxt1JTk0n1CM9xjMlx54530BgHX1SK1Uba4+pBQeMhDnb1gXcQuCgk5tU3tnUx4wqIFwLTLX/VFamNlksRCKZIlgX8th56J2vYNuzVohwK7CsqqBZZvollcUQ+IjJ8jPpl2X2b0xc1UXnCPbaB8xMD1//evcrn/w21o/mYHtxmkN3HcHiEpD92iA55jwpZW14B7uNKToU1ohFCql6p7+bx/4Ait4j3LroW/u4gMsf0eAuou7Qcc6aJZ2TVCe/+3l0xeZbnsDS3Hilst7G/2UsR5r4CjEWZAbvsh+7cWXN0MmCLEV0Kq0tNQdWKmpqSaTORhH+c//vD44+AUzDYnhzIwVaAXMCjard4uwtANWr2PkDqypPxtc0ab9GintGrF5H1yXvu1TMJf9d0Na1+2CPh9W69TnPdLaQUjEAm4e8LELuDJx+tv5Uw4xYFXPCJD34Y3eSvOF2fn7oZjqm+v+w+wLOFYVSVoM2gHnjXT6rJp0bBUEsO5euzI8Om29P2ebugJxOPGFbSG3aIN8sOg9vaXdYqmqLYqrVGrnIyljkyheWvZhe2e7xVBYwefWNc9nhZ0VNVT+qLV0trfV7JQUZus7VzGwqNC7dXjy3pztNuQ19F2NududAE+jOGW9SDrOHRVo1Ordno3AzUN/0R+Sbg4CeqRdATP3R9YbF3rOkEaDQn1mvhBmGzLSKdj9ubtjfWo57VFeEVawHuVK9IZbfbM/b2D5PQK2z0mxK5ekCxHma3Z/KSFsSKeEDEDpReN9Co0f7w3BT3NaWwmAlLNuRZeuXCYUCoMElsVyfGDgs6+++g/QqVP9wCyYCVkh5IZLBtagwwMoRzniBSzKY4pFteJD8xKbL8zQxDH7Iw5VkCIgU6Pw30Pj/6F15ARZXamr1pBEGyFVzQPLHDSw7k301urMX1jdkv/5u64XsOSu/NQ+4mLi5AldsajH6XnUmurBqYfBAssj0AOv8kGtx6tyIR+U8N1U8gHBLDJ/qOR7LJLJqklHPpgt81gUX93QvmqBZb3QaPAIE3puMAmRturM1fs/eAIruAjLSnkIcX6YVOnMl6wLn8E7A2ap5RoVsNiuEPKTV+3zoGnzAU3wHuVee7F4ENYfsPwfAff2HdHDkQmf68s6eoKkiu6lFeJWV0ZpHzsp1l+2hhxYDLMg73OPqtyBJZXKfFNC3xrW7Oz3BsNhhlag4eFRna4DksSvvx4fGrocUmD9MHnK4AzBXOFSYOJQ65+f6G90FKSoNTWDU4xb3Byorl0isO5P9+sgBnRLHOxjZmGFUAzoBCmLi2Fa1/0NHcCLyOF7Tr8kXPfDSkJPNeK4H9pGehTzyX8QwHowNXpt8p7bfc8TWB41LJL4oJLPUdVUtxrqQC11QKLk+hZHPijh/1HTVMcsapYlS4ryjIfpfLA8XlK6T29gFlXUUyUwqWW1Ft1nzqo98xr6XEx9bKDKpsxpFVZQ0/SjesonGb7QJfneKt/HYdYLOp1+kPaQ766Yq3xqWPaZq5duuCrxzmDEelkvdQELUOj1/Dd4j/IIgj42VJ+6tSCw/B+BR7cHfWpYVkdKOOiRyVIZpYYc+s4tCXBGfyEpuvu8obkyELA0moZgnhJ++eU3ly597VmAv3T16sSDBw9J8uT3399/XGDNDmsPdQ3NzDlGeVT1DN2ki1Bf9WlbqfrfQsQBKlXqFPO8A/ZLNYNUjez+zDCpEy4pwno4M9Smq+6ZsNqZpzyOzttmbVZGM2Ok3Hz2us1md1Qc1CcmrND+9BVzpaviAA5khyxSzlQcqDl+njF7AsvNS+auHtEojozdgUT4u2vdtd4pocdTQkKZDAldszOh66yoLoyrUGjIo0atME4iFLY70da8T8bn1DVZDndK59fxbMTyrAxr6Ou7qFLp/Y4O9bto8s8GKfWoC44nnRAxQ5buz5/TWdvUebOUHLt7b46hAyE1dI9aHU8J/SU+4A92V+XBZvP2ounTqlr9+RtWOyy9NWTWKU7QZalHMxcaNdpzMH/O+s2AWt41YvVTwwrCozzv5dfOKLyDHe+U0P8RoCIvOkW1zz8lnJ0PCXXuz0Zto6RBf9HqcTlbNMSlB6EZ1uA3yCotPeALLJVK5XdYg9c4rNnZe11df56cnPJ4NjF+46OPPoZFg4PDEGQtNvB9MWA9sl09YZaKNOTYnOspoajWWZtciDgPp8+qKhTOmwykhMcIqUgplBLd584sKcKiavNuw2eKS32eEHmnhCf7P+1SUNVx92c6J0fp0H3qPP1MB9y3lhyy/rAwsDy8xHbrgsUghbBOajAP3LIFHp6n0ZQAlT40u/0vKZ0IssLCVjofrFC6qMTUrWSyKnNDNkWuZtcoB5pl8ap64lkbOPrJJxe95H/gqH1muMvMuAQ5OG3zHRnglhJSH68NEuB+pUqFbnnjsCgu9Bp1Yiow12mPXbnjLK3OXOtlxj2puvp9xz0F6VE+IzN6vR3Mp+ge6AhAf3Q62FNxFXn2G/9PD+5+1gVA9Kiv379GVvWM2kI0cDQQsyDOgtwwNTVVKBRCJgixVaCBo14j3f/yl887OnpOnep3nwkfzeYeuJUdO/bxkSOnrl+//dwNXvesOASu3w9rNYvXqnCke/C/uGB+f3PmzKe+P82BOyss8j9wdNV4lD+maM9NP7F+3r3o/+uW+dOcx389Fv7odEXdC39LiD9+fno86sf/8TO+1mMVu9fz9ia/58sPn2VgPdbrZfDFafg+LHyBH+qZeYEfvpoW3ziKr0hGPUuvSMaX/6+md2A9z+90Rz98pj0T/2vOcyH8rznoh6vDM/H/EqJQKPxHqigUCoXAQqFQCKygRJJHUCgUKrQKPbCgUbO5o91sNrW3t5lMKBQKFRKZKbN0dh4OGbCAVoCqTpI8duxYb2/vcTQ0NLRQGPAEqAJsAWgFE2oFBSyIrY4cPYoHFw0NbYXs6FHgjCUEwALsAf/wgKKhoa2odXZ2LhpkBQUsiNnwaKKhoa2oAWdCAyysW6Ghoa20AWdCAyw8lGhoaE/AEFhoaGgILDQ0NDQEFhoaGgILgYWGhobAQkNDQ0NgoaGhIbCeOmAZs6LCfy8P+Y7zY1ixxd0Bl+uzo34SV97ztJymhXur3h0d8Uo4a214QgW6NBoCKyTA0mVHsbYKHL/h0WZsXpAXSwSWdndUeKI8hAh4toDlOKRRCCw0BBYCC4GFhobAYq7A8t+wIrbFxUZHRW6KiOYKTQwjeozCxOjwdSx25PakdyIdwOrR8t+JjvgJi8ViR2xJEOjoC7g2I3pjePi6sDUsdvgr4eGb4oTMVxDlvLci2aww1ivRCcVGRx9M5bw3I6jNY5ISohcDFntrApfuw6bYbJWj3906QUJ0ONWDTVt55SaGqPy3wqOztEy3c98Mj96jDdSq/PfsiOitEWx2NJe3fROLFZkkJwM1G6C33UYhF1qgZm9Nca6KwEJDYD0pYIVF8lRHKB5lR4fHFlNrmPZtZW9OkncADQTbN6xhO4ClFuwt13Z0H+8hVSlRrC25xoARFjTFjuSWm7qBBbmxr0Rn66idFb7DDv8NxURTeULEC2GLACuMFb1bDQ1o98WyNyWpehgosKLSKXqZyhIi2LGCDgaOgu0bozLqu7V7o8Njco2B4zIAVmSamqxICF8XKzCZgHRxZd0BmvXb225VSiR7S4YKViBVGXC4Ck0ILDQE1pONsFLUzuyP/Y6w+zgp2MaKynLgSMUNZ/umhA0ZURsS5D0BgNWQEbluu9DRr+7y37Cj95qO98gTfhKRpAouJ9VTveWTjgbi2JEZ9dC/3GiY2eEEBGv7QUcLpoNxEZsiI1+J5RsXOgby34dvLSSh8WiagPJE+qPfZv32Fma+4qISWRTL2iboRmChIbBCDyx9IGCxo/Y4rnJy31bWm0AJU+4WVmwR6YKRI8Iyladvj9oUTqV+G1hhbFeNyRtY0gT2Wlb4pogIRhvolK1bEMuKzjYGXcNytt+jStpIs6CeF+n6UpL/JmvrvvkAp1uetDEMaLvwi8EAWNR+AaEgqARgcSOoFvw267e33cLYtWHsjfP7BcfhLb4JgYWGwAo9sAi3OKJHnRHJ2l523BFhJc8HErsjWVSE1Q0RVnSe40pUJUcwERZZHEvliab5GOonnsD6vWeE9Yor/nIYhCcbInn1jmAu+5dBRFgdbhFWA7VRgAiLytQitiVt3xSRICWXDCy/zfrtLRVh0T3xYzSwpOjSaAiskACLilPYW/eqyZ5uUwUval10tt4BrDWvbBcSx493yJMi2bFFFJBMhVvDt9DFoCOqpE1hDLBMEH/FMAFFtyo50j3CohZtcSse9Wizfxm+dbeKKuH3kMYKoZwKVcjy34RHpakpxjRkR60NtoZlpGpYPO8aVjldbGJ6U5EUuTGuvIOaiKAnlgYs/8367S214+Hb+GqKit1kQ7mwylnDIoVvs6PS1d3o1GgIrJAMHCVV2ds3s8NeoJ/cFWmZSwtSwsh3kmIj2SxWeDRXaHR7ShgZGRUVHRv3liPCAnhlb4uMiIyK3rI1LiXOPcIC2PG2hLPZ4eEbPZ8SrmOx1oVHvpkk1DNgk/PepFuNidu+eUlPCR1rdjfwE34ZzlrLYm/cmlRGw4IsT4DAqtxR7qKA8rbAtDRg+Ws2UG+7tQLmKSGLHR4Vy3N7TtjdkBu7iRW2lhWZokLPRkNgrchId6oivseIZwINDQ2BhYaGhsBCYKGhoT2HwEJDQ0NDYKGhoSGwEFhoaGgILDQ0NLQnASz8R6poaGgrbSH7R6offfQRHk00NLQVtWMffRQCYNHCrBANDW1lDTizKIuCAhZgr6sLf8SGhoa2UgaEWTS8Cj7Coph15EgX5IZYz0JDQwuVAU+AKsCWYGi1BGA5sYVCoVChVfAIWhqwUCgU6kcUAguFQiGwUCgUCoGFQqEQWCgUCvW06/8B3flKnlbonwoAAAAASUVORK5CYII=&quot; class=&quot;imgshadow&quot; alt=&quot;Elements panel highlighting the font and dimensions.&quot;/&gt;&lt;h3 id=&quot;new-color-contrast-indicator&quot;&gt;New color contrast indicator&lt;/h3&gt;&lt;p&gt;The color contrast indicator in the elements panel now matches the one used elsewhere, using the &amp;quot;AA&amp;quot; and &amp;quot;AAA&amp;quot; markers instead of checkmarks. You can hover the marker to get the specific ratio and a preview of the colors:&lt;/p&gt;&lt;img src=&quot;data:image/png;base64,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&quot; class=&quot;imgshadow&quot; alt=&quot;Element panel with a color contrast tooltip showing a preview.&quot;/&gt;&lt;h3 id=&quot;noteworthy-bugfixes&quot;&gt;Noteworthy bugfixes&lt;/h3&gt;&lt;p&gt;Polypane 11 also includes some noteworthy fixes to the way style editing works. We no longer show suggestions as soon as you focus an element, but only after you begin typing or press the arrow keys. This also fixed another issue, which is that sometimes you had to tab twice to go to the next item when adding a style rule. You could also get into a situation where a disabled and subsequently deleted style would still be listed. Those are now correctly removed.&lt;/p&gt;&lt;p&gt;We&amp;#x27;ve also fixed a bug related to how we parse CSS selectors that use &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; and friends containing other pseudo-classes like &lt;code class=&quot;language-text&quot;&gt;:hover&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Though the elements panel and Polypane worked without a problem, it did cause a console message. If you used something like Redbox or Next.js, they throw a big red error box on top of your site for any console error (even those that don&amp;#x27;t come from your app). That will no longer happen!&lt;/p&gt;&lt;h2 id=&quot;meta-panel&quot;&gt;Meta panel&lt;/h2&gt;&lt;p&gt;As always, there are subtle (and less subtle) new changes to the way various social media render their social media previews that we&amp;#x27;ve updated, and we added proper GIF handling.&lt;/p&gt;&lt;h3 id=&quot;support-for-gifs&quot;&gt;Support for GIFs&lt;/h3&gt;&lt;p&gt;When implementing &amp;quot;&lt;a href=&quot;#sniper-links&quot;&gt;sniper links&lt;/a&gt;&amp;quot;, the reference article we consulted had a GIF as OG image. After testing we noticed that some social media allowed the animated GIF while others used the first frame of the GIF and disabled the animation. Polypane now accurately shows the way social media previews deal with GIFs.&lt;/p&gt;&lt;h3 id=&quot;updated-slack-twitter-and-telegram-previews&quot;&gt;Updated Slack, Twitter and Telegram previews&lt;/h3&gt;&lt;p&gt;The Slack preview has updated designs for the large and small image variants, Telegram has a new maximum width, and Twitter changed how they deal with information-poor pages that we now follow.&lt;/p&gt;&lt;p&gt;For Slack Polypane now automatically hides the image when it&amp;#x27;s larger than 2 megabytes, the default value in Slack:&lt;/p&gt;&lt;img src=&quot;static/slack-daf8b1e158b776767a9637f0e71ef21d.png&quot; class=&quot;imgshadow&quot; alt=&quot;Slack preview with a too-large image&quot;/&gt;&lt;h2 id=&quot;ui-updates&quot;&gt;UI Updates&lt;/h2&gt;&lt;p&gt;We&amp;#x27;ve made improvements to the UI in various places across the application:&lt;/p&gt;&lt;h3 id=&quot;new-iphone-14-devices&quot;&gt;New iPhone 14 devices&lt;/h3&gt;&lt;p&gt;Polypane 11 includes the new iPhone 14 device sizes in our devices list. The difference between the regular and &lt;em&gt;pro&lt;/em&gt; versions are a little weird this time around, which we&amp;#x27;ve written about here: &lt;a href=&quot;/blog/thanks-i-phone-14-designing-for-device-sizes-is-dead/&quot;&gt;Thanks iPhone 14, designing for device sizes is dead&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&quot;more-info-in-the-element-tooltip&quot;&gt;More info in the element tooltip&lt;/h3&gt;&lt;p&gt;If an element uses a flex or grid layout that&amp;#x27;s now shown with a small icon in the element tooltip. Additionally, the contrast indicator has a preview just like the Elements panel.&lt;/p&gt;&lt;img src=&quot;static/flexindicator-076143c683c4ca8c618639f757e503d2.png&quot; class=&quot;imgshadow&quot; alt=&quot;Element tooltip showing a flex icon and a contrast preview&quot;/&gt;&lt;p&gt;For images, the element tooltip now also shows the current src so you can quickly see which of your responsive variants is loaded.&lt;/p&gt;&lt;h3 id=&quot;sniper-links&quot;&gt;Sniper links&lt;/h3&gt;&lt;p&gt;When you request a new licence key from inside the app we now detect if you use one of the popular email providers (like Gmail, Outlook etc) and provide direct links to your inbox, sometimes even filtering your inbox to emails coming from just us (using query parameters). This means you no longer have to manually go to your inbox and search it for emails coming from Polypane.&lt;/p&gt;&lt;img src=&quot;static/sniper-0f66613635b538c07b2b070cc76d6153.jpg&quot; class=&quot;imgshadow&quot; alt=&quot;Polypane license key step showing a sniper link for Gmail.&quot;/&gt;&lt;p&gt;This technique is called &amp;quot;Sniper links&amp;quot; and it really speeds up both the email verification step when you sign up, and the licence request step during the app activation.&lt;/p&gt;&lt;h3 id=&quot;debug-tools-split-into-categories&quot;&gt;Debug tools split into categories&lt;/h3&gt;&lt;img src=&quot;static/debug-7849b246b5c6b4f2c422dff9f4ac602c.png&quot; alt=&quot;A list of debug tools split into categories.&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem;css-float:right;max-width:100%&quot;/&gt;&lt;p&gt;While the list of simulators was already split up into different categories, the list of debug tools was just one long list and as we reached 20+ debug tools it started to become a little hard to find things. So the debug tools are now also split into four categories:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Layout&lt;/li&gt;&lt;li&gt;Accessibility&lt;/li&gt;&lt;li&gt;Content&lt;/li&gt;&lt;li&gt;Disable features&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;By splitting it up into categories it should be easier to find a specific debug tool, and hopefully also helps you understand what each one does.&lt;/p&gt;&lt;p&gt;For an overview of what all debug tools do, head over to our &lt;a href=&quot;/docs/debug-tools/&quot;&gt;docs on debug tools&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&quot;context-menu-defaults-to-preferred-devtools&quot;&gt;Context menu defaults to preferred devtools&lt;/h3&gt;&lt;p&gt;Depending on if you have set the Polypane devtools or the Chromium devtools as the default, the first &amp;quot;Inspect element&amp;quot; item in the context menu will now use your preferred devtools.&lt;/p&gt;&lt;p&gt;So whenever you right-click to inspect an element, the first item in the context menu is the one you&amp;#x27;ll want to use.&lt;/p&gt;&lt;h3 id=&quot;picking-a-starting-layout&quot;&gt;Picking a starting layout&lt;/h3&gt;&lt;p&gt;When activating a new copy of Polypane, rather than letting you choose between three responsive panes, or five mobile panes, the last step in the &lt;a href=&quot;/docs/setup/&quot;&gt;activation flow&lt;/a&gt; now lets you choose between two starter layouts: the responsive design (horizontal) layout and a more traditional browser layout (with the full layout and sidebar open):&lt;/p&gt;&lt;img src=&quot;static/3-378486c6e97e8b6f9c037d10a9b648f4.png&quot; alt=&quot;Polypane setup step where you can choose between two starter layours.&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;Starting with three panes can be a lot when you just get started with Polypane, so we wanted to make it easy for people to get started with all the tooling that Polypane provides, even if they don&amp;#x27;t need multiple viewports just yet.&lt;/p&gt;&lt;h2 id=&quot;updated-chromium-to-106&quot;&gt;Updated Chromium to 106&lt;/h2&gt;&lt;p&gt;Chromium has been updated to &lt;strong&gt;106.0.5249.61&lt;/strong&gt;, and ships with a number of experimental features turned on by default, like support for the page transition API and jpegXL.&lt;/p&gt;&lt;p&gt;Head over to our docs on &lt;a href=&quot;/docs/experimental-chromium-features/&quot;&gt;Experimental Chromium Features&lt;/a&gt; for a full overview of the available APIs. If you&amp;#x27;d like to see one activated, &lt;a href=&quot;/support/&quot;&gt;Let us know&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;get-polypane-11&quot;&gt;Get Polypane 11&lt;/h2&gt;&lt;p&gt;Polypane is available for Windows, Mac and Linux (.deb or AppImage) in both 64 bit and ARM versions.&lt;/p&gt;&lt;p&gt;Polypane automatically updates on Mac, Windows and on Linux when using the AppImage. Otherwise, go to
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; to download the latest version!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Try it for free&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;polypane-11-changelog&quot;&gt;Polypane 11 Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;New Features&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; JSON viewer&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; iPhone 14 devices&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Save color swatch as image (Thanks Eric!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Duplicate tab feature&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Photophobia simulator&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Role visualization debug tool&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Aria visualization debug tool (Thanks ElevenWays!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Copy link, copy link as markdown and open in browse panel support for tabs&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Copy link as markdown context option for all links&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Chromium 106.0.5249.61&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Sniper links and layout picker in app setup&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Achromatopsia simulator is now more true to life&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Debug tools are now split into categories&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Target size debug tool now supports wcag2.2, Apple HIG and Android guidelines (Thanks Ronny!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Target size debug tool no longer checks inline links per specification&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Text size debug tool: Clicking a suggestion applies it&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Color Contrast debug tool: now supports AAA checking&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Color contrast debug tool: improved logic for solid text in elements with transparency&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Color contrast debug tool: clicking a suggestion applies it&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: focus outline highlights the currently focused element&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: images now also show input[type=image]&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: focus order overlay has updated colors&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: image overview warns for alt text of 200+ characters&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: image overview warns for alt text containing emojis&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Live CSS and source panels now use platform specific monospace font (Thanks Ivan!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Live CSS Panel now has better indenting and formatting support&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Live CSS Panel font size now follows the rest of the UI&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Node tooltips now show icon for flex and grid boxes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Node tooltips now show current src&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: a11y tab shows auto-suggestions for role attribute&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: clicking font or dimensions now copies them to clipboard&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: supports nested pseudo-classes like :is(:hover)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: box model now shows border radius, box shadow and overflow indicators (Thanks Stephan!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: tree-view has a max-width and height to prevent it from pushing away the rest&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: color contrast now shows a preview and &amp;quot;AA&amp;quot; or &amp;quot;AAA&amp;quot; instead of check marks&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Proper handling of GIFs for all social media previews&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Slack card now supports unexpanded images, and updated image views&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Telegram card preview&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Twitter card preview&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Enable experimental JPEGXL support&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated Google Fonts database&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Trial period now has a visible button in the header to go back to tutorial&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; New handling of past due and paused subscriptions&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Add spacing between pane header icons&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated screenshot editor&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Option to set default action for screenshots&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Overview screenshot now shows dimensions above each pane again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; New design for element screenshot and live CSS element selection&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Improve logic for disabling cache and cache clearing to be more effective regardless of server settings&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; When right-clicking input fields on mac, a context-menu option for the emoji picker is visible&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Context menu &amp;quot;inspect element&amp;quot; defaults to the currently selected one being the first&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Less calls to CrUX data when not available&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Color picker now lets you check against non-text contrast (Thanks Eric!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; New shortcut to open and focus console: &lt;code class=&quot;language-text&quot;&gt;cmd/ctrl shift j&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Shortcut to open settings (Thanks Roel!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Emulation: There is a new &amp;quot;auto&amp;quot; option for color scheme emulation that follows the app settings&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Random resize all panes functionality works again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: Prevent showing suggestions before typing or using the arrow keys&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: sometimes you needed to press tab twice in the style editor&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: emptying a text node in the navigator prevented it from being updated again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: Disabled and removed CSS styles were still visible in the elements panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: commas in pseudo-selectors no longer cause newlines in selector&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent reading out node env on load&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Choice of device or viewport sizing wasn&amp;#x27;t preserved on device change&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Overview screenshots heights now better fit the visible panes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Make screenshot button in full mode no longer falls behind devtools&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; 0.01 difference between color contrast debug tool and color picker&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where node tooltip rendering wasn&amp;#x27;t properly applied&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Alignment of add icon in cookie overview&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Outline panel: issue where link list would be empty&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where Polypane&amp;#x27;s scripts would interfere with core-js on a website (Thanks Oleg!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent errors when calculating the specificity for nested compound CSS selectors&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Last open tab should not have a visible close button&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Improve loading of .prettierrc.js variant&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where context menu on tabs on Windows weren&amp;#x27;t handled correctly (Thanks Reinhard!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Panes no longer shrunk to fit (Thanks Andrew!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Tooltips in detached panel not rendering correctly&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Meta panel: Incorrect missing favicon message if a site has just a favicon.ico&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Incorrect synced hover states for Tailwind CSS in dark mode (Thanks Austin!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Node tooltip not being visible for some sticky elements&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Thanks iPhone 14, designing for device sizes is dead]]></title><description><![CDATA[Back when the mobile web just got started, mobile design was simple  (...it wasn't, but bear with me) . Your site had to fit 320px wide and…]]></description><link>https://polypane.app/blog/thanks-i-phone-14-designing-for-device-sizes-is-dead/</link><guid isPermaLink="false">https://polypane.app/blog/thanks-i-phone-14-designing-for-device-sizes-is-dead/</guid><pubDate>Thu, 15 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Back when the mobile web just got started, mobile design was simple &lt;em&gt;(...it wasn&amp;#x27;t, but bear with me)&lt;/em&gt;. Your site had to fit 320px wide and it would work for &amp;quot;Mobile&amp;quot;. 320px is the width of the original iPhone and Android phones dutifully followed. Unfortunately that didn&amp;#x27;t take long, and mobile phones have been growing larger and larger ever since.&lt;/p&gt;&lt;p&gt;Especially in the Android ecosystem the variety of screen sizes exploded, rapidly growing to 360, 393 and 412px wide. On the iOS size the expansion was much more gradual. First to 375px, then 390px and 414px for the &amp;quot;large&amp;quot; phones. Apple kept this for a while: small phones were 375px (pre-notch) or 390px wide (Pro or otherwise), and the large phones were 414px (pre-notch) or 428px wide.&lt;/p&gt;&lt;p&gt;With Apple&amp;#x27;s dominance, especially with people designing and building websites, it meant we could hold the fiction that there were two widths for designing for devices, and that was manageable. It doesn&amp;#x27;t matter that this wasn&amp;#x27;t true (hello, Android), but it&amp;#x27;s true enough that people could get away with believing it.&lt;/p&gt;&lt;h2 id=&quot;but-the-iphone-14-changed-that&quot;&gt;But the iPhone 14 changed that.&lt;/h2&gt;&lt;p&gt;iPhone 14 comes in two flavors: Normal and &amp;quot;Pro&amp;quot;. The Pro changed the device from using a notch to something Apple calls the &amp;quot;dynamic island&amp;quot;. It looks really cool, but that&amp;#x27;s not what this article is about.&lt;/p&gt;&lt;img src=&quot;/blogs/devicesizes2/iphones.png&quot; alt=&quot;3d visualisation of the four different iPhone 14 sizes&quot;/&gt;&lt;p&gt;&lt;em&gt;Rendering courtesy of &lt;a href=&quot;https://twitter.com/pixelbeat/status/1567894924741279747/photo/1&quot;&gt;Davo Galavotti&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;While the normal iPhone 14s have the same dimensions as the 12 and 13 (390px wide for normal size, 428px for Plus) it&amp;#x27;s the Pro&amp;#x27;s that throw a wrench in our fiction of clearly different widths.&lt;/p&gt;&lt;div style=&quot;max-width:100%;overflow:auto&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;iPhone 12/13&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;…Pro&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;iPhone 14&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;…Pro&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&amp;#x27;Normal&amp;#x27;&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;390px&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;390px&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;390px&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;393px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Plus/Max&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;n/a&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;428px&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;428px&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;430px&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;There&amp;#x27;s a 3px width difference for the iPhone 14 and Pro, and a 2px width difference for the iPhone 14 Plus and Pro Max. That&amp;#x27;s a &lt;em&gt;tiny&lt;/em&gt; difference, but it breaks the nice fiction that developers have been telling themselves regarding mobile devices:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;If the site fits on 390px and 428px, you&amp;#x27;ll be fine. In fact, you can optimize precisely for these widths.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;If it fits precisely on your iPhone Pro Max, it can now easily no longer fit on someone&amp;#x27;s iPhone Plus. You have to test both. And when a new device has another tiny change, you can add that one yet again.&lt;/p&gt;&lt;h2 id=&quot;testing-on-specific-device-widths-is-an-evolutionary-dead-end&quot;&gt;Testing on specific device widths is an evolutionary dead end&lt;/h2&gt;&lt;p&gt;If you optimize for a device today, it&amp;#x27;s going to break in a year. Your design &lt;em&gt;has&lt;/em&gt; to be fluid and flexible to make it look good regardless of a device&amp;#x27;s width. Today, in a year, in a decade.&lt;/p&gt;&lt;p&gt;Of course I&amp;#x27;m not the first to argue against optimizing for devices (this isn&amp;#x27;t even the first time &lt;a href=&quot;/blog/responsive-design-ground-rules/#rule-3-design-from-content-out&quot;&gt;I&amp;#x27;m doing so&lt;/a&gt;) and recently Andy Bell has done so far more eloquently over at &lt;a href=&quot;https://buildexcellentwebsit.es/&quot;&gt;buildexcellentwebsit.es&lt;/a&gt; and in his talk &lt;a href=&quot;https://www.youtube.com/watch?v=5uhIiI9Ld5M&quot;&gt;Be the browser’s mentor, not its micromanager&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;But it&amp;#x27;s hard to change. Designers design at 390px wide, device emulators have fixed widths and at the end of the day, time pressure maybe means that&amp;#x27;s all we use. And the site ends up being broken at random sizes, extra work needs to be done after a project is delivered and no one has a good time.&lt;/p&gt;&lt;h2 id=&quot;so-what-now&quot;&gt;So what now?&lt;/h2&gt;&lt;p&gt;Let go of the idea that you&amp;#x27;re designing a site to fit &lt;strong&gt;devices&lt;/strong&gt;. You&amp;#x27;re designing a site to fit its &lt;strong&gt;content&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;When you design for the content, it&amp;#x27;s always going to fill the dimensions. This means you have to let go of fixed sizes and allow more flexibility in your design, but it will be more resilient and serve you for longer. None of this is new information, but it bears repeating.&lt;/p&gt;&lt;p&gt;Some general tips:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Don&amp;#x27;t use fixed widths.&lt;/li&gt;&lt;li&gt;Design with real content.&lt;/li&gt;&lt;li&gt;Leave some space around elements.&lt;/li&gt;&lt;li&gt;Switch to different layouts not as soon as possible but keep things flexible: keep a simpler layout for slightly longer.&lt;/li&gt;&lt;li&gt;Let the content dictate where to add spacing.&lt;/li&gt;&lt;li&gt;Base your layouts on flex and grid to make them less brittle.&lt;/li&gt;&lt;li&gt;Decide in the browser: design the last 10% in code, not in a design tool.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In short: stick to the &lt;a href=&quot;/blog/responsive-design-ground-rules/&quot;&gt;responsive design ground rules&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;It also means you shouldn&amp;#x27;t &lt;em&gt;test&lt;/em&gt; just on whatever the current device sizes are in your responsive design mode, device emulators or browser. Whatever tool you use, make sure you can resize your emulated device easily to test what happens to slightly larger, or smaller, screen sizes. If the tool
can&amp;#x27;t do that, maybe pick another one.&lt;/p&gt;&lt;h3 id=&quot;how-we-approach-it&quot;&gt;How we approach it&lt;/h3&gt;&lt;p&gt;While &lt;a href=&quot;https://polypane.app&quot;&gt;Polypane&lt;/a&gt; has plenty of device presets, they&amp;#x27;re just a small part of how we show your site. We can also show sizes based on &lt;a href=&quot;/docs/breakpoints/&quot;&gt;your breakpoints&lt;/a&gt;, the &lt;a href=&quot;/blog/css-breakpoints-used-by-popular-css-frameworks/&quot;&gt;css framework you use&lt;/a&gt; or the &lt;a href=&quot;https://polypane.app/docs/workspaces/#built-in-workspaces&quot;&gt;most used viewports worldwide&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Each pane that shows your site is completely freeform. Really: quickly checking a slightly smaller or larger pane is as easy as grabbing an edge and resizing.&lt;/p&gt;&lt;video src=&quot;static/pane-resize-3d1e8cee75e26c823c110fe9da866e2c.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;That flexibility is much more powerful thank you might think. It makes testing a wider range of sizes essentially free. Removing that barrier makes finding out if your site has issues happen much faster. &lt;a href=&quot;https://dashboard.polypane.app/register/&quot;&gt;You have to experience it for yourself though&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;next-time-you-work-on-a-site&quot;&gt;Next time you work on a site…&lt;/h2&gt;&lt;p&gt;Rather than picking your favorite bunch of devices, add a couple of new panes in Polypane, resize them to roughly &amp;quot;Mobile&amp;quot;, roughly &amp;quot;Tablet&amp;quot; and roughly &amp;quot;Desktop&amp;quot; and we promise what comes out will be more resilient for much longer.&lt;/p&gt;&lt;p&gt;Designing to device widths is dead, thanks iPhone 14!&lt;/p&gt;&lt;p&gt;&lt;em&gt;Thanks again to &lt;a href=&quot;https://twitter.com/pixelbeat&quot;&gt;Davo Galavotti&lt;/a&gt; for rendering the iPhones image.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How Blhack doubled their development speed with Polypane]]></title><description><![CDATA[We are  Blhack , an Italian software house. We develop tailor-made solutions for our customers' needs. Our technology stack is based on Ruby…]]></description><link>https://polypane.app/blog/how-blhack-doubled-their-development-speed-with-polypane/</link><guid isPermaLink="false">https://polypane.app/blog/how-blhack-doubled-their-development-speed-with-polypane/</guid><pubDate>Tue, 06 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We are &lt;a href=&quot;https://www.blhack.it/&quot;&gt;Blhack&lt;/a&gt;, an Italian software house. We develop tailor-made solutions for our customers&amp;#x27; needs. Our technology stack is based on Ruby on Rails and React. We are also very active in the e-commerce ecosystem with our Shopify offer, ranging from custom Themes to Apps.&lt;/p&gt;&lt;h2 id=&quot;blhacks-challenges&quot;&gt;Blhack’s Challenges&lt;/h2&gt;&lt;p&gt;Nowadays the expectations for the UI of a website or application are very high. To provide high quality products you always need to check that the interface is consistent at every device size. In addition, making sure that everything is accessible is an important but time consuming process.&lt;/p&gt;&lt;img src=&quot;/blogs/casestudy-blhack/blhack.polypane.png&quot; alt=&quot;&quot;/&gt;&lt;p&gt;Before Polypane we were developing one device resolution at a time, making sure to remember checking different device sizes after each new feature we implemented. Because of this manual re-checking, sometimes UI problems ended up in production before we could catch and fix them.&lt;/p&gt;&lt;h2 id=&quot;how-polypane-helped&quot;&gt;How Polypane helped&lt;/h2&gt;&lt;p&gt;Alongside Polypane we tested a number of different products with more or less the same features. Out of all the available options we found Polypane to be the best one. It is competitively priced, has a very stable desktop application and is constantly updated with new features.&lt;/p&gt;&lt;img src=&quot;/blogs/casestudy-blhack/TPC-polypane.png&quot; alt=&quot;&quot;/&gt;&lt;p&gt;By using Polypane our development time is now 50% faster.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;However, the real improvement comes from no longer missing UI problems and having to go back to fix them.&lt;/strong&gt; We pride ourselves on always respecting deadlines, but when a UI problem was discovered we needed to stop what we were doing and rush to fix it, before being able to go back to the project we were working on.&lt;/p&gt;&lt;img class=&quot;imgshadow&quot; src=&quot;/blogs/casestudy-blhack/TPC-debugging.png&quot; alt=&quot;layout debugging in Polypane.&quot;/&gt;&lt;h2 id=&quot;roi-and-future-plans&quot;&gt;ROI and future plans&lt;/h2&gt;&lt;p&gt;Now with Polypane we are able to give our customers better UIs, thoroughly tested on every device and better delivery time, no more headaches on the small details. &lt;strong&gt;We can now deliver twice the websites we were doing before!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;We are focusing a lot on custom development in Ruby on Rails by also creating Apps for the Shopify ecosystem. We want to be the one stop shop for our customers needs and provide our customers with all the knowledge and resources they need for their business.&lt;/p&gt;&lt;p&gt;Learn more about Blhack on their website &lt;a href=&quot;https://www.blhack.it/&quot;&gt;Blhack.it&lt;/a&gt; and their custom &lt;a href=&quot;https://ecommerce.blhack.it/&quot;&gt;Shopify template&lt;/a&gt; made with Polypane.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How using Polypane for Nureply helped Onur learn to love the web]]></title><description><![CDATA[Nureply is a cold emailing tool created by Onur Geneş that helps you to write automated emails with personalization and send those emails to…]]></description><link>https://polypane.app/blog/how-using-polypane-for-nureply-helped-onur-learn-to-love-the-web/</link><guid isPermaLink="false">https://polypane.app/blog/how-using-polypane-for-nureply-helped-onur-learn-to-love-the-web/</guid><pubDate>Wed, 31 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Nureply is a cold emailing tool created by Onur Geneş that helps you to write automated emails with personalization and send those emails to the people you want to reach out to. When you add your lead’s website or LinkedIn profile URL, you will get a hyper personalized icebreaker, specifically created for them. You can also upload a CSV file with info about your leads to make it really personal. Nureply helps you send personal emails at scale.&lt;/p&gt;&lt;p&gt;Onur is the solo founder of Nureply, doing everything from development to design to marketing. He is currently focusing on helping marketers, small businesses and SaaS founders to sell more through email. Onur knows the struggle, as you can read in &lt;a href=&quot;https://nureply.com/blog/why-i-created-nureply&quot;&gt;why he created Nureply&lt;/a&gt;, and wants to help other founders/owners to get more revenue. Below, he talks about his challenges setting up Nureply and how Polypane helped him.&lt;/p&gt;&lt;h2 id=&quot;nureply-challenges&quot;&gt;Nureply Challenges&lt;/h2&gt;&lt;p&gt;As a mobile developer for more than 10 years, I switched to web development to create Nureply. I had enough experience with back-end development, but not so much with front-end. Initially, using Tailwind CSS helped me take care of the front-end and solve the issues I encountered.&lt;/p&gt;&lt;p&gt;At least, that’s what I thought.&lt;/p&gt;&lt;img class=&quot;imgshadow&quot; src=&quot;/blogs/casestudy-nureply/overview.png&quot; alt=&quot;&quot;/&gt;&lt;p&gt;Unfortunately I discovered many inconsistencies checking the mobile version of the site. Even though over 75% of the visitors visit the site on desktop, that’s still one in four people that check the website from their mobile phone while on the go, and they weren’t getting a good experience. Worse, by depending on a framework to handle the mobile experience for me, I wasn’t sure how to approach improving the experience.&lt;/p&gt;&lt;h2 id=&quot;how-polypane-helped&quot;&gt;How Polypane helped&lt;/h2&gt;&lt;p&gt;I was looking for tools to see different screens at once and came across Polypane. By using the &lt;a href=&quot;/tailwindcss/&quot;&gt;built-in Tailwind CSS screen sizes&lt;/a&gt; I could quickly understand why things looked the way they do. &lt;strong&gt;Polypane helped me fix the issues and fully utilize Tailwind.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;I use a lot of different Polypane features on a daily basis like checking &lt;a href=&quot;/docs/console/&quot;&gt;console errors&lt;/a&gt;, better dark and light mode support, meta tags and how they look on different platforms.  Still as a newcomer to web development it’s going to take me some time to learn all it has to offer. &lt;strong&gt;It excites me to know that whatever I need in the future, Polypane probably has a feature ready for me.&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;roi-and-future-plans&quot;&gt;ROI and future plans&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;As a result of using Polypane my development time reduced by about 30 percent&lt;/strong&gt; when it comes to implementing the responsiveness of the website.&lt;/p&gt;&lt;p&gt;It helped me to design better experiences at different screen sizes, but it also helped me take better care of the SEO and meta data of the site, like putting my keywords into the title and description. &lt;strong&gt;It took me 2+ hours to check every change but now I don’t even have to leave Polypane and it takes less than 2 minutes!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Because of this great workflow improvement I started to love web development. When I started my development career I hated every second of working on the web but now, it is actually easy and enjoyable!&lt;/p&gt;&lt;div&gt;&lt;div style=&quot;height:0;width:100%&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;If you want to improve the way you sell your product, or want to get better clients for your agency, e-mail is the most predictable, measurable and scaleable solution. With Nureply you can automate the process without sending low quality bulk spam (which we hate!) and if you do it right the results will amaze you: our latest campaign had a 78% open rate and 3% reply rate with just the first email!&lt;/p&gt;&lt;p&gt;Nureply automates this process and the only thing left to you is checking your emails (which you already do everyday!) while Nureply takes care of the rest.&lt;/p&gt;&lt;p&gt;Learn more about Nureply on &lt;a href=&quot;https://nureply.com&quot;&gt;Nureply.com&lt;/a&gt; where you can also try it out, and you can find Onur on Twitter as &lt;a href=&quot;https://twitter.com/onurgenes&quot;&gt;@onurgenes&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How Matchless Web halved their mobile optimization time]]></title><description><![CDATA[Matchless Web Studio is a one-man web agency based in Clinton, Mississippi USA. The aforementioned one man in charge is me (Jon Phillips…]]></description><link>https://polypane.app/blog/how-matchless-web-halved-their-mobile-optimization-time/</link><guid isPermaLink="false">https://polypane.app/blog/how-matchless-web-halved-their-mobile-optimization-time/</guid><pubDate>Thu, 25 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;/blogs/casestudy-matchlessweb/jon.png&quot; alt=&quot;Photo of Jon&quot; style=&quot;float:left;margin-right:1rem;border-radius:100%;height:250px;shape-outside:circle(50%)&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;Matchless Web Studio is a one-man web agency based in Clinton, Mississippi USA. The aforementioned one man in charge is me (Jon Phillips), all-time employee of the month for 8 years and counting. My introduction to the world of web development began while I was in college studying Exercise Physiology.&lt;/p&gt;&lt;p&gt;While in grad school, I decided to start a fitness and health blog to promote my personal training and nutrition coaching services in hopes of attracting local clients I could work with to help me pay bills. Rather than build my blog on my own, I hired a friend to build a blog for me.&lt;/p&gt;&lt;p&gt;Long story short, I got a great website out of that deal. But when I was ready to add new features and functionality to the site, I couldn’t afford to pay my developer to do that work. And I certainly couldn’t figure out Concrete 5 on my own. Believe me, I tried.&lt;/p&gt;&lt;p&gt;So I took it upon myself to learn how to build a website from the ground up. I settled on WordPress as my CMS of choice as it seemed to be a pretty popular platform with plenty of free resources available online. YouTube University and a lot of Googling helped get me off the ground with learning WordPress. I quickly realized my newfound skills would be valuable to anyone who needed a website and, like “old me”, would be willing to pay someone to handle it for them.&lt;/p&gt;&lt;img class=&quot;imgshadow&quot; src=&quot;/blogs/casestudy-matchlessweb/screenshot.png&quot; alt=&quot;&quot;/&gt;&lt;p&gt;In 2020, my interests in WordPress page speed and performance lead me to create my first digital product - a &lt;a href=&quot;https://holygrailwp.com/&quot;&gt;course on WordPress Site Speed Optimization&lt;/a&gt;. Nowadays, I focus on building websites optimized for performance. And I teach others how to make their WordPress websites fast.&lt;/p&gt;&lt;h2 id=&quot;challenges&quot;&gt;Challenges&lt;/h2&gt;&lt;p&gt;When it comes to making websites mobile-friendly, that’s a task I’ve historically found to be daunting. When you’re editing within WordPress, you don’t exactly get a sense of how a page might look when viewed on specific devices. &lt;strong&gt;Yes, most builders provide default breakpoints&lt;/strong&gt; for desktop, tablet, and mobile, but &lt;strong&gt;I’d be lying if I said those breakpoints are sufficient to optimize a site for mobile&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Prior to discovering Polypane, I wasted an innumerable number of hours trying to optimize layouts for mobile. I’m glad I can’t remember the exact number, because I’d be embarrassed to know at this point.&lt;/p&gt;&lt;p&gt;I knew there had to be a better way of optimizing for multiple device sizes at once, but I didn’t know of a tool that would allow me to preview my sites across multiple devices without whatever app I was using becoming painfully slow and/or having a UI that wasn’t wasn’t pleasant to use.&lt;/p&gt;&lt;p&gt;Truth be told, I don’t recall the names of the websites or apps I attempted to use before discovering Polypane. I just know I tried several tools and wasn’t thrilled with anything I came across. They were clunky and introduced friction into my workflow instead of taking it away. I’m a sucker for a great UI. And I found that in Polypane. The interface feels the way I need a tool like this to feel, strange as that may sound.&lt;/p&gt;&lt;h2 id=&quot;how-polypane-helped&quot;&gt;How Polypane helped&lt;/h2&gt;&lt;p&gt;Polypane has sped up my workflow by a margin of 3-4 hours for every website project I’ve worked on since I’ve been using it. That’s 3-4 fewers hours spent troubleshooting CSS at different breakpoints and editing media queries.&lt;/p&gt;&lt;p&gt;I still don’t love optimizing websites for mobile. But it’s not a task I dread like I once did. &lt;strong&gt;Now that I breeze through my mobile optimizations with Polypane to preview my sites, every one of my projects have been more profitable than before.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;I watched several demos on Youtube of Kilian walking users through how to use Polypane on their own site(s). My initial attraction to Polypane was the time savings I knew it would deliver on all my website builds. But by watching the demos and ultimately taking Polypane for a free trial, I learned just how much Polypane could do beyond just helping me troubleshoot CSS.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Once I realized just how much value was packed into this tool, it was a no-brainer to purchase.&lt;/strong&gt; I’m still learning tons about website accessibility, and there’s no other tool I’ve found that can highlight room for improvement in the area of accessibility like Polypane.&lt;/p&gt;&lt;div style=&quot;position:relative;width:100%;padding-top:56.25%&quot;&gt;&lt;a id=&quot;video&quot; style=&quot;position:absolute;top:-100px&quot;&gt;&lt;/a&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/aKLXV9YBI38&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; style=&quot;position:absolute;top:0px;left:0px;width:100%;height:100%&quot; frameBorder=&quot;0&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;h2 id=&quot;roi-and-future-plans&quot;&gt;ROI and future plans&lt;/h2&gt;&lt;p&gt;As mentioned earlier, Polypane has sped up my workflow by a margin of 3-4 hours for every website project I’ve worked on since I’ve been using it. &lt;strong&gt;My time required to make mobile optimizations has easily been cut in half!&lt;/strong&gt; Polypane has been proven to be a true time saver in my daily work life.&lt;/p&gt;&lt;p&gt;At the time I purchased Polypane, I wasn’t aware of &lt;a href=&quot;/docs/web-vitals/&quot;&gt;the Core Web Vitals integration&lt;/a&gt;. Maybe it wasn’t present at the time I purchased it, but I wouldn’t put it past myself to have overlooked it. I had no idea I could get Core Web Vitals at any breakpoint I wanted!&lt;/p&gt;&lt;p&gt;As I was pleased to discover, Core Web Vitals can be displayed for any panes you have open in Polypane. It’s an excellent way to get an idea of how a page of a website is performing in terms of Web Vitals across multiple device sizes all at once. You can’t even get that with Google’s own tests like Lighthouse and Page Speed Insights!&lt;/p&gt;&lt;p&gt;This present surprise makes it possible to test Core Web Vitals in a lab environment across more device sizes than Google’s native tools allow. &lt;strong&gt;It’s a game changer for anyone interested in optimizing websites for performance.&lt;/strong&gt;&lt;/p&gt;&lt;img src=&quot;/doc-img/webvitals.png&quot; class=&quot;imgshadow&quot; alt=&quot;&quot;/&gt;&lt;p&gt;I’m faster when optimizing my sites for mobile across a variety of popular device viewports. And can readily identify Core Web Vital culprits when it’s time to debug a site prior to launch. &lt;strong&gt;In short, Polypane helps me get high performing websites built and launched faster. And that means more projects can come into my pipeline than ever before because I’ve freed up the bandwidth to take on more work when I want it.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Today, my work revolves around WordPress performance and page speed optimizations. If you’re tired of refreshing your website hoping for improved Page Speed Insights scores to no avail, &lt;a href=&quot;https://matchlessweb.com&quot;&gt;we should connect&lt;/a&gt;. I’m available for hire if you want someone (who isn’t you) to handle all your WordPress performance needs.&lt;/p&gt;&lt;p&gt;Anyone interested in making their WordPress site(s) faster should check out my &lt;a href=&quot;https://holygrailwp.com/course/wordpress-site-speed/&quot;&gt;FREE WordPress Site Speed mini-course&lt;/a&gt; here. There’s a paid course for those that want to take their website’s performance to the next level. And if you have questions about site speed optimization, &lt;a href=&quot;https://holygrailwp.circle.so/c/start-here&quot;&gt;join my free Circle community&lt;/a&gt; where the topics of conversation are always centered around WordPress speed and performance.&lt;/p&gt;&lt;p&gt;Premium community members get additional access to me every month including live Zoom office hours where we talk shop and sometimes tackle community member’s performance issues for everyone’s benefit. Connect with like minded WordPress speed junkies and hone your site speed skills over at &lt;a href=&quot;https://holygrailwp.com/&quot;&gt;HolyGrailWP.com&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How Short Hills Design saves over $700 per year thanks to Polypane]]></title><description><![CDATA[Short Hills design is a closely-knit team of six located in the USA, UK, Canada and Finland that helps healthcare and other professional…]]></description><link>https://polypane.app/blog/how-short-hills-design-saves-over-700-per-year-thanks-to-polypane/</link><guid isPermaLink="false">https://polypane.app/blog/how-short-hills-design-saves-over-700-per-year-thanks-to-polypane/</guid><pubDate>Thu, 18 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Short Hills design is a closely-knit team of six located in the USA, UK, Canada and Finland that helps healthcare and other professional small business service providers get 10-20 new patients/clients per month without spending a fortune on paid advertising.&lt;/p&gt;&lt;img src=&quot;/blogs/casestudy-shorthills/image4.png&quot; alt=&quot;Short Hills Design&quot;/&gt;&lt;p&gt;&lt;a href=&quot;https://www.shorthillsdesign.com/&quot;&gt;Short Hills design&lt;/a&gt; has been in business since 2008, and we are proud to have clients across the United States and Canada. We build conversion-oriented, SEO-optimized WordPress websites, and offer a la carte marketing services including Local SEO, traditional SEO, and performance-based PPC management.&lt;/p&gt;&lt;p&gt;As we build and maintain a large number of WordPress websites, we naturally needed a way to be able to check to make sure that our sites look great at all responsive breakpoints. It’s an especially important need for our non-page builder sites such as our Genesis sites and our sites based on our custom, codex-based baseline theme.&lt;/p&gt;&lt;h2 id=&quot;challenges&quot;&gt;Challenges&lt;/h2&gt;&lt;p&gt;In the past we used products such as Browserstack where we could fire up an emulator to see our sites in real-time. This approach proved to be very costly and time consuming.&lt;/p&gt;&lt;p&gt;We then shifted to responsive screenshot software which was faster in picking up responsive issues, but was insufficient especially with JavaScript heavy sites with delayed loading. Thus, we needed some type of hybrid between a live device and a responsive screenshot generator.&lt;/p&gt;&lt;h2 id=&quot;how-polypane-helped&quot;&gt;How Polypane helped&lt;/h2&gt;&lt;p&gt;After looking for online services to solve the problem, we discovered that there were apps we could use and test our sites directly from our desktops and began to explore that approach.&lt;/p&gt;&lt;p&gt;We tested a few alternatives and ultimately decided to go with Polypane. The deciding factor was the interface – it wasn’t cluttered and we could use the built-in device panels to quickly test our sites. We have two licenses and will likely need more in the future as we grow.&lt;/p&gt;&lt;h3 id=&quot;workflow-example&quot;&gt;Workflow example&lt;/h3&gt;&lt;p&gt;We put out a blog post about &lt;a href=&quot;https://www.shorthillsdesign.com/google-analytics/google-analytics-is-dead-long-live-google-analytics/&quot;&gt;our Google Analytics migration services&lt;/a&gt; when I realized that the page was fully justified on mobile. So I ran a check to see if it was just one breakpoint – or all of them:&lt;/p&gt;&lt;img class=&quot;imgshadow&quot; src=&quot;/blogs/casestudy-shorthills/image1.jpg&quot; alt=&quot;&quot;/&gt;&lt;p&gt;Seeing that it was all of them, I was able to quickly patch the CSS of the &lt;code class=&quot;language-text&quot;&gt;.single&lt;/code&gt; class in order to fix the problem.&lt;/p&gt;&lt;img class=&quot;imgshadow&quot; src=&quot;/blogs/casestudy-shorthills/image2.jpg&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;strong&gt;So within a few minutes, I was already confident that the temporary fix worked and that our post would display properly.&lt;/strong&gt; I could then take a breath and without frantically rushing, carefully dig deeper to figure out why the page was rendering incorrectly in the first place, and to add a definitive fix.&lt;/p&gt;&lt;h2 id=&quot;roi-and-future-plans&quot;&gt;ROI and future plans&lt;/h2&gt;&lt;p&gt;Conservatively, we save approximately 2-4 testing hours per build by being able to perform responsive testing directly on the desktop. Considering that our average development phase of a website build takes us around 28 hours, saving 2-4 hours is a 7-14% reduction in build time.&lt;/p&gt;&lt;p&gt;It’s made our workflow more efficient by saving us time with responsive testing. Polypane is also fantastic for when we have to make updates on older sites (non-page builders) since responsive testing on these types of sites often requires multiple iterations of HTML and CSS. It’s 1000x easier to hit &lt;kbd class=&quot;ShortcutDisplay-styles-module--shortcutdisplay--318pA&quot; aria-label=&quot;Shortcut: ⌘ r&quot;&gt;⌘ r&lt;/kbd&gt; than it is to run a new set of screenshots or fire up an emulator every time we need to check a tweak.&lt;/p&gt;&lt;p&gt;We were initially looking to have a more efficient way to perform responsive testing so I figured that Polypane would save us time, but I didn’t anticipate that it would save money as well.&lt;/p&gt;&lt;p&gt;At $108 per license per year, the cost is well worth it for the functionality we need. And while not every responsive testing suite runs as a desktop application in a dedicated browser like Polypane does, the product we had used previously would have cost us a little over $900 per year for the same two licenses. Thus our switch to Polypane saves us $700 per year. &lt;strong&gt;The fact that Polypane saves us money in software costs and in development costs (increasing net profit) is a welcome bonus.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Short Hills Design is a closely-knit team of six located in the USA, UK, Canada and Finland that helps healthcare clients and professional service companies get more new patients/clients online in an efficient, affordable, and stress-free manner. Our clients see us as their trusted advisors, and in turn we encourage our clients to take the reins on their own websites, and bring us in to help as much as they’d like, or as little as they like.&lt;/p&gt;&lt;p&gt;You can find us at &lt;a href=&quot;https://www.shorthillsdesign.com/&quot;&gt;shorthillsdesign.com&lt;/a&gt; and on Twitter at &lt;a href=&quot;https://twitter.com/shorthillsd&quot;&gt;@shorthillsd&lt;/a&gt;. Be sure to check out &lt;a href=&quot;https://www.youtube.com/user/ShortHillsDesign/&quot;&gt;our growing ShortHillsDesign YouTube channel&lt;/a&gt; where we release videos to help our clients make informed marketing decisions, and share tips for other agencies who can hopefully benefit from our experience.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 10: detachable panel, navigation sync, element screenshots and more]]></title><description><![CDATA[Polypane 10 brings a number of often requested workflow features to Polypane: a detachable panel, the ability to turn off navigation sync…]]></description><link>https://polypane.app/blog/polypane-10-detachable-panel-navigation-sync-element-screenshots-and-more/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-10-detachable-panel-navigation-sync-element-screenshots-and-more/</guid><pubDate>Fri, 05 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 10 brings a number of often requested workflow features to Polypane: a detachable panel, the ability to turn off navigation sync for panes and element screenshots. It also updates Polypane to Chromium 104, adds more features in the screenshot editor and has more accurate color blindness simulators.&lt;/p&gt;&lt;h2 id=&quot;detachable-panel&quot;&gt;Detachable panel&lt;/h2&gt;&lt;p&gt;By far the most requested workflow improvement in Polypane was to be able to show the panel in its own window. It took nearly 50 hours to get it done but it&amp;#x27;s here!&lt;/p&gt;&lt;img src=&quot;static/ui-panel-91612515ebd0c556856f3debff64245e.png&quot; alt=&quot;Polypane on mac with a detached panel showing the element inspector.&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;/&gt;&lt;p&gt;This is ideal in a multi monitor setup or with a wide screen, where you can have the panel on a different window without it obscuring the panes in Polypane. Its position and size are of course remembered, and everything else works as you expect it to work. I hope you like it!&lt;/p&gt;&lt;h2 id=&quot;disable-navigation-sync&quot;&gt;Disable navigation sync&lt;/h2&gt;&lt;p&gt;Another often requested feature was to have the ability to turn off the navigation sync between panes. With this feature you can have your live site and your in-development site shown side-by-side, making it easy to compare the two.&lt;/p&gt;&lt;p&gt;You can turn navigation sync off per pane in the &lt;a href=&quot;/docs/emulation/#network-emulation&quot;&gt;emulation settings&lt;/a&gt;, after which the pane title changes into a mini-address bar. A broken link icon tells you that navigation sync is off for that pane.&lt;/p&gt;&lt;video src=&quot;static/navsync-9a6f71522c1321809c87e4147178204d.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;What&amp;#x27;s neat about this feature is that all other things can still be synced, so you can have two separate domains, but clicking links will still let you end up on the right page. Or you can &lt;a href=&quot;/docs/synced-interactions/&quot;&gt;turn off click syncing&lt;/a&gt; and compare two pages on the same site.&lt;/p&gt;&lt;p&gt;But there&amp;#x27;s way more that this enables. You could have a pane with your design system open and since all the inspection tools still work in unsynced panes you could quickly get values from your design system, and apply them to your website. And I&amp;#x27;m sure there&amp;#x27;s more use-cases to come up with (let me know what you end up using this for!)&lt;/p&gt;&lt;h3 id=&quot;all-other-polypane-features-still-work&quot;&gt;All other Polypane features still work!&lt;/h3&gt;&lt;p&gt;You can inspect an element using &lt;a href=&quot;/docs/polypane-peek/&quot;&gt;Polypane peek&lt;/a&gt; and if both pages share the same element (like a header), Polypane will still show the tooltip in both panes. The Elements panel will automatically switch between the two pages depending on where you inspect an element and the Polypane console will collect console messages from both panes (and let you execute console commands in both!)&lt;/p&gt;&lt;p&gt;This will dramatically speed up any work you need to do across pages or domains.&lt;/p&gt;&lt;h3 id=&quot;duplicate-panes&quot;&gt;Duplicate panes&lt;/h3&gt;&lt;p&gt;A somewhat related feature that has been on our backlog for years is the ability to duplicate a pane. Each pane now has a &lt;code class=&quot;language-text&quot;&gt;+&lt;/code&gt; button that creates a duplicate of that pane with all the same settings.&lt;/p&gt;&lt;p&gt;Configure a pane the way you like it, then duplicate it and show a different site in it to compare. Thanks &lt;a href=&quot;https://twitter.com/samkaizen&quot;&gt;Sam&lt;/a&gt; for first requesting this!&lt;/p&gt;&lt;video src=&quot;static/duplicate-4fbdf3ded3eb3ab0c1ee95569e6acb0d.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;h2 id=&quot;screenshot-updates&quot;&gt;Screenshot updates&lt;/h2&gt;&lt;p&gt;We&amp;#x27;ve made various improvements to the screenshots workflow: you can now make screenshots of individual elements, we have new annotation and saving features and we fixed an issue with overview screenshots when you have more than 14 separate panes.&lt;/p&gt;&lt;h3 id=&quot;single-element-screenshots&quot;&gt;Single element screenshots&lt;/h3&gt;&lt;p&gt;Instead of creating a viewport or full page screenshot, you can now also select &amp;quot;Element&amp;quot;. Once selected you can hover over the pane to select which element to screenshot. Ideal for screenshotting smaller UI elements for your swipe file or to share in issue tickets.&lt;/p&gt;&lt;video src=&quot;static/elementscreenshot-62d4a34e6455c871a33f7124a84ebba0.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;If clicking an element in the pane is difficult, you can also select the element in the &lt;a href=&quot;/docs/elements-panel/&quot;&gt;elements panel&lt;/a&gt; and click the screenshot button there. I was planning on adding this feature eventually (it&amp;#x27;s been on the backlog since 2019), but &lt;a href=&quot;https://yatil.net&quot;&gt;Eric&lt;/a&gt; successfully &lt;em&gt;nerd sniped&lt;/em&gt; me into thinking about it for a day or two, after which I implemented it in a single morning.&lt;/p&gt;&lt;h3 id=&quot;emoji-and-redlines-in-screenshot-editor&quot;&gt;Emoji and redlines in screenshot editor&lt;/h3&gt;&lt;p&gt;The screenshot editor now has two additional options: There&amp;#x27;s a full emoji picker to let you pick from all emojis in the 13.1 unicode set, and a way to draw redlines on top of the image.&lt;/p&gt;&lt;video src=&quot;static/emoji-ad34b5a7308164413d6dbd7cf44004ce.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;The emoji picker shows all the emojis in their categories and also lets you search through them.&lt;/p&gt;&lt;p&gt;Whenever you select an emoji it will be added to the quick-select list so you always have the most used emoji available.&lt;/p&gt;&lt;video src=&quot;static/measure-46a0735715f0987d21425dc1dcd2df7e.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;&amp;quot;Measure&amp;quot; lets you quickly annotate sizes in screenshot with &amp;quot;redlines&amp;quot;. The length of a line is automatically shown on top of it and by holding &lt;code class=&quot;language-text&quot;&gt;shift&lt;/code&gt; it snaps horizontally, vertically or diagonally. This way annotating the size of elements becomes a snap!&lt;/p&gt;&lt;h3 id=&quot;save-as-png-jpeg-or-pdf&quot;&gt;Save as PNG, JPEG or PDF&lt;/h3&gt;&lt;p&gt;Screenshots were always saved as lossless PNGs. Now you can choose to save the images as JPEG or PDF as well. Pick the format that works best for your situation right in the app instead of having to convert them in a third party tool.&lt;/p&gt;&lt;img src=&quot;data:image/png;base64,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&quot; alt=&quot;Screenshot editor saving bar with new &amp;#x27;format&amp;#x27; option highlighted.&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;/&gt;&lt;h2 id=&quot;meta-panel-updates&quot;&gt;Meta panel updates&lt;/h2&gt;&lt;p&gt;Even though social media sites never really advertise it, they frequently tweak the design of their previews. Sometimes more overtly (adding or removing icons) and sometimes more subtly (slightly different shades of grey) so we always have something to update with each release and this release is no different. We&amp;#x27;ve also added support for showing the content of the humans.txt file if it exists.&lt;/p&gt;&lt;h3 id=&quot;updated-social-media-previews&quot;&gt;Updated social media previews&lt;/h3&gt;&lt;p&gt;This time round we&amp;#x27;ve updated the Twitter summary social media cards, the Telegram web preview and the Discord previews. All of them had subtle updates to the design, and Telegram and Discord also updated which meta data they give preference to. Polypane&amp;#x27;s now fully up-to-date with all three of them again! Thanks &lt;a href=&quot;https://charliejoseph.com&quot;&gt;Charlie&lt;/a&gt; and Hiro for letting me know about these updates.&lt;/p&gt;&lt;h3 id=&quot;humanstxt&quot;&gt;Humans.txt&lt;/h3&gt;&lt;img src=&quot;static/humans-f74a906474fc3b79d2157622572f0e9d.png&quot; alt=&quot;Humans.txt for this website&quot; class=&quot;imgshadow&quot; style=&quot;margin:0 0 0 1rem;float:right;max-width:100%&quot;/&gt;&lt;p&gt;While robots.txt is the file where you set information for crawlers, &lt;a href=&quot;https://humanstxt.org/&quot;&gt;Humans.txt&lt;/a&gt; is the file where you add information for, you guessed it, humans. It&amp;#x27;s a pretty loose spec but the idea is to give an overview of the people behind a website as well as allowing some information on the site itself. It&amp;#x27;s fun to read through when a site has it, so that&amp;#x27;s why Polypane now shows it in the overview.&lt;/p&gt;&lt;p&gt;While implementing this I spotted that none other than Polypane user &lt;a href=&quot;https://rowdy.codes&quot;&gt;Rowdy&lt;/a&gt; contributed the Dutch translation for the &lt;a href=&quot;https://humanstxt.org/&quot;&gt;Humans.txt&lt;/a&gt; website. How cool is that!&lt;/p&gt;&lt;h2 id=&quot;elements-panel-updates&quot;&gt;Elements panel updates&lt;/h2&gt;&lt;p&gt;We&amp;#x27;ve added some new features to the elements panel, as well as improved the CSS fetching and parsing we do under the hood to make sure we capture all the CSS styles applied to an element.&lt;/p&gt;&lt;h3 id=&quot;highlight-all-matching-elements&quot;&gt;Highlight all matching elements&lt;/h3&gt;&lt;p&gt;Each CSS selector in the Style tab now has a &lt;code class=&quot;language-text&quot;&gt;[+]&lt;/code&gt; icon you can click to highlight all the elements that match the selector across all panes, so you can quickly see what editing those styles will affect.&lt;/p&gt;&lt;video src=&quot;static/highlightnodes-03f99006af607782c62ce095ae4edae4.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;h3 id=&quot;element-screenshot-button&quot;&gt;Element Screenshot button&lt;/h3&gt;&lt;p&gt;The screenshot button in the element info will let you screenshot that element right from the element panel, without first having to select it in a pane.&lt;/p&gt;&lt;img src=&quot;static/screenshotbutton-abfa1d765de421e692b88a2ba10655bb.png&quot; alt=&quot;Element inspector with the screenshot button highlighted&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;/&gt;&lt;p&gt;Ideal if you just made some changes to the styling or content of an element and then want to share the updated design.&lt;/p&gt;&lt;h3 id=&quot;better-access-to-css-files&quot;&gt;Better access to CSS files&lt;/h3&gt;&lt;p&gt;We&amp;#x27;ve also improved the way we access CSS files so even the CSS in files with prohibitive access headers can properly be shown in the elements panel. The result is that for more sites we can show all the CSS that&amp;#x27;s being applied to an element. You shouldn&amp;#x27;t really expect to notice anything about this for 95%+ of the websites.&lt;/p&gt;&lt;h2 id=&quot;new-color-blindness-simulators&quot;&gt;New color blindness simulators&lt;/h2&gt;&lt;p&gt;We now use more modern and accurate models for our Protanopia, Deuteranopia and Tritanopia color blindness simulators, based on recent scientific research. These will give a more truthful visualization of how people with these types of color blindness experience your pages.&lt;/p&gt;&lt;img src=&quot;static/colorblindness-f53a3b74be9179dbee7a04b4f058033f.png&quot; alt=&quot;Three panes with deuteranopia, protanopia and tritanopia emulations&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;/&gt;&lt;h2 id=&quot;other-updates&quot;&gt;Other updates&lt;/h2&gt;&lt;p&gt;There is a whole slew of other updates and bug fixes as well so be sure to scroll through the &lt;a href=&quot;#changelog&quot;&gt;changelog&lt;/a&gt; to see if anything catches your eye, but here are a few I wanted to highlight.&lt;/p&gt;&lt;h3 id=&quot;custom-headers-ui&quot;&gt;Custom headers UI&lt;/h3&gt;&lt;p&gt;The UI to add custom headers is now a little bit smarter. Instead of a freeform text field you can now add headers one by one (like our &lt;a href=&quot;/docs/storage-panel/&quot;&gt;storage panel&lt;/a&gt;, which we also gave a small UI update) and we will auto-suggest known headers as you fill them in.&lt;/p&gt;&lt;img src=&quot;static/customheaders-cc763299a7c1264033bed7fa8cc4e1d8.png&quot; alt=&quot;Custom headers overview with a few filled-in headers&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;/&gt;&lt;h3 id=&quot;custom-formatting-with-prettier&quot;&gt;Custom formatting with Prettier&lt;/h3&gt;&lt;p&gt;Polypane formats CSS and HTML in multiple places like the &lt;a href=&quot;/docs/live-css/&quot;&gt;Live CSS panel&lt;/a&gt;, the &lt;a href=&quot;/docs/source-panel/&quot;&gt;Source Panel&lt;/a&gt; and when copying CSS snippets from the &lt;a href=&quot;/docs/elements-panel/&quot;&gt;Elements Panel&lt;/a&gt;. For this we use our own formatting rules and that&amp;#x27;s great most of the time, but very annoying when you use different formatting rules and need to reformat everything copied into your project.&lt;/p&gt;&lt;p&gt;So we now support &lt;a href=&quot;/docs/live-css/#custom-formatting-with-prettier&quot;&gt;setting custom Prettier settings&lt;/a&gt; so you can make Polypane format code the same as your project, making copying code seamless. This was an excellent user request by Mathieu, thanks!&lt;/p&gt;&lt;h3 id=&quot;automatically-filtered-out-of-simple-analytics-stats&quot;&gt;Automatically filtered out of Simple Analytics stats&lt;/h3&gt;&lt;p&gt;If you use &lt;a href=&quot;https://simpleanalytics.com/?ref=polypane&quot;&gt;Simple Analytics&lt;/a&gt; for your visitor stats, any visit with Polypane is now automatically filtered out of the results without you having to do anything. This means you no longer have to conditionally load your Simple Analytics script to prevent the many page loads in Polypane from ending up in your stats.&lt;/p&gt;&lt;p&gt;Together with the folks at Simple Analytics we came up with a nice solution that doesn&amp;#x27;t require users of either Simple Analytics or Polypane to do anything. Thanks to Adriaan from Simple Analytics for making this happen, and thanks to &lt;a href=&quot;hhttps://www.linkedin.com/in/mikeverbruggen/&quot;&gt;Mike&lt;/a&gt; for first asking the both of us if we could implement something like it.&lt;/p&gt;&lt;h2 id=&quot;updated-chromium&quot;&gt;Updated Chromium&lt;/h2&gt;&lt;p&gt;Chromium has been updated to &lt;strong&gt;104.0.5112.81&lt;/strong&gt;, and ships with a number of experimental features turned on by default, like support for the page transition API, container queries, CSS Scopes and &lt;code class=&quot;language-text&quot;&gt;:has()&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Head over to our docs on &lt;a href=&quot;/docs/experimental-chromium-features/&quot;&gt;Experimental Chromium Features&lt;/a&gt; for a full overview of the available APIs. If you&amp;#x27;d like to see one activated, &lt;a href=&quot;/support/&quot;&gt;Let us know&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;get-polypane-10&quot;&gt;Get Polypane 10&lt;/h2&gt;&lt;p&gt;Polypane is available for Windows, Mac and Linux (.deb or AppImage) in both 64 bit and ARM versions.&lt;/p&gt;&lt;p&gt;Polypane automatically updates on Mac, Windows and on Linux when using the AppImage. Otherwise, go to
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; to download the latest version!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Try it for free&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;h3 id=&quot;removal-notice&quot;&gt;Removal notice&lt;/h3&gt;&lt;p&gt;Polypane 10 removes the HTML5 Document Outline in the Outline panel. It was never properly implemented anywhere, but recently has also been removed from the official specification. since you should not use it to base decisions on, we decided to remove it from Polypane.&lt;/p&gt;&lt;h2 id=&quot;polypane-1001-changelog&quot;&gt;Polypane 10.0.1 Changelog&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; issue causing custom panes to continuously reload&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;polypane-10-changelog&quot;&gt;Polypane 10 Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;New Features&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Panel can now be detached from main window&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Ability to turn off navigation sync&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Element screenshots (Thanks Eric!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Emoji picker in Screenshot Editor&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Redlines in Screenshot Editor&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Screenshots editor: Save as PNG, JPG or PDF&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Duplicate pane option (Thanks Sam!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Humans.txt is now shown in Meta panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Custom Prettier settings support for Live CSS, Source and Elements panel (Thanks Mathieu!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; UI and auto-suggestions for custom headers&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Elements panel: Highlight all matching elements feature&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; More accurate color blindness simulators&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Dark mode: Improve contrast of text&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Global zoom: Auto-select the entire number when clicking (Thanks Bryce!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: take presentational headers into account when testing for issues&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: overlays now show tags above element&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Storage panel: updated design with better alignments&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Storage panel: input fields now work the same as elsewhere in the app&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Automatically scroll value suggestions into view (Thanks Ferry!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Add icon for box model button&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Better access to CSS files with access control headers&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Inspect element shortcut now picks Elements Panel or Chromium devtools depending on settings&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Update Telegram Web preview (Thanks Hiro!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: update Hover style of Twitter summary cards&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta Panel: Improved Discord previews (Thanks Charlie!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Chromium: Add support for CSS Scopes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Add more space around navigation buttons (Thanks Jay!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Add more space around pane management icons&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Favicons are now extracted from the current panes rather than extracted from a background fetched page&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Red borders around panes for disabled CSS and Chaos test debug tools and offline panes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Device list now scrolls items into view when using the arrow keys&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; New Pixel 5 device preset&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; New panes always use the current color-scheme&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Use correct background color in screenshots for pages that have no specified background color&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Active navigation is cancelled before starting a new navigation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated Accessibility rules&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated Google fonts&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Removals&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Removed&lt;/strong&gt; HTML5 Document Outline removed from Outline panel&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent console error for sites collecting sourcemaps (Thanks Mitchell!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent vertical scrolling with height: auto panes and global zoom in horizontal layout&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;window.__polypane&lt;/code&gt; issue with height: auto panes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; overview screenshots with 14+ panes never resolving&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Color picker for left-aligned panel is now visible&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: remove unneeded vertical height in a11y tab&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: Add style now automatically grows to fit content&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Outline panel: show warning for top level URLs missing &lt;code class=&quot;language-text&quot;&gt;aria-current&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Console panel: &lt;code class=&quot;language-text&quot;&gt;%c&lt;/code&gt; messages were showing the styling as well&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Console panel: various display issues&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Devtools extension dropdown rendering issue&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Color picker for rulers now repositions when needed&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Vue-cli HTML5 navigation sync works again (Thanks Tim and Josee!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Device list arrow keys didn&amp;#x27;t select last device when pressing up&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Inline stylesheet option always inlined stylesheets even when off&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Noto Sans JP font causing performance issues (Thanks Hiro!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Row overlay always used the default color&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Polypane 9.1: Form autofilling, fast overview screenshot and outline panel overlays]]></title><description><![CDATA[Polypane 9.1 comes with new features to quickly test forms, a much faster and robust overview screenshot feature, support for the INP web…]]></description><link>https://polypane.app/blog/polypane-9-1-form-autofilling-fast-overview-screenshot-and-outline-panel-overlays/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-9-1-form-autofilling-fast-overview-screenshot-and-outline-panel-overlays/</guid><pubDate>Tue, 21 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 9.1 comes with new features to quickly test forms, a much faster and robust overview screenshot feature, support for the INP web vital and a new way to show the heading and landmark structure inside the panes. We&amp;#x27;ve also added new functionality to the screenshot editor, made it easier to customize your default tab settings and many other features. Read on for the full details.&lt;/p&gt;&lt;h2 id=&quot;autofill-forms-and-custom-debug-value-testing&quot;&gt;Autofill forms and custom debug value testing&lt;/h2&gt;&lt;p&gt;When testing forms, the last thing you want to do is manually fill in all the values (even if they get synced across all panes). That&amp;#x27;s why we added two new features to Polypane to help you quickly test an entire form, and to test with specific values for debugging, data handling and error messages.&lt;/p&gt;&lt;p&gt;The &amp;quot;Autofill Form&amp;quot; option appears whenever you right-click inside a form. With it, Polypane automatically fills in reasonable data for all the elements based on autofill attributes, input types, element names and placeholders.&lt;/p&gt;&lt;video src=&quot;/doc-img/autofill/autofill.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;And when you have form syncing turned on, that will be correctly synced across all panes as well. In addition to &amp;quot;Autofill Form&amp;quot; you can also quickly clear any form by selecting the &amp;quot;Clear Form&amp;quot; option.&lt;/p&gt;&lt;p&gt;But there&amp;#x27;s more to just filling an entire form. You also want to test various different types of values, like &lt;span role=&quot;note&quot; title=&quot;non-standard&quot; aria-label=&quot;non-standard&quot;&gt;ñôń-ßþáñðá®ð&lt;/span&gt; characters, buggy values and potential exploits. That&amp;#x27;s what the new &amp;quot;Custom Value&amp;quot; option lets you do. It also gives you quick access to valid (test) credit card data, lorem ipsum and other handy snippets.&lt;/p&gt;&lt;p&gt;Right-click any form element and select values from a large list of categories to fill into the form. You can use this to test error handling, find security issues and verify data-integrity.&lt;/p&gt;&lt;video src=&quot;/doc-img/autofill/customvalues.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;Though we have an extensive list of categories of custom values, do let us know if you&amp;#x27;re missing something! We&amp;#x27;re happy to add them.&lt;/p&gt;&lt;h2 id=&quot;screenshot-updates&quot;&gt;Screenshot updates&lt;/h2&gt;&lt;p&gt;We are thrilled with the response we&amp;#x27;ve gotten to your new screenshot workflow in Polypane 9 and we&amp;#x27;ve been improving and expanding on that foundation in this release.&lt;/p&gt;&lt;h3 id=&quot;fast-overview-screenshot&quot;&gt;Fast overview screenshot&lt;/h3&gt;&lt;p&gt;Like our regular screenshots, the overview screenshot also happened in a background process. This was the cause of many small bugs related to page loads, rendering bugs and overall just meant it took quite a long time to create a screenshot.&lt;/p&gt;&lt;p&gt;We now use the same method we use for pane screenshots to create the new overview screenshot, making it faster than ever and making it easy for you to annotate or redact the overview screenshot.&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-9-1/fast-overview-screenshot.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;h3 id=&quot;add-numbers-feature&quot;&gt;Add numbers feature&lt;/h3&gt;&lt;p&gt;We&amp;#x27;ve added a new button to the stickers option in the screenshot editor that will let you add different numbers to the screenshot quickly. This is useful to explain ordering issues, or to refer to when adding the screenshot to a ticket or e-mail. Thanks to Eric for requesting this feature!&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-9-1/enumerate.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;h2 id=&quot;outline-panel-overlays&quot;&gt;Outline panel overlays&lt;/h2&gt;&lt;p&gt;The overviews in the outline panel are great when building or testing a website because they quickly show if your site structure makes sense, but if you&amp;#x27;re auditing a page often you&amp;#x27;ll want to visualize issues more easily.&lt;/p&gt;&lt;p&gt;That&amp;#x27;s why we now support overlays not just for the focus order, but also for all the other overviews. You can now turn on the overlay, create a full page screenshot and add it to your reports for a quick visual overview of the structure and any issues that Polypane found:&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9-1/outlineoverlay.png&quot; class=&quot;imgshadow&quot; alt=&quot;The headings on the Polypane homepage highlighted in three different panes&quot;/&gt;&lt;p&gt;The new overlays are available for:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Headings&lt;/li&gt;&lt;li&gt;Landmarks&lt;/li&gt;&lt;li&gt;Links&lt;/li&gt;&lt;li&gt;Images&lt;/li&gt;&lt;li&gt;&lt;em&gt;Focus order (was already available)&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;They will show the warnings already displayed in the outline panel right on the page so all the same information can be communicated outside of Polypane. Perfect for when you want to quickly see in-context whether an alt-text makes sense for an image, if a heading level matches its visual prominence and more.&lt;/p&gt;&lt;h2 id=&quot;interaction-to-next-paint-inp-web-vital&quot;&gt;Interaction to Next Paint (INP) Web vital&lt;/h2&gt;&lt;p&gt;The new &amp;quot;Interaction to Next Paint&amp;quot; web vital is similar to &amp;quot;First Input Delay&amp;quot;, except it continuously monitors your web page for how responsive it is to user input. The web vitals tooltip monitors this new value (it can change as you use the page) and also shows you how well the page scores globally using CrUX data.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9-1/inp.png&quot; class=&quot;imgshadow&quot; alt=&quot;Web vitals overview with INP highlighted.&quot;/&gt;&lt;h2 id=&quot;new-tab-customization&quot;&gt;New Tab customization&lt;/h2&gt;&lt;p&gt;Polypane has had a few tricks that let you customize the new tab behavior, like remembering the last-chosen layout, or letting you set any tab as the default template for new tabs. We&amp;#x27;re adding two new features that should make it a little easier to keep your favorite configurations around.&lt;/p&gt;&lt;h3 id=&quot;workspace-as-new-tab&quot;&gt;Workspace as new tab&lt;/h3&gt;&lt;p&gt;Each workspace can now be set as the default set of panes for the new tab. So if the default three panes don&amp;#x27;t fit your needs you can pick from any of the default or your custom workspaces and set those as default panes. To set a workspace as the default tabs for a new pane, press the &amp;quot;home&amp;quot; icon on its card:&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9-1/workspace.png&quot; class=&quot;imgshadow&quot; alt=&quot;A workspace card with the &amp;#x27;home&amp;#x27; icon highlighted&quot;/&gt;&lt;h3 id=&quot;duplicate-tab&quot;&gt;Duplicate tab&lt;/h3&gt;&lt;p&gt;You can now right-click any tab and select &amp;quot;duplicate tab&amp;quot; (along with &amp;quot;close&amp;quot; and &amp;quot;new&amp;quot;) to make a copy of the current tab and focus it. This will copy over all the settings like panes, debug tools, layout and panel settings.&lt;/p&gt;&lt;h2 id=&quot;full-layout-updates&quot;&gt;Full layout updates&lt;/h2&gt;&lt;p&gt;In previous versions of Polypane the pane options for the full layout were available by clicking a kebab menu in the header. In Polypane 9.1 they are now part of the header itself.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9-1/full.png&quot; class=&quot;imgshadow&quot; alt=&quot;Polypane in Full layout mode with the new icons highlighted and the emulation pane open&quot;/&gt;&lt;p&gt;This means that things like emulation and debug tools are much easier to get to for full mode, but also that we&amp;#x27;ve now enabled the reference image and rulers for the Full layout as well.&lt;/p&gt;&lt;h2 id=&quot;outline-panel&quot;&gt;Outline panel&lt;/h2&gt;&lt;p&gt;Beyond the new overlay features powered by the Outline panel, we&amp;#x27;ve also improved various parts of the panel itself.&lt;/p&gt;&lt;h3 id=&quot;show-differences-between-accessible-name-and-text-content&quot;&gt;Show differences between accessible name and text content&lt;/h3&gt;&lt;p&gt;Previously, Polypane showed the accessible name or if that wasn&amp;#x27;t available, the text content of any element. Now we default to the accessible name but we will also show the text content of an element when it&amp;#x27;s different.&lt;/p&gt;&lt;p&gt;We show that in two ways: either it&amp;#x27;s just the casing that&amp;#x27;s different (for example because CSS is used to change the casing) or the entire content is different.&lt;/p&gt;&lt;p style=&quot;display:flex;justify-content:space-around;align-items:center;flex-wrap:wrap&quot;&gt;&lt;img src=&quot;/blogs/polypane-9-1/casing.png&quot; class=&quot;imgshadow&quot; alt=&quot;An element with accessible name &amp;#x27;CHANGELOG&amp;#x27; but original casing &amp;#x27;Changelog&amp;#x27;.&quot;/&gt;&lt;img src=&quot;/blogs/polypane-9-1/content.png&quot; class=&quot;imgshadow&quot; alt=&quot;An element with accessible name &amp;#x27;macbook pro 13 inch&amp;#x27; but text content &amp;#x27;MacBook Pro 13&amp;#x27;.&quot;/&gt;&lt;/p&gt;&lt;p&gt;This is great for making sure that the accessible name and (visible) text content haven&amp;#x27;t diverged, and that differences are intentional.&lt;/p&gt;&lt;h3 id=&quot;scroll-to-element-in-each-pane&quot;&gt;Scroll-to-element in each pane&lt;/h3&gt;&lt;p&gt;In previous versions of Polypane, hovering over an element in the Outline panel scrolled the first pane to that element, and all the other panes scrolled the same percentage. The element doesn&amp;#x27;t have to be at the same position on each pane though so this didn&amp;#x27;t do a great job of showing where the element was.&lt;/p&gt;&lt;p&gt;In Polypane 9.1, we now scroll each pane individually so that the highlighted element is visible in each pane. Scroll syncing is automatically picked up again at the next scroll.&lt;/p&gt;&lt;h3 id=&quot;improved-display-of-presentational-headings&quot;&gt;Improved display of presentational headings&lt;/h3&gt;&lt;p&gt;For sites with a large set of presentational headings we showed them at their specified heading level but this wasn&amp;#x27;t correct, and led to some strange hierarchies. Instead, we now show presentational headings as if they are one level lower and show them diminished compared to other headings to indicate they&amp;#x27;re not part of the heading structure.&lt;/p&gt;&lt;h2 id=&quot;elements-panel&quot;&gt;Elements panel&lt;/h2&gt;&lt;p&gt;We&amp;#x27;re always working on the Elements panel and incorporating the feedback we get from users into it. This time round, we made quite a significant change to the design and fixed some of the bugs that snuck in in Electron 9.&lt;/p&gt;&lt;h3 id=&quot;updated-design&quot;&gt;Updated design&lt;/h3&gt;&lt;p&gt;While I personally really liked the grey background, the devtools of all other browsers use a white background for the tree view and styling overview. To make it easier for people to switch over to Polypane, we&amp;#x27;re now also using that color scheme. We might offer the grey as a configuration option in the future, depending on the feedback we get. So let us know if you like this change!&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9-1/elements.png&quot; class=&quot;imgshadow&quot; alt=&quot;Elements panel with white background&quot;/&gt;&lt;p&gt;In addition to the new background, whenever you hover over an opening or closing tag in the tree view, we highlight the corresponding tag so you can quickly see which closing tag belongs to which opening tag even for deep nestings.&lt;/p&gt;&lt;h3 id=&quot;elements-panel-bug-fixes&quot;&gt;Elements panel bug fixes&lt;/h3&gt;&lt;p&gt;In the previous release we broke the display of both &lt;code class=&quot;language-text&quot;&gt;@font-face&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;@keyframe&lt;/code&gt; declarations. Those are now visible again, and we&amp;#x27;ve also updated the display of them so they&amp;#x27;re clearly separate from the &amp;#x27;normal&amp;#x27; CSS styles.&lt;/p&gt;&lt;h2 id=&quot;meta-panel&quot;&gt;Meta panel&lt;/h2&gt;&lt;p&gt;The meta panel got two smaller updates:&lt;/p&gt;&lt;h3 id=&quot;updated-twitter-card-design&quot;&gt;Updated Twitter card design&lt;/h3&gt;&lt;p&gt;Twitter subtly updated their card design, so we also subtly updated the card design to keep everything pixel-perfect.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9-1/twitter.png&quot; class=&quot;imgshadow&quot; alt=&quot;The updated Twitter design.&quot;/&gt;&lt;h3 id=&quot;highlight-duplicates-in-robotstxt&quot;&gt;Highlight duplicates in robots.txt&lt;/h3&gt;&lt;p&gt;If you have duplicates in your robots.txt we now highlight that. They don&amp;#x27;t do much harm, but you can delete one anyway:&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9-1/duplicate.png&quot; class=&quot;imgshadow&quot; alt=&quot;A duplicate entry in a long robots.txt list.&quot;/&gt;&lt;h2 id=&quot;smaller-updates&quot;&gt;Smaller updates&lt;/h2&gt;&lt;p&gt;Here are a bunch of other noteworthy updates.&lt;/p&gt;&lt;h3 id=&quot;hwb-support-in-color-pickers&quot;&gt;HWB support in color pickers&lt;/h3&gt;&lt;p&gt;With support for HWB landing in Chromium and other browsers, the Polypane color picker now supports the notation as well.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9-1/hwb.png&quot; class=&quot;imgshadow&quot; alt=&quot;color picker and selector both with HWB notation.&quot;/&gt;&lt;h3 id=&quot;icons-in-the-panel&quot;&gt;Icons in the panel&lt;/h3&gt;&lt;p&gt;All the tabs in the panel now have an associated icon. This&amp;#x27;ll make it easier for people to quickly find the right tab and makes it easier to tell them apart too:&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9-1/icons.png&quot; class=&quot;imgshadow&quot; alt=&quot;tabs in the panel with new icons.&quot;/&gt;&lt;h3 id=&quot;auto-growing-inputs-in-storage-panel&quot;&gt;Auto-growing inputs in Storage panel&lt;/h3&gt;&lt;p&gt;The elements and console panels both already had auto-growing inputs, but now the storage panel will also increase the height of inputs if the content takes multiple lines. This will make it easier to edit e.g. json in localStorage.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9-1/localstorage.png&quot; class=&quot;imgshadow&quot; alt=&quot;multi-line local storage value.&quot;/&gt;&lt;h3 id=&quot;layout-debugging-shows-before-and-after-elements&quot;&gt;Layout debugging shows &lt;code class=&quot;language-text&quot;&gt;::before&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;::after&lt;/code&gt; elements&lt;/h3&gt;&lt;p&gt;Layout debugging draws a line around each element, but until now it didn&amp;#x27;t outline pseudo elements. In Polypane 9 pseudo-elements are now outlined with dotted lines.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9-1/layoutdebugging.png&quot; class=&quot;imgshadow&quot; alt=&quot;dotted lines around the feature menu.&quot;/&gt;&lt;p&gt;You can turn layout debugging on by pressing &lt;code class=&quot;language-text&quot;&gt;cmd/ctrl + d&lt;/code&gt; or by activating the &amp;quot;layout debugging&amp;quot; debug tool.&lt;/p&gt;&lt;h3 id=&quot;improved-pinch-to-zoom-on-macos&quot;&gt;Improved pinch-to-zoom on macOS&lt;/h3&gt;&lt;p&gt;Pinch to zoom on macOS for the horizontal and vertical layout no longer zooms in and out with a fixed cadence, but follows your pinch gesture instead so it becomes much easier to zoom to your preferred size with a quick pinch.&lt;/p&gt;&lt;h2 id=&quot;updated-chromium&quot;&gt;Updated Chromium&lt;/h2&gt;&lt;p&gt;Chromium has been updated to 102.0.5005.63, and ships with a number of experimental features turned on by default, like support for the page transition api, container queries and &lt;code class=&quot;language-text&quot;&gt;:has()&lt;/code&gt;. Head over to our docs on &lt;a href=&quot;/docs/experimental-chromium-features/&quot;&gt;Experimental Chromium Features&lt;/a&gt; for a full overview of the available APIs. If you&amp;#x27;d like to see one activated, &lt;a href=&quot;/support/&quot;&gt;Let us know&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In this release we turned on support for the Page Transition API&lt;/p&gt;&lt;h2 id=&quot;get-polypane-91&quot;&gt;Get Polypane 9.1&lt;/h2&gt;&lt;p&gt;Polypane is available for Windows, Mac (universal dmg for both Intel and M1) and Linux (.deb or AppImage) in both 64 bit and ARM versions.&lt;/p&gt;&lt;p&gt;Polypane automatically updates on Mac, Windows and on Linux when using the AppImage. Otherwise, go to
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; to download the latest version!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Try it for free&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;h3 id=&quot;removal-notice&quot;&gt;Removal notice&lt;/h3&gt;&lt;p&gt;Polypane 9.1 removes pane filters. They were rarely used and a source of confusion for users. The alternative is using different workspaces and switching between them.&lt;/p&gt;&lt;h2 id=&quot;polypane-91-changelog&quot;&gt;Polypane 9.1 Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;New Features&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Autofill form feature&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Fast overview screenshot&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Outline panel overlays for headings, landmarks, images and links&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Debugging suggestions for form fields&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Add number plugin for screenshot editor (Thanks Eric!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; INP webvital support&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Set workspace as panes for new tab&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Duplicate tab feature&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Full layout now shows pane options inside the address bar&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Support for rulers in Full layout&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel highlights matching closing and opening tag on hover&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel now has a white bg for CSS&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Support for the page transition API&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline Panel: Show differences between accessible name and element content&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline Panel: Presentational headings now differ in style&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline Panel: Complex headings structures are now shown more logically&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: scroll to element now happens individually in each pane&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta Panel: Updated layout for Twitter previews&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: robots.txt overview now warns for duplicate entries&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Storage panel uses auto-growing text areas&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Layout debugging now shows before and after elements with dashed outline&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Performance gauge icon is now shown in red&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Reload button now supports Stop action&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; All panels now have an associated icon&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Color pickers: HWB support&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Color selection: use the same format as the color picker&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Tabs without close button no longer preserve space for it&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Support zooming the text in the panel to 200% (Thanks Martin!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Pinch-to-zoom on mac now follows pinch speed&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Support page zoom in full height screenshots&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Console: better support for nested objects&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated accessibility ruleset&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; New Google fonts&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Removals&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Removed&lt;/strong&gt; Pane filtering has been removed.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: shows @font-face correctly again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: Prevent closing tags from being shown for collapsed elements in tree view&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel keyframe overview didn&amp;#x27;t show custom properties&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; License requesting flow now uses correct background color in dark mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Contrast checker now excludes injected elements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; &amp;#x27;Paste and go&amp;#x27; is now available when copying links intp the address bar again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Meta panel: prevent double encoding of URL params (Thanks Nicolas!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Meta panel didn&amp;#x27;t display data if the page had zero interactive elements. (Thanks Sampic!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Alt+left/right shortcuts for history navigation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Reference image alignment issue for clipped panes (Thanks Dan!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Scroll sync didn&amp;#x27;t work after closing and reopening the main window on Mac&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Reopening Polypane window on Mac after registering app no longer show &amp;#x27;license expired&amp;#x27; message&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue with sites shipping babel-polyfill&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Clicking color contrast suggestions didn&amp;#x27;t copy the color&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; issue with syncing keydown and keyup events (Thanks Mitchell!)&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[:where() :is() :has()? New CSS selectors that make your life easier]]></title><description><![CDATA[When people talk about CSS complexity, a major contributor to that is CSS specificity, or writing effective CSS selectors. The more you add…]]></description><link>https://polypane.app/blog/where-is-has-new-css-selectors-that-make-your-life-easier/</link><guid isPermaLink="false">https://polypane.app/blog/where-is-has-new-css-selectors-that-make-your-life-easier/</guid><pubDate>Mon, 16 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When people talk about CSS complexity, a major contributor to that is CSS specificity, or writing effective CSS selectors. The more you add to a CSS selector, the more precise it is, but also, the more specific it is, so the harder it will be to overwrite styles if you need to at a later point.&lt;/p&gt;&lt;p&gt;This double edged sword is what makes writing good CSS selectors so hard: you need to be specific, but not &lt;em&gt;too&lt;/em&gt; specific. It&amp;#x27;s why there are many strategies for writing good CSS selectors or avoiding the issue altogether, from OOCSS to BEM to Atomic CSS.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;This article is adapted from a talk Kilian gave at &lt;a href=&quot;https://conffab.com/video/forced-colors-explained/&quot;&gt;Web Directions Hover 2022&lt;/a&gt;. You can &lt;a href=&quot;/support/&quot;&gt;contact us&lt;/a&gt; if you&amp;#x27;re interested in Kilian presenting this at your conference, meetup or organisation.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;CSS is quickly evolving at the language and syntax level. Container queries and cascade layers for example will each have their impact on the selectors you will write in CSS. Cascade layers are widely available, and you can test with Container queries right in Polypane.&lt;/p&gt;&lt;p&gt;In this article though, we&amp;#x27;re not going to focus on the syntax, but we&amp;#x27;re going to focus in on some new features that are available for the CSS selectors: the &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;:where()&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;:has()&lt;/code&gt; pseudo-classes. Yes, I flipped them in the article title because they sound more fun that way.&lt;/p&gt;&lt;h2 id=&quot;a-bit-of-history&quot;&gt;A bit of history&lt;/h2&gt;&lt;p&gt;Before there was the &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; pseudo-class, there was the &lt;code class=&quot;language-text&quot;&gt;:matches()&lt;/code&gt; pseudo-class. And before that there where the *-any pseudo-classes: &lt;code class=&quot;language-text&quot;&gt;:-moz-any()&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;:-webkit-any()&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;You might be surprised to learn that the *-any pseudo-class &lt;strong&gt;has been around since 2010&lt;/strong&gt;. It was introduced in Firefox 4 as &lt;code class=&quot;language-text&quot;&gt;:-moz-any()&lt;/code&gt;, outside of any specification, and actually worked pretty much the same as the &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; class works now.&lt;/p&gt;&lt;p&gt;Support in other browsers landed first as &lt;code class=&quot;language-text&quot;&gt;:-webkit-any()&lt;/code&gt;, and later it got added to the specification as &lt;code class=&quot;language-text&quot;&gt;:matches()&lt;/code&gt;, which also had support in various browsers.&lt;/p&gt;&lt;p&gt;This &lt;code class=&quot;language-text&quot;&gt;:matches()&lt;/code&gt; pseudo-class came with a limitation though, like the &lt;code class=&quot;language-text&quot;&gt;:not()&lt;/code&gt; selector, it only supported &amp;quot;simple selectors&amp;quot;.&lt;/p&gt;&lt;h3 id=&quot;what-are-simple-selectors&quot;&gt;What are simple selectors?&lt;/h3&gt;&lt;p&gt;Simple selectors are selectors that only contain a single element or element property, like a class, attribute, id or pseudo-class. As soon as you add a combinator, like a space or ~ or +, or a pseudo-element (like &lt;code class=&quot;language-text&quot;&gt;::first-letter&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;::after&lt;/code&gt;), you add a &lt;em&gt;relation&lt;/em&gt; to another element and it becomes a complex selector.&lt;/p&gt;&lt;p&gt;The definition of &amp;quot;simple selector&amp;quot; changed between CSS2 and CSS3: in CSS3 there is now a difference between a &amp;quot;simple selector&amp;quot;, which is one thing (&lt;em&gt;one&lt;/em&gt; class, &lt;em&gt;one&lt;/em&gt; element, etc) and a compound selector, which is any selector that does not have a combinator.&lt;/p&gt;&lt;p&gt;That means that this CSS Selector is &amp;quot;simple&amp;quot; (though compound) :&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;p.hover#22[chat~=active]&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;focus&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and this one is &amp;quot;complex&amp;quot;:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;div p&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This obviously put a limit on how useful both the &lt;code class=&quot;language-text&quot;&gt;:matches()&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;:not()&lt;/code&gt; selectors were, so luckily both of those got updated in later specifications and they now also support complex selectors, meaning we can use them to select elements based on their relations.&lt;/p&gt;&lt;p&gt;And that&amp;#x27;s not the only thing the &lt;code class=&quot;language-text&quot;&gt;:not()&lt;/code&gt; selector contributed to this history. The CSS Working group renamed &lt;code class=&quot;language-text&quot;&gt;:matches()&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; because, for one, it was shorter to type, but it also provided a good pairing with &lt;code class=&quot;language-text&quot;&gt;:not()&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Is, and is not.&lt;/p&gt;&lt;h2 id=&quot;checking-for-support-for-is&quot;&gt;Checking for support for &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt;&lt;/h2&gt;&lt;p&gt;That brings us to the now, 2022. The &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; pseudo-class is supported in all evergreen browsers, with support only missing in IE11 and Opera mini.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://caniuse.bitsofco.de/image/css-matches-pseudo.png&quot; alt=&quot;Data on support for the css-matches-pseudo feature across the major browsers from caniuse.com&quot;/&gt;&lt;/p&gt;&lt;p&gt;If you want to test for support you can use the &lt;code class=&quot;language-text&quot;&gt;@supports&lt;/code&gt; rule with the &lt;code class=&quot;language-text&quot;&gt;selector()&lt;/code&gt; function, which has been supported for slightly longer than &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; itself and works for all three pseudo-classes we&amp;#x27;re discussing in this article:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@supports&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token selector-function-argument selector&quot;&gt;:is(*)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* your CSS */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;the-is-pseudo-class&quot;&gt;The &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; pseudo-class&lt;/h2&gt;&lt;p&gt;To target multiple paths in CSS, you can add a comma between multiple selectors. Each selector will then be used to select elements.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;nav &amp;gt; ul a:hover,
footer &amp;gt; ol a:hover,
aside &amp;gt; p a:hover&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; purple&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-decoration&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; underline wavy deeppink&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is useful but for closely related selectors it usually leads to duplication. specifically, the &lt;code class=&quot;language-text&quot;&gt;a:hover&lt;/code&gt; part is the same in each of the selectors.&lt;/p&gt;&lt;p&gt;This is annoying since if that ever changes, you have to fix that in three places at the same time, but there is something trickier going on with multiple selectors as well: if one of them is invalid, the entire block of CSS is discarded.&lt;/p&gt;&lt;p&gt;Now you might think that it&amp;#x27;d be pretty hard to write a selector that&amp;#x27;s invalid. Maybe one that never applies, like &lt;code class=&quot;language-text&quot;&gt;:not(*)&lt;/code&gt;, but an actual invalid one?&lt;/p&gt;&lt;p&gt;Well, consider new CSS pseudo-states that are only supported in some browsers, like &lt;code class=&quot;language-text&quot;&gt;:fullscreen&lt;/code&gt; (Safari only supports &lt;code class=&quot;language-text&quot;&gt;:-webkit-full-screen&lt;/code&gt;):&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;:fullscreen,
:-webkit-full-screen&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; red&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To style a fullscreen element in Chrome and Firefox you need &lt;code class=&quot;language-text&quot;&gt;:fullscreen&lt;/code&gt;, but in Safari you need &lt;code class=&quot;language-text&quot;&gt;:-webkit-full-screen&lt;/code&gt;. If you put those together then Firefox will see the &lt;code class=&quot;language-text&quot;&gt;:-webkit-full-screen&lt;/code&gt; selector, deem it invalid and discard the entire thing, and likewise Safari will see &lt;code class=&quot;language-text&quot;&gt;:fullscreen&lt;/code&gt; and discard it as well.&lt;/p&gt;&lt;p&gt;To style this in both browsers in a way that doesn&amp;#x27;t break, you would have to create two separate rule sets and duplicate the styling in both blocks. More duplication!&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;:fullscreen&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; red&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;:-webkit-full-screen&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; red&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That means selector lists have two problems:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Duplication in the selectors you write, making updating them frustrating.&lt;/li&gt;&lt;li&gt;If one of the selectors is invalid, everything is ignored.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;enter-is&quot;&gt;Enter &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt;&lt;/h3&gt;&lt;p&gt;Solving both these issues with a single two-letter pseudo-class.&lt;/p&gt;&lt;p&gt;Firstly, the duplication, instead of creating a separate selector for each variant here, We can rewrite it to create mini selectors with the &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; pseudo-class, and then we only have to write the rest of the selector once:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;:is(nav &amp;gt; ul, footer &amp;gt; ol, aside &amp;gt; p) a:hover&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; purple&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-decoration&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; underline wavy deeppink&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Do you see how we essentially create a smaller list of selectors inside the &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt;? By inlining the parts of the selectors that are different, we can make the entire selector much smaller and more readable.&lt;/p&gt;&lt;p&gt;And the &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; pseudo-class solves the second issue by creating a new type of list of selectors: the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;forgiving-selector-list&amp;gt;&lt;/code&gt;. This will parse each selector individually and discard the ones it doesn&amp;#x27;t understand.&lt;/p&gt;&lt;p&gt;This means we can wrap our slider track pseudo classes in an &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; and browsers will just pick the ones they understand and ignore the rest:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;:is(:fullscreen, :-webkit-full-screen)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;#x27;s great! The &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; selector saves us typing the same thing in multiple selectors, and also makes our CSS more resilient by introducing a forgiving selector list.&lt;/p&gt;&lt;h3 id=&quot;filtering-elements-by-their-parents&quot;&gt;Filtering elements by their parents&lt;/h3&gt;&lt;p&gt;A cool feature I learned from &lt;a href=&quot;https://thinkdobecreate.com/&quot;&gt;Stephanie Eckles&lt;/a&gt; in her &lt;a href=&quot;https://codepen.io/5t3ph/pen/LYzvrGv&quot;&gt;Modern CSS Toolkit presentation&lt;/a&gt; (you can find the tips mentioned there on &lt;a href=&quot;https://smolcss.dev/&quot;&gt;SmolCSS&lt;/a&gt; too). Because the &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; pseudo-class can take complex selectors, you can also add a list of ancestors and then select your element with a &lt;code class=&quot;language-text&quot;&gt;*&lt;/code&gt;. That means these two selectors target the same element:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;a:is(nav *)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;nav a&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This works because the browser will look for all elements that match both &lt;code class=&quot;language-text&quot;&gt;a&lt;/code&gt; &lt;em&gt;and&lt;/em&gt; that match &lt;code class=&quot;language-text&quot;&gt;nav *&lt;/code&gt;. The end result being that you&amp;#x27;re actually selecting &lt;code class=&quot;language-text&quot;&gt;nav a&lt;/code&gt;, the a element matching both &lt;code class=&quot;language-text&quot;&gt;a&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;*&lt;/code&gt;.&lt;/p&gt;&lt;h3 id=&quot;nesting-pseudo-classes&quot;&gt;Nesting pseudo-classes&lt;/h3&gt;&lt;p&gt;Another consequence of complex selectors being supported, is that you can nest pseudo classes:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;:is(div:not(.demo) nav)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What this selector selects is:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;All &lt;code class=&quot;language-text&quot;&gt;nav&lt;/code&gt; elements,&lt;/li&gt;&lt;li&gt;That are in a &lt;code class=&quot;language-text&quot;&gt;div&lt;/code&gt;,&lt;/li&gt;&lt;li&gt;But only if that &lt;code class=&quot;language-text&quot;&gt;div&lt;/code&gt; does &lt;em&gt;not&lt;/em&gt; have a class of &amp;quot;demo&amp;quot;.&lt;/li&gt;&lt;/ol&gt;&lt;h4 id=&quot;about-not&quot;&gt;About &lt;code class=&quot;language-text&quot;&gt;:not()&lt;/code&gt;...&lt;/h4&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;:not()&lt;/code&gt; &lt;em&gt;will&lt;/em&gt; break if it contains invalid selectors because the specification states it should use a &amp;quot;regular&amp;quot; selector list, not a &amp;quot;forgiving&amp;quot; selector list like &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;The workaround for that is to nest an &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; selector in your &lt;code class=&quot;language-text&quot;&gt;:not()&lt;/code&gt; selector, though it would be better if the specification got updated so that the not selector also uses a forgiving selector list.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* breaks */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;not(:fullscreen, :-webkit-full-screen)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* works */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;not(:is(:fullscreen, :-webkit-full-screen))&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;things-to-look-out-for-with-is&quot;&gt;Things to look out for with &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt;&lt;/h3&gt;&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; pseudo-class itself also comes with a few gotchas:&lt;/p&gt;&lt;h4 id=&quot;no-support-for-pseudo-elements&quot;&gt;No support for pseudo-elements&lt;/h4&gt;&lt;p&gt;You can not select pseudo-elements like &lt;code class=&quot;language-text&quot;&gt;::before&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;::after&lt;/code&gt;, since they aren&amp;#x27;t elements present in the DOM and so can&amp;#x27;t &amp;quot;match&amp;quot;.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* won&amp;#x27;t work */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;a:is(::before, ::after)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* You have to write */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;a::before,
a::after&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&quot;spaces-are-significant&quot;&gt;Spaces are significant&lt;/h4&gt;&lt;p&gt;The space is part of the selector, so you have to keep that in mind.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;h1:is(:hover, :focus)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/* h1:hover, h1:focus { ... } */&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;h1 :is(:hover, :focus)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/* h1 *:hover, h1 *:focus { ... } */&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the above example, the top line &lt;code class=&quot;language-text&quot;&gt;h1:is(:hover, :focus)&lt;/code&gt; will evaluate to the hover and focus applying to the &lt;code class=&quot;language-text&quot;&gt;h1&lt;/code&gt; but adding a space between the h1 and the is selector evaluates to the hover and focus applying to any descendant. The universal selector (&lt;code class=&quot;language-text&quot;&gt;*&lt;/code&gt;) is added implicitly.&lt;/p&gt;&lt;h4 id=&quot;specificity&quot;&gt;Specificity&lt;/h4&gt;&lt;p&gt;Everybody&amp;#x27;s favorite CSS topic, and &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; does something interesting with it.&lt;/p&gt;&lt;p&gt;Specificity in selectors is expressed as three numbers: the first is for IDs, the second for classes and pseudo-classes and the third for elements and pseudo-elements. Any number will prevail over the ones after it, so you can have a hundred classes and still a single ID would win in terms of specificity.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;#id&lt;/code&gt; = (1,0,0)&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;.class&lt;/code&gt; = (0,1,0)&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;div&lt;/code&gt; = (0,0,1)&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;If you want to explore this for yourself, We made an &lt;a href=&quot;/css-specificity-calculator/&quot;&gt;online specificity calculator&lt;/a&gt; that visually explains which parts your selector is built up from and explains the scoring.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;To determine the specificity of an &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; selector, browsers don&amp;#x27;t just take the default value of a pseudo-class (0,1,0), but they take the value of the most specific selector in the is pseudo-class. This means you can easily blow out your specificity without paying attention to it.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* regular pseudo-class */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;:first-child&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* (0,1,0) */&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* :is pseudo-class */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;:is(h1, ul.nav, #message)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* (1,0,0) */&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The specificity of that second example ends up being (1,0,0) because of that one ID selector, even if that selector doesnt actually match any element in your DOM.&lt;/p&gt;&lt;p&gt;The most specific selector determines the specificity.&lt;/p&gt;&lt;p&gt;What if there&amp;#x27;s no way around using a high-specificity selector? That brings us to the next pseudo class on our list.&lt;/p&gt;&lt;h2 id=&quot;the-where-pseudo-class&quot;&gt;The &lt;code class=&quot;language-text&quot;&gt;:where()&lt;/code&gt; pseudo-class&lt;/h2&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;:where()&lt;/code&gt; was introduced a little later but is now as well supported as the &lt;code class=&quot;language-text&quot;&gt;is()&lt;/code&gt; selector: all evergreen browsers, but no support in IE11 or Opera mini.&lt;/p&gt;&lt;p&gt;It was created to solve this issue of specificity. It works exactly the same as the &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; pseudo class with one key difference: its specificity will always resolve to (0,0,0), regardless of the selectors inside it.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;where&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;div&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* (0,0,0) */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;where&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;.class&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* (0,0,0) */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;where&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;#id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* (0,0,0) */&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This can help you escape out of issues where your only recourse would&amp;#x27;ve been an even more specific selector or adding an &lt;code class=&quot;language-text&quot;&gt;!important&lt;/code&gt; to a CSS rule.&lt;/p&gt;&lt;p&gt;While useful for specificity issues, there is another area where I think the &lt;code class=&quot;language-text&quot;&gt;:where()&lt;/code&gt; pseudo class will hopefully make a big impact: in CSS libraries and resets.&lt;/p&gt;&lt;h3 id=&quot;a-simpler-alternative-for-cascade-layers&quot;&gt;A simpler alternative for cascade layers&lt;/h3&gt;&lt;p&gt;With the &lt;code class=&quot;language-text&quot;&gt;:where()&lt;/code&gt; pseudo class, libraries can ship their styling with zero specificity. You get all the benefits of a library without having to deal with specificity to overwrite its styling. &lt;a href=&quot;https://open-props.style/&quot;&gt;Open Props&lt;/a&gt; is a CSS Library that already applies this pattern.&lt;/p&gt;&lt;p&gt;While cascade layers may be getting more attention lately as a potential solution for the same problem of specificity and CSS frameworks, I think the effectiveness of &lt;code class=&quot;language-text&quot;&gt;:where()&lt;/code&gt; should not be underestimated. `:where() can be applied at a selector level, and doesn&amp;#x27;t require you to change and keep in mind your entire CSS architecture in the way cascade layers do.&lt;/p&gt;&lt;p&gt;So that&amp;#x27;s &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;:where()&lt;/code&gt;. These two pseudo classes help us cut down on selector duplication, are forgiving when it comes to invalid selectors, something that can be particularly helpful in cross-browser support and in the case of &lt;code class=&quot;language-text&quot;&gt;:where()&lt;/code&gt;, help us manage the specificity of a selector.&lt;/p&gt;&lt;p&gt;Both &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;:where()&lt;/code&gt; are supported in all evergreen browsers and have been for quite a few versions, so they are safe to use if you no longer have to support Internet Explorer, which I hope you don&amp;#x27;t.&lt;/p&gt;&lt;p&gt;That brings us to the last pseudo-class of this article. It&amp;#x27;s the newest and most unsupported one, but it&amp;#x27;s one that developers have been asking for since, well, since forever:&lt;/p&gt;&lt;h2 id=&quot;the-has-pseudo-class-the-parent-selector&quot;&gt;The &lt;code class=&quot;language-text&quot;&gt;:has()&lt;/code&gt; pseudo-class: the parent selector.&lt;/h2&gt;&lt;p&gt;Let me explain &amp;quot;parent selector&amp;quot; a little bit. With CSS selectors you &lt;em&gt;already&lt;/em&gt; style elements by their parents, but what people mean when they say a parent selector is that they want to style an element based on what other elements are inside of it. For example, they want to say something like this:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;  &lt;span class=&quot;token comment&quot;&gt;/* ↓ Select this */&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;div&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; img
        &lt;span class=&quot;token comment&quot;&gt;/* ↑ not this */&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;to specify they want to select divs, but only if they contain images.&lt;/p&gt;&lt;p&gt;While there have been many proposals over the years, this was long thought impossible or too performance-intensive to implement because of the way CSS selectors are parsed: they start at the end.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;                &lt;span class=&quot;token comment&quot;&gt;/* Starts here ↓ */&lt;/span&gt;
   &lt;span class=&quot;token selector&quot;&gt;header h1#sitetitle &amp;gt; .logo a&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/* ↑ Not here  */&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;They are parsed this way because browsers start with the element and try and find all the CSS that applies to it.&lt;/p&gt;&lt;p&gt;It&amp;#x27;s faster to invalidate rules that don&amp;#x27;t apply to a given element when you start at the end of a selector, because you don&amp;#x27;t have to loop over all potential descendants only to find out that the element at the end doesn&amp;#x27;t match.&lt;/p&gt;&lt;p&gt;By starting at the end, you can begin by discarding all elements that are not &lt;code class=&quot;language-text&quot;&gt;a&lt;/code&gt; elements (in this case). That lowers the total number of elements you will need to consider. From there, you can walk up the tree one ancestor at a time to discard any further non-matching elements.&lt;/p&gt;&lt;p&gt;While some veterans might now have flashbacks to old arguments about performance, jQuery plugins and the like, it&amp;#x27;s 2022 and the &lt;code class=&quot;language-text&quot;&gt;:has()&lt;/code&gt; pseudo-class lets us select elements depending on their descendants, natively in the browser, without any noticeable performance implications.&lt;/p&gt;&lt;p&gt;So first the bad news:&lt;/p&gt;&lt;h3 id=&quot;browser-support&quot;&gt;Browser support&lt;/h3&gt;&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;:has()&lt;/code&gt; selector is available in Safari, in Polypane and in other Chromium browsers. It&amp;#x27;s available behind a feature flag in Firefox.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://caniuse.bitsofco.de/image/css-has.png&quot; alt=&quot;Data on support for the css-has feature across the major browsers from caniuse.com&quot;/&gt;&lt;/p&gt;&lt;p&gt;When I said that there are no performance implications, what I meant was that there were no performance implications in Webkit and Blink. Each rendering engine has different optimizations, so the implementation in Firefox&amp;#x27;s gecko engine might end up having other performance characteristics.&lt;/p&gt;&lt;p&gt;Of course, that won&amp;#x27;t stop us from exploring its many possibilities, because like Bramus said, the CSS Has pseudo class is &lt;a href=&quot;https://www.bram.us/2021/12/21/the-css-has-selector-is-way-more-than-a-parent-selector/&quot;&gt;way more than a parent selector&lt;/a&gt;. In the specification it&amp;#x27;s referred to as the relational pseudo class, and we&amp;#x27;ll see why in a bit.&lt;/p&gt;&lt;h3 id=&quot;the-syntax&quot;&gt;The syntax&lt;/h3&gt;&lt;p&gt;First though, the syntax. To get back to the example I just gave, of selecting all divs that contain an image, here&amp;#x27;s what that looks like with &lt;code class=&quot;language-text&quot;&gt;:has()&lt;/code&gt;. We select all the divs, but add a conditional that they need to have images inside them.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* ↓ Select this */&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;has&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
         &lt;span class=&quot;token comment&quot;&gt;/* ↑ not this */&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Like &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;:where()&lt;/code&gt;, you can also use complex selectors. Like divs that have images as siblings.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;div:has(~ img)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;or multiple selectors, like divs that have images, videos or svgs as descendants.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;div:has(img, video, svg)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;del&gt;Also like &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;:where()&lt;/code&gt; the selector list is forgiving. So &lt;code class=&quot;language-text&quot;&gt;div:has(img, video, svg:undefined)&lt;/code&gt;, with a &amp;quot;:undefined&amp;quot; pseudo that doesn&amp;#x27;t exist, will still select all divs that have images or video elements in them.&lt;/del&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;As of late 2022, &lt;code class=&quot;language-text&quot;&gt;:has()&lt;/code&gt; &lt;a href=&quot;https://github.com/w3c/csswg-drafts/issues/7676#issuecomment-1341347244&quot;&gt;no longer has a forgiving selector list&lt;/a&gt;, due to that breaking jQuery. If you need a forgiving selector list, then you can nest &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;:where()&lt;/code&gt; inside it: &lt;code class=&quot;language-text&quot;&gt;div:has(:is(img, video, svg:undefined))&lt;/code&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;specificity-1&quot;&gt;Specificity&lt;/h3&gt;&lt;p&gt;The specificity of a &lt;code class=&quot;language-text&quot;&gt;:has&lt;/code&gt; pseudo class is determined in the same way as for the &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;:not()&lt;/code&gt; pseudo-classes: the most specific element determines the specificity of the entire pseudo-class.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token property&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;has&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; .logo&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; #brand&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* (1,0,0) */&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;using-has-as-part-of-a-selector&quot;&gt;Using &lt;code class=&quot;language-text&quot;&gt;:has()&lt;/code&gt; as part of a selector&lt;/h3&gt;&lt;p&gt;By using &lt;code class=&quot;language-text&quot;&gt;:has()&lt;/code&gt; in different parts of your selector you can not just select elements based on their descendants, but also select elements based on their sibling or even cousin elements.&lt;/p&gt;&lt;p&gt;Or in other words, we can select elements based on their relation to a different part of the DOM: the relational pseudo class.&lt;/p&gt;&lt;p&gt;For example, lets say you have a card element and you want to style the h3 differently if the card image is present:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;card&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;imagecontainer&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;textcontainer&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Title&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;...&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can do that by making &lt;code class=&quot;language-text&quot;&gt;:has()&lt;/code&gt; part of the selector that targets that &lt;code class=&quot;language-text&quot;&gt;h3&lt;/code&gt;. To target the &lt;code class=&quot;language-text&quot;&gt;h3&lt;/code&gt; we&amp;#x27;d normally write &lt;code class=&quot;language-text&quot;&gt;.card h3&lt;/code&gt;. Next, we add a conditional &lt;code class=&quot;language-text&quot;&gt;:has()&lt;/code&gt; to the card:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.card:has(.imagecontainer img) h3&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This selector matches:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;All h3 elements,&lt;/li&gt;&lt;li&gt;That are in elements with the class card,&lt;/li&gt;&lt;li&gt;But only if that card element also has:&lt;ol&gt;&lt;li&gt;An image&lt;/li&gt;&lt;li&gt;In an element with the class imagecontainer.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;We can also invert that: style the &lt;code class=&quot;language-text&quot;&gt;h3&lt;/code&gt; differently if there is &lt;em&gt;no image&lt;/em&gt; present, by nesting a `:not() pseudo-class.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.card:has(:not(.imagecontainer img)) h3&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This gives you a lot more styling options for situations where you would&amp;#x27;ve previously added something like &lt;code class=&quot;language-text&quot;&gt;class=&amp;quot;has_image&amp;quot;&lt;/code&gt; to your card.&lt;/p&gt;&lt;h3 id=&quot;re-implementing-focus-within&quot;&gt;Re-implementing &lt;code class=&quot;language-text&quot;&gt;:focus-within&lt;/code&gt;&lt;/h3&gt;&lt;p&gt;You can also use &lt;code class=&quot;language-text&quot;&gt;:has()&lt;/code&gt; to implement &lt;code class=&quot;language-text&quot;&gt;:focus-within&lt;/code&gt;, which lets you target element if any of their descendants have focus. Both of these act the same:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;form:focus-within&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;form:has(*:focus)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Though with &lt;code class=&quot;language-text&quot;&gt;:has()&lt;/code&gt; we can go one step further, like only styling the form if it&amp;#x27;s a &lt;strong&gt;specific&lt;/strong&gt; element that has focus. This is not possible with focus-within:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;form:has(input[type=&amp;#x27;radio&amp;#x27;]:focus)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;showing-an-other-input-field-without-js&quot;&gt;Showing an &amp;quot;other&amp;quot; input field without JS&lt;/h3&gt;&lt;p&gt;It works for other pseudos as well, like &lt;code class=&quot;language-text&quot;&gt;:checked&lt;/code&gt;. With this we can implement an &amp;quot;other&amp;quot; input field that appears when a specific option is checked without writing a single line of JS:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;form:has(input.my-checkbox:checker) input.my-textfield&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;styling-forms-if-they-have-errors&quot;&gt;Styling forms if they have errors&lt;/h3&gt;&lt;p&gt;You can also pull up things like the &lt;code class=&quot;language-text&quot;&gt;:valid&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;:invalid&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;:user-invalid&lt;/code&gt; pseudo-classes to style a form differently:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;form:has(input:user-invalid)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3px dashed red&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or even to show a list of invalid or missing form fields at the top or bottom of the form:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;form:has(.name:user-invalid) li.name-warning&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There are many more examples you can think of, but I hope this has given you a good idea of the potential the &lt;code class=&quot;language-text&quot;&gt;:has()&lt;/code&gt; pseudo-class brings.&lt;/p&gt;&lt;h2 id=&quot;the-future-for-css-selectors&quot;&gt;The future for CSS selectors&lt;/h2&gt;&lt;p&gt;I very much look forward to all the clever things people will come up with using &lt;code class=&quot;language-text&quot;&gt;:is()&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;:where()&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;:has()&lt;/code&gt;, and don&amp;#x27;t think the examples above even scratches the surface.&lt;/p&gt;&lt;p&gt;Especially &lt;code class=&quot;language-text&quot;&gt;:has()&lt;/code&gt; is going to have a very large impage on the CSS selectors you will be writing in the coming years.&lt;/p&gt;&lt;p&gt;If you want to play around with the &lt;code class=&quot;language-text&quot;&gt;:has()&lt;/code&gt; selector ahead of general availability, you can &lt;a href=&quot;https://dashboard.polypane.app/register/&quot;&gt;start a free Polypane trial&lt;/a&gt; which has it enabled by default.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 9: Screenshot editor, structured data support and new debug tools]]></title><description><![CDATA[Polypane 9 ships with a completely new way of making and editing screenshots, support for different types of structured data in the Meta…]]></description><link>https://polypane.app/blog/polypane-9-screenshot-editor-structured-data-support-and-new-debug-tools/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-9-screenshot-editor-structured-data-support-and-new-debug-tools/</guid><pubDate>Wed, 11 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 9 ships with a completely new way of making and editing screenshots, support for different types of structured data in the Meta panel, new debug tools and many improvements to the outline and elements panel as well as performance improvements, and it now runs on Chromium 102.&lt;/p&gt;&lt;h2 id=&quot;new-screenshot-feature&quot;&gt;New Screenshot feature&lt;/h2&gt;&lt;p&gt;The Pane screenshots feature has been completely rewritten to solve two of our most requested improvements:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Faster screenshots,&lt;/li&gt;&lt;li&gt;Including edits made to the page, the focus order overlay and debug tool info in the screenshots.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;By screenshotting the actual panes instead of using a background renderer, we now do both! This means you can quickly make a screenshot showing for example the elements with contrast issues to send that along to your team or add to a ticket.&lt;/p&gt;&lt;h3 id=&quot;editing-screenshots&quot;&gt;Editing screenshots&lt;/h3&gt;&lt;p&gt;When you have made a screenshot, often you&amp;#x27;ll want to quickly edit it. Like redacting sensitive info, adding a rectangle around the area of interest or drawing a few arrows and add some text to explain the issue. Or maybe you want to clip the image to the area you care about.&lt;/p&gt;&lt;p&gt;All of that is now possible in the new &lt;em&gt;amazing&lt;/em&gt; screenshot editor powered by &lt;a href=&quot;https://pqina.nl/pintura/?aff=xLXrx&amp;amp;ref=polypane&quot;&gt;Pintura&lt;/a&gt;!&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-9/screenshot.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;&lt;em&gt;This video hasn&amp;#x27;t been sped up. It&amp;#x27;s really that fast!&lt;/em&gt;&lt;/p&gt;&lt;p&gt;When you&amp;#x27;re done with the image, you can save the image to disk (in the last used folder, or in a folder of your choice) or copy to clipboard. Once you&amp;#x27;ve saved the image, click the notification and the folder where you saved the image is opened.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9/savebar.png&quot; class=&quot;imgshadow&quot; alt=&quot;list of buttons to save, save as, copy to clipboard or dismiss.&quot;/&gt;&lt;p&gt;This really, really speeds up creating and sharing screenshots (copy to clipboard, paste them in Slack, done) and we can&amp;#x27;t wait to see what it&amp;#x27;ll do for your productivity.&lt;/p&gt;&lt;h2 id=&quot;element-panel-updates&quot;&gt;Element panel updates&lt;/h2&gt;&lt;p&gt;This release we worked on the tree view, making it more interactive and displaying more info in it. The panel now also has
autosuggestions for all CSS properties and HTML and ARIA attributes &lt;em&gt;with&lt;/em&gt; live preview across all panes.&lt;/p&gt;&lt;h3 id=&quot;tree-view-updates&quot;&gt;Tree view updates&lt;/h3&gt;&lt;p&gt;When you inspect elements on the page, the treeview now highlights the element so you can see where in the DOM you are.&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-9/highlight.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;Hidden elements are now slightly dimmed to differentiate them, and hovering over them no longer shows a tooltip in the panes.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9/hidden-elems.png&quot; class=&quot;imgshadow&quot; alt=&quot;Hidden elements in the treeview, like style and script, are dimmed.&quot;/&gt;&lt;p&gt;And when elements have a flex or grid layout, that is displayed as a badge so you can quickly see what element is responsible for the layout:&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9/treeviewbadges.png&quot; class=&quot;imgshadow&quot; alt=&quot;Some of the elements in the treeview have a badge after them saying &amp;#x27;flex&amp;#x27; or &amp;#x27;grid&amp;#x27;.&quot;/&gt;&lt;h3 id=&quot;autosuggestions-with-live-previews&quot;&gt;Autosuggestions with live previews&lt;/h3&gt;&lt;p&gt;Polypane now also shows autosuggestions for CSS values and HTML and ARIA attributes. When navigating through these in the autosuggestion dropdown they get automatically applied so you can quickly preview them:&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-9/suggestions.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;This live preview also works for HTML and ARIA attributes so you can quickly see what effect those have as well.&lt;/p&gt;&lt;p&gt;We spent quite a lot of time making sure we have the most complete list of CSS values, HTML and ARIA attributes, even for new and vendor-specific properties. Polypane will suggest more valid values than other browsers.&lt;/p&gt;&lt;h2 id=&quot;structured-data-in-meta-panel&quot;&gt;Structured data in Meta panel&lt;/h2&gt;&lt;p&gt;The Meta panel now shows any structured available on the page: JSON-LD, Microdata and RDF. The data is sorted by type and richly displayed where possible, meaning we automatically detect links, images and arrays and display them accordingly. When an image fails to load a warning is shown, so you can see at a glance if there&amp;#x27;s any issues you need to remedy.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9/structureddata.png&quot; class=&quot;imgshadow&quot; alt=&quot;overview of structured data for a Polypane blog post.&quot;/&gt;&lt;p&gt;Structured data is important for anyone doing SEO to make sure all the pages are assigned the right entity (so search engines know e.g. which products a page is selling, or the specific metadata for inclusion in the news tabs). With the new structured data overview, you can quickly see anything you might have overlooked.&lt;/p&gt;&lt;h2 id=&quot;mobile-friendly-tester&quot;&gt;Mobile friendly tester&lt;/h2&gt;&lt;p&gt;Also new in the Meta panel is a new &amp;quot;Mobile friendly&amp;quot; check:&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9/mobilefriendly.png&quot; class=&quot;imgshadow&quot; alt=&quot;Mobile friendly check in the Meta panel.&quot;/&gt;&lt;p&gt;This check follows the guidelines provided by Google and Bing in determining if a page is mobile friendly:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Has a viewport meta tag.&lt;/li&gt;&lt;li&gt;Has &lt;code class=&quot;language-text&quot;&gt;width=device-width&lt;/code&gt; in the meta tag.&lt;/li&gt;&lt;li&gt;At least 60% of the text on the page is larger than 12px.&lt;/li&gt;&lt;li&gt;There are no overlapping tap targets within an area of 48 by 48 pixels.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These checks are done on-the-fly as the meta data is gathered and will result in either a checkmark, or a list of issues to fix:&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9/notmobilefriendly.png&quot; class=&quot;imgshadow&quot; alt=&quot;Mobile friendly check showing issues that prevent the page from being mobile friendly.&quot;/&gt;&lt;p&gt;Issues show a button that turns on the appropriate debug tool to detect elements with small text (which was already available in Polypane) or with too small tap targets. This way finding the elements you need to fix takes just a single click.&lt;/p&gt;&lt;h3 id=&quot;find-small-tap-targets-with-target-size-debug-tool&quot;&gt;Find small tap targets with Target Size debug tool&lt;/h3&gt;&lt;p&gt;In earlier versions of Polypane the Target Size debug tool changed your cursor into a 48 by 48 square so you could manually check distances around links.&lt;/p&gt;&lt;p&gt;In Polypane 9 this debug tool has been expanded with a tool that analyses all interactive elements on your page to make sure there&amp;#x27;s at least an area of 48 by 48 pixels around each element. We use the same logic as Google Lighthouse to calculate this.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9/targetsize.png&quot; class=&quot;imgshadow&quot; alt=&quot;Red areas around interactive elements indicate they are too small and close together.&quot;/&gt;&lt;p&gt;Elements that are too small and too close together now get a red semitransparent border around them indicating the needed space, and to fix the issue you need to make sure the red borders of two elements no longer overlap.&lt;/p&gt;&lt;h2 id=&quot;track-focus-debug-tool&quot;&gt;Track focus debug tool&lt;/h2&gt;&lt;p&gt;With the Track Focus debug tool turned on, you get a visual highlight of the current focused element that follows the focus as you tab from element to element.&lt;/p&gt;&lt;p&gt;The focus order overlay shows you this information as well, but because the Track focus debug tool is dynamic it&amp;#x27;s better in handling things like focus traps and interactive pages.&lt;/p&gt;&lt;p&gt;You can combine it with the focus sync option (right click the sync button in the address bar to activate that) like in the video below to check focus across multiple screen sizes in one go.&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-9/focus.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;h2 id=&quot;in-page-zoom-and-search&quot;&gt;In-page zoom and search&lt;/h2&gt;&lt;p&gt;With the removal of the Legacy mode we we able to add two &amp;quot;regular&amp;quot; browser features that a lot of users have asked for: page zoom and in-page search.&lt;/p&gt;&lt;h3 id=&quot;in-page-zoom&quot;&gt;In-page zoom&lt;/h3&gt;&lt;p&gt;Page zooming is an important part of Accessibility audits, for various WCAG success criteria your page needs to be able to zoom to 200% or to 400% and now that&amp;#x27;s possible in Polypane with &lt;code class=&quot;language-text&quot;&gt;ctrl/cmd&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;alt&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;+/-&lt;/code&gt;, or with the &amp;quot;Zoom web pages&amp;quot; option in the View menu.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9/in-page-zoom.png&quot; class=&quot;imgshadow&quot; alt=&quot;In page zoom UI.&quot;/&gt;&lt;p&gt;After zooming a page a magnifier with either a plus or minus will be visible in the address bar, and clicking that opens a UI that lets you zoom in, out or reset back to 100% again. Due to the way Chromium internals work that doesn&amp;#x27;t work per pane, but per origin, so zooming in happens in all panes and is remembered for each origin.&lt;/p&gt;&lt;h3 id=&quot;in-page-search&quot;&gt;In-page search&lt;/h3&gt;&lt;p&gt;With &lt;code class=&quot;language-text&quot;&gt;ctrl/cmd&lt;/code&gt; &lt;code class=&quot;language-text&quot;&gt;f&lt;/code&gt; you can now search in all panes. All occurences of your search term are highlighted in yellow with the current matched search term in orange. You can also see where on the page matches are found in the scrollbar.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9/in-page-search.png&quot; class=&quot;imgshadow&quot; alt=&quot;in-page search UI.&quot;/&gt;&lt;p&gt;You can navigate through the search terms with the arrow buttons and toggle case sensitivity. Finally pressing &lt;code class=&quot;language-text&quot;&gt;esc&lt;/code&gt; clears the UI and search.&lt;/p&gt;&lt;h2 id=&quot;outline-panel-updates&quot;&gt;Outline panel updates&lt;/h2&gt;&lt;p&gt;We have a few updates in the outline panel to provide more information and useful warnings. And when you hover over an element in the panel, we now smoothly scroll to the element in each pane.&lt;/p&gt;&lt;h3 id=&quot;links-overview&quot;&gt;Links overview&lt;/h3&gt;&lt;p&gt;In the links overview, we now highlight the current page (and suggest adding aria-current when missing) and give warnings for placeholder values like &amp;quot;http://&amp;quot; or &amp;quot;mailto://&amp;quot; so you don&amp;#x27;t forget to fill them.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9/placeholderlink.png&quot; class=&quot;imgshadow&quot; alt=&quot;Warning for a link that has a placeholder value&quot;/&gt;&lt;h3 id=&quot;images-overview&quot;&gt;Images overview&lt;/h3&gt;&lt;p&gt;The image overview now warns you about broken images, supports the &lt;code class=&quot;language-text&quot;&gt;fetchpriority&lt;/code&gt; attribute and will highlight when an image is inside a link, because that will influence what the &lt;code class=&quot;language-text&quot;&gt;alt&lt;/code&gt; text should say.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9/image-not-found.png&quot; class=&quot;imgshadow&quot; alt=&quot;A warning showing for a broken image.&quot;/&gt;&lt;h3 id=&quot;focus-order-overview&quot;&gt;Focus order overview&lt;/h3&gt;&lt;p&gt;The focus order overview now shows the &lt;code class=&quot;language-text&quot;&gt;name&lt;/code&gt; of inputs and textareas instead of the content (which is usually empty). This will help you more quickly find the elements.&lt;/p&gt;&lt;h2 id=&quot;performance-improvements&quot;&gt;Performance improvements&lt;/h2&gt;&lt;p&gt;We refactored a large part of the Elements panel logic to deal with websites that use a lot of CSS Custom Properties, essentially removing the performance overhead we had for Custom Properties. The result is that Polypane will feel as fast on modern sites with lots of CSS Custom properties as it does on simple pages.&lt;/p&gt;&lt;h2 id=&quot;smaller-updates&quot;&gt;Smaller updates&lt;/h2&gt;&lt;p&gt;For all the changes there is the &lt;a href=&quot;#polypane-9-changelog&quot;&gt;changelog&lt;/a&gt;, but there&amp;#x27;s a few small updates we wanted to highlight:&lt;/p&gt;&lt;h3 id=&quot;color-scheme-support&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;color-scheme&lt;/code&gt; support&lt;/h3&gt;&lt;p&gt;The color-scheme meta attribute and CSS property can tell your browser if your site supports dark mode, light mode or both. When set your browser will automatically switch from the regular dark-on-light to a light-on-dark theme depending on if you tell it you only support dark mode, or if you support both and the &lt;code class=&quot;language-text&quot;&gt;prefers-color-scheme: dark&lt;/code&gt; media query matches. It does this without you writing a single line of CSS, which is pretty cool!&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-9/color-scheme.mp4&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;If you want to learn more about the &lt;code class=&quot;language-text&quot;&gt;color-scheme&lt;/code&gt; feature you can check out &lt;a href=&quot;https://www.youtube.com/watch?v=n3lcjY4Mm00&quot;&gt;Kevin Powell&amp;#x27;s video on &lt;code class=&quot;language-text&quot;&gt;color-scheme&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&quot;twitter-media-preview&quot;&gt;Twitter media preview&lt;/h3&gt;&lt;p&gt;Apart from small and large image summaries, Twitter has a third preview that you don&amp;#x27;t see that often: the media preview. It has a small preview image with a play button that expands into a media player. Polypane now supports that card type.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9/twitter-media.png&quot; class=&quot;imgshadow&quot; alt=&quot;Twitter media preview showing a play button.&quot;/&gt;&lt;h3 id=&quot;hide-add-pane-button&quot;&gt;Hide &amp;quot;Add pane&amp;quot; button&lt;/h3&gt;&lt;p&gt;In Polypane 8.1 we introduced the &amp;quot;Add pane&amp;quot; button to help people getting started with Polypane figure out how to add panes more quickly. If you don&amp;#x27;t need the button, you can now hide it in the global options menu in the top right of Polypane.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9/addpane.png&quot; class=&quot;imgshadow&quot; alt=&quot;Global settings showing the new &amp;#x27;Visible add pane button&amp;#x27; option.&quot;/&gt;&lt;h3 id=&quot;double-click-zoom-percentage-to-fit&quot;&gt;Double click zoom percentage to fit&lt;/h3&gt;&lt;p&gt;When you double click the zoom percentage in the header, it will reset either to 100%, or zoom out to fit all your panes. This brings feature parity with the pane zoom UI, which lets you do the same.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9/zoomtofit.png&quot; class=&quot;imgshadow&quot; alt=&quot;Zoom percentage in the Polypane UI.&quot;/&gt;&lt;h3 id=&quot;more-warnings-for-intrusive-pane-settings&quot;&gt;More warnings for intrusive pane settings&lt;/h3&gt;&lt;p&gt;In Polypane 8.1 with the introduction of the &lt;a href=&quot;/blog/polypane-8-1-resizable-element-tree-disable-js-feature-new-debug-tools-and-more/#disable-js&quot;&gt;disable JS debug tool&lt;/a&gt; we introduced a new UI that highlighted the disabled JS clearly.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-9/warning.png&quot; class=&quot;imgshadow&quot; alt=&quot;The top of a pane with an exclamation mark and red border.&quot;/&gt;&lt;p&gt;We frequently get support questions that turn out to be caused by a few other debug tools, so we now use the same UI for the following conditions:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Disable CSS debug tool&lt;/li&gt;&lt;li&gt;Content Chaos debug tool&lt;/li&gt;&lt;li&gt;Throttled network emulation&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;With the new UI it&amp;#x27;s immediatelly clear that there&amp;#x27;s something to keep in mind while interacting with a pane.&lt;/p&gt;&lt;h2 id=&quot;notable-fixes&quot;&gt;Notable fixes&lt;/h2&gt;&lt;p&gt;This version of Polypane has plenty of fixes, but we wanted to highlight two:&lt;/p&gt;&lt;h3 id=&quot;figma-state-resetting&quot;&gt;Figma state resetting&lt;/h3&gt;&lt;p&gt;The Figma preset in the Browse panel reset to the figma homepage every time you switched from the browse panel to another panel and back. We now preserve whatever Figma file you have open.&lt;/p&gt;&lt;h3 id=&quot;polypane-peek-improvements&quot;&gt;Polypane Peek improvements&lt;/h3&gt;&lt;p&gt;We fixed a few instances where inspecting elements stopped working or where the inspection tooltip had styling bleed through from the main page.&lt;/p&gt;&lt;p&gt;Inspecting elements now also completely prevents any clicks from propagating to the underlying element, so accidental clicks are prevented even for elements with javascript handlers.&lt;/p&gt;&lt;h2 id=&quot;updated-chromium&quot;&gt;Updated Chromium&lt;/h2&gt;&lt;p&gt;Chromium has been updated to 102.0.5005.40, and ships with a number of experimental features turned on by default, like support for container queries and &lt;code class=&quot;language-text&quot;&gt;:has()&lt;/code&gt;. Head over to our docs on &lt;a href=&quot;/docs/experimental-chromium-features/&quot;&gt;Experimental Chromium Features&lt;/a&gt; for a full overview of the available APIs. If you&amp;#x27;d like to see one activated, &lt;a href=&quot;/support/&quot;&gt;Let us know&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;get-polypane-9&quot;&gt;Get Polypane 9&lt;/h2&gt;&lt;p&gt;Polypane is available for Windows, Mac (universal dmg for both Intel and M1) and Linux (.deb or AppImage) in both 64 bit and ARM versions.&lt;/p&gt;&lt;p&gt;Polypane automatically updates on Mac, Windows and on Linux when using the AppImage. Otherwise, go to
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; to download the latest version!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Try it for free&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;h3 id=&quot;deprecation-notice&quot;&gt;Deprecation notice&lt;/h3&gt;&lt;p&gt;Polypane 9 removed legacy mode.&lt;/p&gt;&lt;h2 id=&quot;polypane-9-changelog&quot;&gt;Polypane 9 Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;New Features&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Screenshot editor.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Fast viewport and full page screenshots.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Debug tools and focus order overlay support in screenshots.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Structured data visualisation in Meta panel.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Mobile Friendly tester.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Track Focus debug tool.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Find small tap targets with Target Size debug tool.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Page zoom support.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Search in page support.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Ability to hide &amp;quot;Add Pane&amp;quot; button.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Chromium 102.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Support for color-scheme: dark (Thanks Kevin!).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Twitter Media preview.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Double click global zoom percentage to zoom to 100% or zoom to fit.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Hide open devtools whenever a popover or the address bar is active.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Shortcut overview uses new Shortcut display badges.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; All address bar tooltips now show Shortcut badges (Thanks Florent!).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Workspaces show shortcut badges in tooltips.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Suggest &lt;code class=&quot;language-text&quot;&gt;initial-scale=1&lt;/code&gt; when its missing.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Debug tool: Disable CSS and content chaos debug tools now shows warning in pane title.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Debug tool: readability uses an improved calculation.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Throttled network now shows warning in pane title.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Performance: Sites with many CSS Custom Properties now respond much faster.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Performance: chromium devtools are no longer automatically launched for single panes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Performance: New tab rendering logic.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Network throttling is now a toggle button.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: warning for incomplete links like &amp;quot;http://&amp;quot; or &amp;quot;mailto:&amp;quot;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: warning for broken images.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: highlight current page in links overview, and suggest &lt;code class=&quot;language-text&quot;&gt;aria-current&lt;/code&gt; when missing.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: Show &lt;code class=&quot;language-text&quot;&gt;fetchpriority&lt;/code&gt; attribute.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: Focus order overview now shows the &lt;code class=&quot;language-text&quot;&gt;name&lt;/code&gt; of inputs and textareas.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: Focus order overview truncates long content.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: Headings and Links &amp;quot;hidden&amp;quot; badge now use the same color.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: Display when an image is inside a link.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: Scroll smoothly to highlighted element.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Default Mobile and Tablet tabs now use mobile rendering by default.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Polypane Peek now shows the type for &lt;code class=&quot;language-text&quot;&gt;input&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;button&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Polypane Peek, elements panel, outline panel: hide the element dimension ratio when it&amp;#x27;s 1:1.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Inspected element is now highlighted in treeview.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Focusing a css value suggestion live previews it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Autosuggestions for CSS values, HTML attributes and aria attributes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Grey out hidden elements in the tree view.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Improve design of CSS sections.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Hidden elements no longer show Peek tooltip when highlighted in tree view.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Show flex and grid badges in tree view.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Click event is now fully prevented after inspecting elements.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Emulation: Color gamut now has an &amp;quot;off&amp;quot; value.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Emulation: show a title for each emulation option.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated design for context menus.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Polypane is now included in the WebBrowser category on Linux.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Support for the &lt;code class=&quot;language-text&quot;&gt;base&lt;/code&gt; element in link and image resolution.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated Google Fonts.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Browse panel: no longer resets URL on tab switch for Figma (Thanks Kevin!).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Polypane Peek is now more resilient to website styling.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Debug Tool active dot was not fully visible.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Active dot for forced colors was not showing.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Polypane no longer tries to get CrUX data for local pages.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: Text color was cut off in elements panel for elements with many classes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: now shows CSS styles from inside media queries inside stylesheets linked with &lt;code class=&quot;language-text&quot;&gt;@import&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: prevent NaN when updating units without numbers.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: a:link and a:any-link CSS selectors are shown in the elements panel again.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel: Inspecting Flickity carousels prevented selection.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements Panel: computed styles no longer show a disable style checkbox.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; issue where context menu &amp;quot;add pane&amp;quot; item didn&amp;#x27;t create a new pane.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Creating an overview screenshot no longer triggers &amp;quot;current version is up to date&amp;quot; message in certain situations (Thanks Justin!).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; On Mac, sometimes inspecting twice in a row prevented the node highlight from showing (Thanks Justin!).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; In-app chat position with bottom-aligned panel was in the wrong place.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent spacebar-dragging from getting stuck after switching away and back to Polypane.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Custom headers not always applying.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Meta panel: Facebook preview no longer overflows when there is no facebook data.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Toggle scroll shortcut was broken.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where Chromium devtools settings would not persist.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Icon alignment in debug tools list.&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Forced colors explained: A practical guide]]></title><description><![CDATA[Forced colors is a CSS media query that when active radically changes the way your site looks, without any of your input.
In this article we…]]></description><link>https://polypane.app/blog/forced-colors-explained-a-practical-guide/</link><guid isPermaLink="false">https://polypane.app/blog/forced-colors-explained-a-practical-guide/</guid><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Forced colors is a CSS media query that when active radically changes the way your site looks, without any of your input.
In this article we&amp;#x27;ll explore where it comes from, how it changes your site and how you can adapt to it.&lt;/p&gt;&lt;p&gt;Making sure your site works well with Forced colors is not a lot of work and you can get very far with a little bit
of effort and have a massive impact on the people using Forced colors. Read on to learn more!&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;This article is adapted from a talk Kilian gave at &lt;a href=&quot;https://conffab.com/video/forced-colors-explained/&quot;&gt;Web Directions AAA 2021&lt;/a&gt;. You can &lt;a href=&quot;/support/&quot;&gt;contact us&lt;/a&gt; if you&amp;#x27;re interested in Kilian presenting this at your conference, meetup or organisation.&lt;/p&gt;&lt;/blockquote&gt;&lt;img alt=&quot;The Polypane homepage shown side-by-side, with the right side showing the site in dark forced color mode.&quot; src=&quot;/blogs/forcedcolors/side-by-side.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;h2 id=&quot;where-does-forced-color-mode-come-from&quot;&gt;Where does forced color mode come from?&lt;/h2&gt;&lt;p&gt;Forced colors started in Windows 7, with support in Internet Explorer 10, as &amp;quot;High contrast mode&amp;quot; available from the system settings. With High contrast mode users can pick from one of 4 high contrast themes or choose their own theme. And when they do, their entire OS is rendered in that theme.&lt;/p&gt;&lt;p&gt;The feature is available in all current versions of Windows, though in Windows 11 it&amp;#x27;s been renamed to just Contrast Themes. It&amp;#x27;s also available in Ubuntu.&lt;/p&gt;&lt;p&gt;Here&amp;#x27;s an important bit of information though: &lt;strong&gt;High contrast mode is not about high contrast.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Well it kind of is, but it also isn&amp;#x27;t. Let me explain.&lt;/p&gt;&lt;p&gt;What High contrast mode does is severely limit the palette of available colors, and lets users pick which colors those are, for the things that make up a UI:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Text&lt;/li&gt;&lt;li&gt;Background&lt;/li&gt;&lt;li&gt;Links&lt;/li&gt;&lt;li&gt;Buttons&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For those types of UI, users will usually pick highly contrasting colors. But they don&amp;#x27;t have to. They can also choose to avoid specific colors, create a sepia theme or specifically configure the theme to avoid contrast.&lt;/p&gt;&lt;p&gt;The main feature is that it &lt;strong&gt;limits and controls the range of colors&lt;/strong&gt;, making it easier for users to emphasize content and UI in a way that works for them.&lt;/p&gt;&lt;p&gt;In other words, they force colors. In the rest of this article I will try to be intentional with when I use Forced color mode and when I use High contrast mode, but in most situations you can use them interchangeably.&lt;/p&gt;&lt;h2 id=&quot;who-uses-this-feature&quot;&gt;Who uses this feature?&lt;/h2&gt;&lt;p&gt;High contrast mode is useful for many different people, but includes people with low vision, color blindness, people prone to migraines or light sensitivity and people prone to overstimulation.&lt;/p&gt;&lt;p&gt;But also people who know of the feature and use it to keep their screen readable in bright sunlight, or dim their entire UI in dark environments. High contrast mode is one of the only features that will force &lt;em&gt;all&lt;/em&gt; colors to change, and guarantees that across the operating system UI and browser (compared to say, &lt;code class=&quot;language-text&quot;&gt;prefers-dark-mode&lt;/code&gt;, which only works for sites that have it implemented).&lt;/p&gt;&lt;p&gt;In terms of numbers, Microsoft states that 4% of Windows users use High Contrast mode. In the WebAIM low vision survey, 50% of low vision users indicate they used the mode but of course, that is likely a very self-selecting group of savvy users.&lt;/p&gt;&lt;p&gt;You can still assume that one in twenty five of your visitors will have it enabled.&lt;/p&gt;&lt;h2 id=&quot;how-do-you-turn-on-high-contrast-mode&quot;&gt;How do you turn on High contrast mode?&lt;/h2&gt;&lt;p&gt;When you open the system settings on Windows 10 there is an option called &amp;quot;Ease of access&amp;quot; where you can find various accessibility options.&lt;/p&gt;&lt;img alt=&quot;Windows 10 settings overview&quot; src=&quot;/blogs/forcedcolors/settings1.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;To the left you see a couple of different categories: Vision, Hearing and Interaction. Under Vision is where you can find high contrast.&lt;/p&gt;&lt;img alt=&quot;Windows 10 Ease of Access settings&quot; src=&quot;/blogs/forcedcolors/settings2.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;blockquote&gt;&lt;p&gt;If you use Windows and haven&amp;#x27;t looked around here yet, go and see all the other neat features that are available. I for example have set a different zoom level here to keep things readable on my relatively small screen.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Here you can toggle it on and off, and then choose the theme you want.&lt;/p&gt;&lt;img alt=&quot;Windows 10 High Contrast settings&quot; src=&quot;/blogs/forcedcolors/settings3.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;There is also a shortcut to toggle it on and off: &lt;code class=&quot;language-text&quot;&gt;left alt + left shift + print screen&lt;/code&gt;. This will use your last selected theme.&lt;/p&gt;&lt;div style=&quot;display:flex;gap:0.5rem;width:100%;position:relative;flex-wrap:wrap&quot;&gt;&lt;img style=&quot;flex:1 1 20%;width:20%;height:auto;max-width:100%&quot; alt=&quot;Color Palette for High Contrast #1&quot; src=&quot;/blogs/forcedcolors/theme1.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;img style=&quot;flex:1 1 20%;width:20%;height:auto;max-width:100%&quot; alt=&quot;Color Palette for High Contrast #2&quot; src=&quot;/blogs/forcedcolors/theme2.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;img style=&quot;flex:1 1 20%;width:20%;height:auto;max-width:100%&quot; alt=&quot;Color Palette for High Contrast Black&quot; src=&quot;/blogs/forcedcolors/themeblack.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;img style=&quot;flex:1 1 20%;width:20%;height:auto;max-width:100%&quot; alt=&quot;Color Palette for High Contrast White&quot; src=&quot;/blogs/forcedcolors/themewhite.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;/div&gt;&lt;p&gt;There&amp;#x27;s four themes available:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;High Contrast #1&lt;/li&gt;&lt;li&gt;High Contrast #2&lt;/li&gt;&lt;li&gt;High Contrast Black&lt;/li&gt;&lt;li&gt;High Contrast White&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The first three are all light-on-dark themes and mostly differ in their accenting color. Green for #1, Blue for #2 and teal for &amp;quot;black&amp;quot;. High contrast white is the only dark-on-light theme.&lt;/p&gt;&lt;p&gt;All of those are pretty high contrast, why did I mention that it wasn&amp;#x27;t really about contrast earlier?&lt;/p&gt;&lt;p&gt;That&amp;#x27;s because from here you can also configure your own color theme by clicking on each of the color swatches. Choose colors for text, links, buttons and background and when you apply you get to save it as your own theme.&lt;/p&gt;&lt;img alt=&quot;Opened color picker to select a new color for links in the high contrast windows 10 settings&quot; src=&quot;/blogs/forcedcolors/custom.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;Notice by the way that it also shows the currently selected colors name, I thought that was neat. Interestingly, there&amp;#x27;s no way to edit a previously created theme, export it or import it. That seems like an oversight.&lt;/p&gt;&lt;p&gt;So that&amp;#x27;s how to turn it on and how to configure it, but what about testing with it when you don&amp;#x27;t want to turn it on for yourself, or when you don&amp;#x27;t have a windows device? Well, you have a few different options:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;If you have a Windows device, you can turn it on directly.&lt;/strong&gt; &lt;br/&gt; This gives you the real deal, but has the downside of your entire OS getting forced colors, including your devtools. If you don&amp;#x27;t already have a windows device, consider getting a very cheap one (I have a Surface Go) since that will also help you test on windows in general, and on a slower machine specifically.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;You can run a Windows VM and activate it in there.&lt;/strong&gt; &lt;br/&gt; Same upsides and downsides as a real device, but in a VM everything is going to be slower.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;You can test it in &lt;a href=&quot;https://assistivlabs.com/assistive-tech/display/high-contrast-mode&quot;&gt;Assistiv labs&lt;/a&gt;.&lt;/strong&gt; &lt;br/&gt;This runs a cloud-based VM, so again same upsides and downsides.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;You can emulate it in Polypane.&lt;/strong&gt; &lt;br/&gt; This is emulated inside a pane, so it&amp;#x27;s fast and only the pane has forced colors, but it only supports a single dark and light forced color mode, so you can&amp;#x27;t experiment with how different custom themes look. Usually checking the dark and light modes are enough to suss out any issues.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In terms of browser support, Edge, Firefox, Chrome and Chromium derivatives all support the forced-colors media query for Windows high contrast mode. So they will display your site in the forced colors your visitor set. IE and Old Edge support Windows high contrast mode but they use an outdated, non-standard syntax that we won&amp;#x27;t be looking at in this article.&lt;/p&gt;&lt;p&gt;Now we know what high contrast mode is, how to activate it and what browser support it. But how does it work?&lt;/p&gt;&lt;h2 id=&quot;how-does-forced-color-mode-work&quot;&gt;How does Forced color mode work?&lt;/h2&gt;&lt;p&gt;When Forced-colors is active in a browser, anything that lets you specify a color, but also things that contain colors like shadows, get reset. Background images are preserved, except on links and form elements, buttons excluded. The following styles will get reverted to their initial value and overwritten with user theme colors.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;color&lt;/li&gt;&lt;li&gt;background-color&lt;/li&gt;&lt;li&gt;border-color&lt;/li&gt;&lt;li&gt;outline-color&lt;/li&gt;&lt;li&gt;fill&lt;/li&gt;&lt;li&gt;stroke&lt;/li&gt;&lt;li&gt;text-decoration-color&lt;/li&gt;&lt;li&gt;text-emphasis-color&lt;/li&gt;&lt;li&gt;column-rule-color&lt;/li&gt;&lt;li&gt;scrollbar-color&lt;/li&gt;&lt;li&gt;-webkit-tap-highlight-color&lt;/li&gt;&lt;li&gt;box-shadow&lt;/li&gt;&lt;li&gt;text-shadow&lt;/li&gt;&lt;li&gt;background-image&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Text that&amp;#x27;s on top of images get a solid background color, called a &amp;quot;backplate&amp;quot;, to force the correct contrast. Forced colors keeps your inline images and SVG icons intact, including their colors.&lt;/p&gt;&lt;p&gt;So Forced colors takes your site, maintains the layout and typography but completely rewrites your colors. For a quick idea, here&amp;#x27;s a comparison with an existing website. Notice how backgrounds and colors have changed or disappeared, but images still look the same.&lt;/p&gt;&lt;img alt=&quot;The Polypane homepage shown side-by-side, with the right side showing the site in dark forced color mode.&quot; src=&quot;/blogs/forcedcolors/side-by-side.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;h3 id=&quot;similar-browser-features&quot;&gt;Similar browser features&lt;/h3&gt;&lt;p&gt;There&amp;#x27;s two browser features that can do similar things.&lt;/p&gt;&lt;img alt=&quot;An article shown in a browsers reader mode&quot; src=&quot;/blogs/forcedcolors/readermode.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;First is Reader mode. Reader mode will extract and reformat the content of a page in a user-chosen theme, and discard all the layout of a page. Forced colors maintains the layout while changing just the colors.&lt;/p&gt;&lt;img alt=&quot;The macOS settings with increase contrast turned on&quot; src=&quot;/blogs/forcedcolors/prefers-contrast.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;The other feature is the &lt;code class=&quot;language-text&quot;&gt;prefers-contrast&lt;/code&gt; media query. This is an upcoming media query that has support in Safari and Chromium. Prefers-contrast is a way for users to ask for more or less contrast, for example with macOS&amp;#x27;s &amp;quot;increase contrast&amp;quot; accessibility option.&lt;/p&gt;&lt;p&gt;While this works nicely on macOS, on Windows &lt;code class=&quot;language-text&quot;&gt;forced-colors&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;prefers-contrast&lt;/code&gt; are always active at the same time, and there isn&amp;#x27;t a way to turn off &lt;code class=&quot;language-text&quot;&gt;forced-colors&lt;/code&gt; without turning off &lt;code class=&quot;language-text&quot;&gt;prefers-contrast&lt;/code&gt; as well. This means that &lt;code class=&quot;language-text&quot;&gt;prefers-contrast&lt;/code&gt; on itself is not very useful on Windows.&lt;/p&gt;&lt;h2 id=&quot;how-to-know-when-your-site-is-being-rendered-in-forced-colors-mode-and-what-should-you-do-with-it&quot;&gt;How to know when your site is being rendered in Forced colors mode and what should you do with it?&lt;/h2&gt;&lt;p&gt;Firstly, the media query &lt;code class=&quot;language-text&quot;&gt;forced-colors&lt;/code&gt; will be &lt;code class=&quot;language-text&quot;&gt;active&lt;/code&gt; when it&amp;#x27;s on and &lt;code class=&quot;language-text&quot;&gt;none&lt;/code&gt; when it&amp;#x27;s off.&lt;/p&gt;&lt;p&gt;Additionally, browsers will look at the background color of the high contrast theme to determine if this is a dark mode or light mode theme, and use that to set &lt;code class=&quot;language-text&quot;&gt;prefers-color-scheme&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;dark&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;light&lt;/code&gt;.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;forced-colors&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; active&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* forced colors are active */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;forced-colors&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; active&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-color-scheme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; dark&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* High Contrast #1, #2 or Black is active (or custom theme) */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;forced-colors&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; active&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-color-scheme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; light&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* High Contrast White is active (or custom theme) */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;test-your-site&quot;&gt;Test your site&lt;/h2&gt;&lt;p&gt;To test your site in Polypane, open up the pane emulation settings and toggle the &amp;quot;Forced-contrast&amp;quot; toggle and optionally the &amp;quot;prefers-color-scheme&amp;quot; toggle.&lt;/p&gt;&lt;img alt=&quot;The polypane website in a Pane with the media emulation settings open, with forced-contrast and prefers-color-scheme both active and highlighted.&quot; src=&quot;/blogs/forcedcolors/site-active.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;With forced color mode turned on we can test our site! There are small differences in how Firefox, Chrome and Edge deal with forced color mode, particularly around images, but they shouldn&amp;#x27;t affect the testing and styling you do.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;The changes we&amp;#x27;re going to make are not about making your site look &amp;quot;good&amp;quot; again, they are to respect the visitors wishes and nudge your site closer to those. We&amp;#x27;re going for clarity and readability.&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;replacing-backgrounds-with-borders&quot;&gt;Replacing backgrounds with borders&lt;/h3&gt;&lt;p&gt;Without your colors and backgrounds things might look a little empty. Forced colors resets your background colors, and resets all background colors to the same color. That means areas that were differentiated by different background colors will now all look the same, and that can hinder understanding.&lt;/p&gt;&lt;p&gt;What we&amp;#x27;re going to do is add either borders or outlines to elements that need it. Whether you want to use a border or outline is more or less up to you, depending on what you can do with your layout (borders influence your layout while outlines don&amp;#x27;t). Keep in mind you will want to use the outline for focus styling as well though.&lt;/p&gt;&lt;p&gt;We can use the platform to keep things simple and add &lt;code class=&quot;language-text&quot;&gt;border:1px solid&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;outline: 1px solid&lt;/code&gt; leaving out the color. The browser will match the text color for us.&lt;/p&gt;&lt;p&gt;Adding these borders will also reduce the visual complexity of your page by adding clear delineations, like I have done here for buttons and the header.&lt;/p&gt;&lt;div style=&quot;display:flex;gap:0.5rem;max-width:100%;position:relative;flex-wrap:wrap&quot;&gt;&lt;img style=&quot;height:auto;max-width:100%&quot; alt=&quot;regular design shows a background.&quot; src=&quot;/blogs/forcedcolors/bg-to-border1.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;img style=&quot;height:auto;max-width:100%&quot; alt=&quot;for forced-colors, replace background with a border.&quot; src=&quot;/blogs/forcedcolors/bg-to-border2.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;/div&gt;&lt;h3 id=&quot;find-missing-content&quot;&gt;Find missing content&lt;/h3&gt;&lt;p&gt;Next, scan your page for missing content, in particular SVG icons, as they are left alone by forced colors and you need to help the browser along and give them the right color. How do you do that if you don&amp;#x27;t know what colors a user has picked? A long time ago CSS2 came with something called &amp;quot;system colors&amp;quot;, that let you use the exciting array of grays that Operating systems came in in 1998.&lt;/p&gt;&lt;p&gt;However, browsers have not supported those for a long time. It turns out that when you give web developers the exact styling used to create the OS style, they abuse that to show fake popups and get users to do things they shouldn&amp;#x27;t do. So they don&amp;#x27;t work anymore.&lt;/p&gt;&lt;p&gt;Luckily, CSS4 comes with an updated set of System colors, specifically designed to work with forced colors. These also work without forced colors but with forced colors active, they will map perfectly to the theme chosen by your visitor.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;CanvasText&lt;/code&gt;: Regular text color&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Canvas&lt;/code&gt;: Background color&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;LinkText&lt;/code&gt;: Link color&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;ButtonText&lt;/code&gt;: Button text color&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;ButtonFace&lt;/code&gt;: Button background color&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;HighlightText&lt;/code&gt;: Selected text color&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Highlight&lt;/code&gt;: Selected text background color&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;When you&amp;#x27;re updating SVGs, check where you use them (in text, in links or in buttons) and pick the one that matches your SVG&amp;#x27;s use case.&lt;/p&gt;&lt;p&gt;You can probably fix a lot of these with some generic CSS already, though check whether your SVGs are styled with &lt;code class=&quot;language-text&quot;&gt;fill&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;stroke&lt;/code&gt; before making your CSS &lt;em&gt;too&lt;/em&gt; generic.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;forced-colors&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; active&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;svg&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;stroke&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; CanvasText &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;a svg&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;stroke&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; LinkText &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;button svg&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;stroke&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ButtonText &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here we give all regular SVGs the text color, all linked SVGs the link color and all SVGs in buttons the button color.&lt;/p&gt;&lt;div style=&quot;display:flex;gap:0.5rem;max-width:100%;position:relative;flex-wrap:wrap&quot;&gt;&lt;img style=&quot;height:auto;max-width:100%&quot; alt=&quot;an SVG in forced-color mode with the original color&quot; src=&quot;/blogs/forcedcolors/svg1.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;img style=&quot;height:auto;max-width:100%&quot; alt=&quot;an SVG in forced-color mode with the canvastext color to match the text&quot; src=&quot;/blogs/forcedcolors/svg2.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;/div&gt;&lt;p&gt;Alternatively you can use &lt;code class=&quot;language-text&quot;&gt;currentColor&lt;/code&gt; for the SVGs to automatically follow the color of the element they&amp;#x27;re in. This will make them follow the forced color theme of your user as well. In Chromium versions between 89 and 102 there was an error where this didn&amp;#x27;t happen, but that has been resolved.&lt;/p&gt;&lt;p&gt;Of course, make sure you check if this fixes all your inline SVGs and if you need to tweak some of them individually.&lt;/p&gt;&lt;h3 id=&quot;check-the-colors&quot;&gt;Check the colors&lt;/h3&gt;&lt;p&gt;When you replace all the colors on your page, you also lose the meaning of anything that&amp;#x27;s only conveyed through color. Using only color to convey meaning is a WCAG violation so you shouldn&amp;#x27;t do that anyway... but it&amp;#x27;s still something you have to check.&lt;/p&gt;&lt;p&gt;Are there any elements that only use color to convey meaning? Those need to be updated. Common ones are showing a red or green border on form fields. Make sure to add a shape like a checkmark or better, clear error or success text. This also makes your site better for the 95% of people not using forced colors, so everyone wins.&lt;/p&gt;&lt;h3 id=&quot;text-in-images&quot;&gt;Text in images&lt;/h3&gt;&lt;p&gt;Another one I have to mention is, check if your page does not have any text in images. They won&amp;#x27;t be converted to the users theme. The solution is straightforward: &lt;strong&gt;Don&amp;#x27;t have text in images.&lt;/strong&gt;&lt;/p&gt;&lt;h3 id=&quot;semi-transparent-images&quot;&gt;Semi-transparent images&lt;/h3&gt;&lt;p&gt;That&amp;#x27;s not the only type of images you have to check though. You might also be using semi-transparant PNGs or external SVGs that you expect to be shown on a certain color background. For these, consider adding a dark and light mode alternative to the image and swapping between them depending on what &lt;code class=&quot;language-text&quot;&gt;prefers-color-scheme&lt;/code&gt; matches.&lt;/p&gt;&lt;p&gt;For SVGs that you use in image elements, you can also add an inline &lt;code class=&quot;language-text&quot;&gt;&amp;lt;style&amp;gt;&lt;/code&gt; element with CSS for &lt;code class=&quot;language-text&quot;&gt;forced-colors&lt;/code&gt; in the SVG itself, and the browser will pick that up. Pretty neat!&lt;/p&gt;&lt;h3 id=&quot;focus-styles&quot;&gt;Focus styles&lt;/h3&gt;&lt;p&gt;Lastly, it&amp;#x27;s time to tab through the page and make sure that focus is still clearly indicated. If you have disabled the outline in favor of your own nicer looking focus styles, for example with box shadow to get those nice rounded corners: remember that focus mode removes all box shadows.&lt;/p&gt;&lt;p&gt;A good way to deal with this is to replace your &lt;code class=&quot;language-text&quot;&gt;outline: none&lt;/code&gt; with &lt;code class=&quot;language-text&quot;&gt;outline-color: transparent&lt;/code&gt;. Without forced colors, the outline will still not be visible but with forced colors, that outline color will be overwritten with the current text color, making it nicely visible again without needing any special adaption or re-styling for forced color mode.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* don&amp;#x27;t: */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;element:focus&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;outline&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 0 0 2px orangered&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* do: */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;element:focus&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;outline-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; transparent&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;box-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 0 0 2px orangered&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;in-summary&quot;&gt;In summary&lt;/h3&gt;&lt;p&gt;So to summarize, when adapting to Forced colors you want to make sure you:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Replace areas delineated by backgrounds with borders or outlines.&lt;/li&gt;&lt;li&gt;Make sure all your icons are visible and follow the users theme.&lt;/li&gt;&lt;li&gt;Take care that there is no meaning conveyed by color alone, as that color will be gone in forced color mode.&lt;/li&gt;&lt;li&gt;Replace or provide alternatives for images that don&amp;#x27;t work well, such as ones with text or ones with transparency.&lt;/li&gt;&lt;li&gt;Make sure a focus indicator is still visible for all focusable elements.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;disabling-forced-color-mode&quot;&gt;Disabling forced color mode&lt;/h2&gt;&lt;p&gt;But ...what if you need to disable forced colors? There are situations where the colors you picked are absolutely important, such as when showing a color selector in a webshop. Used sparingly on specific elements, and definitely not on specific sections or entire pages, you can add this CSS property.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.my-specific-element&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;forced-color-adjust&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With that you can turn off forced colors for that element and it&amp;#x27;s children. There are a few legitimate places where this makes sense but please make sure to use it sparingly and to respect your visitors wishes as much as possible.&lt;/p&gt;&lt;h2 id=&quot;in-closing&quot;&gt;In closing&lt;/h2&gt;&lt;p&gt;And with that, we&amp;#x27;ve explained Forced colors. We now know what forced colors are, how to configure them, why they&amp;#x27;re used, which browsers support them, how to test them, how to make sure our sites look good in them and lastly, how to disable them only when that&amp;#x27;s absolutely needed.&lt;/p&gt;&lt;p&gt;If you want to read more, in particular on the differences with Internet Explorer then these four links should give you plenty information:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://blogs.windows.com/msedgedev/2020/09/17/styling-for-windows-high-contrast-with-new-standards-for-forced-colors/&quot;&gt;Styling for Windows High Contrast by Melanie Richards and Alison Maher&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://adrianroselli.com/2021/02/whcm-and-system-colors.html&quot;&gt;WHCM and system colors by Adrian Roselli&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://webaim.org/blog/high-contrast/&quot;&gt;Assistive Technology Experiment: High Contrast by Jon Whiting&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://ericwbailey.github.io/working-with-high-contrast-mode-talk/&quot;&gt;Working with High Contrast mode by Eric Bailey&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If you want to learn about more CSS media queries, check out our &lt;a href=&quot;/blog/the-complete-guide-to-css-media-queries/&quot;&gt;complete guide to CSS Media Queries&lt;/a&gt; and &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;get a Polypane trial&lt;/a&gt; to quickly start testing your sites in Forced Color mode.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Create a Polypane account with GitHub]]></title><description><![CDATA[Today we launch the option to start a Polypane trial with GitHub Auth.  When you  register for a Polypane trial 
click the "Register with…]]></description><link>https://polypane.app/blog/create-a-polypane-account-with-git-hub/</link><guid isPermaLink="false">https://polypane.app/blog/create-a-polypane-account-with-git-hub/</guid><pubDate>Wed, 06 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Today we launch the option to start a Polypane trial with GitHub Auth.&lt;/strong&gt; When you &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;register for a Polypane trial&lt;/a&gt;
click the &amp;quot;Register with GitHub&amp;quot; button to authenticate with Github instead of creating a username and password.&lt;/p&gt;&lt;img alt=&quot;Start a trial or continue with GitHub&quot; src=&quot;/blogs/githublogin/loginoptions.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;This way we&amp;#x27;ll prefill your info from GitHub and you can get started with Polypane right away in a more streamlined fashion.&lt;/p&gt;&lt;p&gt;Signing up with a username and password is still available as well.&lt;/p&gt;&lt;h3 id=&quot;existing-accounts&quot;&gt;Existing accounts&lt;/h3&gt;&lt;p&gt;If you have an existing account and want to sign in with GitHub instead, click the &amp;quot;Sign in with GitHub&amp;quot; button on the
&lt;a href=&quot;https://dashboard.polypane.app/signin&quot;&gt;Sign in page&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;If your email accounts match we automatically detect that and you&amp;#x27;re given the option to authenticate with your password.
Once that&amp;#x27;s done your GitHub login is now linked to your account and you can use GitHub to log in seamlessly.&lt;/p&gt;&lt;h3 id=&quot;remembering-your-login&quot;&gt;Remembering your login&lt;/h3&gt;&lt;p&gt;One thing that we personally always forget is &lt;em&gt;which service we used for which services&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;To save you the trouble from having to remember, once you&amp;#x27;ve logged in with either username and password or GitHub we&amp;#x27;ll show your preferred method up top:&lt;/p&gt;&lt;img alt=&quot;Polypane&amp;#x27;s Sign in form, with GitHub up top and the text that you last used it.&quot; src=&quot;/blogs/githublogin/remember.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;So that&amp;#x27;s our new GitHub Auth, helping you cut down on separate accounts by offloading the authentication to a service
you probably already use. Let us know what you think over on &lt;a href=&quot;https://twitter.com/polypane&quot;&gt;Twitter&lt;/a&gt;!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Always open localhost in your development browser]]></title><description><![CDATA[Many development servers will automatically open their URL when you launch them, and without configuration that happens in your default…]]></description><link>https://polypane.app/blog/always-open-localhost-in-your-development-browser/</link><guid isPermaLink="false">https://polypane.app/blog/always-open-localhost-in-your-development-browser/</guid><pubDate>Tue, 22 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Many development servers will automatically open their URL when you launch them, and without configuration that happens in your default browser. If you use a separate development browser, like Polypane, that can be annoying because you&amp;#x27;ll then have to re-open them in your development browser. While you can configure each of your projects to use a browser other than your default browser, you&amp;#x27;ll have to configure that for every project you work on.&lt;/p&gt;&lt;p&gt;What if instead you could always open localhost in your development browser while opening all other URLs in your regular browser?&lt;/p&gt;&lt;p&gt;Here are some tools for macOS, Windows and Linux that let you do just that!&lt;/p&gt;&lt;h2 id=&quot;macos&quot;&gt;macOS&lt;/h2&gt;&lt;p&gt;On Mac you can use Choosy or Velja if you prefer a GUI, or Finicky if you prefer creating your own config file:&lt;/p&gt;&lt;h3 id=&quot;finicky&quot;&gt;&lt;a href=&quot;https://github.com/johnste/finicky&quot;&gt;Finicky&lt;/a&gt;&lt;/h3&gt;&lt;img src=&quot;/blogs/localhostopeners/finicky-logo.svg&quot; alt=&quot;Finicky logo&quot; style=&quot;margin-inline:auto;width:200px;position:relative;display:block&quot;/&gt;&lt;p&gt;Finicky uses a &lt;code class=&quot;language-text&quot;&gt;.finicky.js&lt;/code&gt; file in your home directory that lets you configure precisely which URLs should open in which browsers. Follow the installation instructions for Finicky, then add the following handler to your &lt;code class=&quot;language-text&quot;&gt;.finicky.js&lt;/code&gt; file to open all localhost URLs in Polypane.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;defaultBrowser&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;Google Chrome&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Or &amp;quot;Safari&amp;quot;, &amp;quot;Firefox&amp;quot; etc.&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;handlers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;^https?:\/\/localhost.*$&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;browser&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;Polypane&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&quot;installation-and-configuration&quot;&gt;Installation and configuration&lt;/h4&gt;&lt;p&gt;To use Finicky, &lt;a href=&quot;https://github.com/johnste/finicky/releases&quot;&gt;download it&lt;/a&gt; or install it using Homebrew: &lt;code class=&quot;language-text&quot;&gt;brew install --cask finicky&lt;/code&gt;. Then create a .finicky.js file in your home directory using the above and start Finicky, allowing it to be set as the default browser.&lt;/p&gt;&lt;p&gt;Finicky can do other things as well, like rewriting your URLs. Check out the full &lt;a href=&quot;https://github.com/johnste/finicky&quot;&gt;Finicky documentation&lt;/a&gt; for all the available options.&lt;/p&gt;&lt;h3 id=&quot;choosy&quot;&gt;&lt;a href=&quot;https://www.choosyosx.com/&quot;&gt;Choosy&lt;/a&gt;&lt;/h3&gt;&lt;img src=&quot;/blogs/localhostopeners/choosy.png&quot; alt=&quot;Choosy logo&quot; style=&quot;margin:0 auto;width:200px;position:relative;display:block&quot;/&gt;&lt;p&gt;If you prefer having a GUI to configure your rules then check out Choosy! This application can either prompt you when you open a new URL, or you can configure rules to open specific URLs in specific browsers, and comes with a UI to configure different rules.&lt;/p&gt;&lt;h4 id=&quot;installation-and-configuration-1&quot;&gt;Installation and configuration&lt;/h4&gt;&lt;p&gt;You can download Choosy from the website, &lt;a href=&quot;https://www.choosyosx.com/&quot;&gt;choosyosx.com&lt;/a&gt; and try it for free for 44 days, after which you can buy a license for $10.&lt;/p&gt;&lt;p&gt;To set a rule to always open localhost in Polypane, go to the Rules tab and add a new rule:&lt;/p&gt;&lt;img src=&quot;/blogs/localhostopeners/choosy1.png&quot; alt=&quot;The Choosy UI with the &amp;#x27;rules&amp;#x27; tab and the &amp;#x27;plus&amp;#x27; button highlighted&quot; style=&quot;margin:0 auto;position:relative;display:block;width:min(700px, 100%)&quot;/&gt;&lt;p&gt;Give the rule a name like &amp;quot;localhost&amp;quot; and select the &amp;quot;matches this regular expression&amp;quot; option after &amp;quot;website&amp;quot;. Add &lt;code class=&quot;language-text&quot;&gt;/^https?:\/\/localhost.*$/&lt;/code&gt; as the value. Then select &amp;quot;Always use this browser...&amp;quot; below &amp;quot;When this rule applies, Choosy should...&amp;quot; and click the &amp;quot;Change&amp;quot; button and select Polypane.&lt;/p&gt;&lt;img src=&quot;/blogs/localhostopeners/choosy2.png&quot; alt=&quot;The Choosy UI with a popup to add a rule.&quot; style=&quot;margin:0 auto;position:relative;display:block;width:min(700px, 100%)&quot;/&gt;&lt;p&gt;Now your localhost URLs will open in Polypane.&lt;/p&gt;&lt;h3 id=&quot;velja&quot;&gt;&lt;a href=&quot;https://sindresorhus.com/velja&quot;&gt;Velja&lt;/a&gt;&lt;/h3&gt;&lt;img src=&quot;/blogs/localhostopeners/velja.png&quot; alt=&quot;Velja logo&quot; style=&quot;margin:0 auto;width:200px;position:relative;display:block&quot;/&gt;&lt;p&gt;Another GUI option is Velja. It&amp;#x27;s a very new app but it has a number of interesting features: You can configure a number of different apps, like Figma, Zoom and Notion to automatically open their own links in the app instead of in the browser, and you can let it automatically clean tracking parameters when copying links.&lt;/p&gt;&lt;h4 id=&quot;installation-and-configuration-2&quot;&gt;Installation and configuration&lt;/h4&gt;&lt;p&gt;You can download Velja for free from the &lt;a href=&quot;https://apps.apple.com/app/id1607635845&quot;&gt;app store&lt;/a&gt;. It&amp;#x27;s a sandboxed app, so when you first launch it it will walk you through everything it needs access to, and asks to be set as the default browser.&lt;/p&gt;&lt;p&gt;To set a rule to always open localhost in Polypane, go to the Rules tab in the preferences and add a new rule:&lt;/p&gt;&lt;img src=&quot;/blogs/localhostopeners/velja1.png&quot; alt=&quot;The Velja UI with the &amp;#x27;rules&amp;#x27; tab and the &amp;#x27;plus&amp;#x27; button highlighted&quot; style=&quot;margin:0 auto;position:relative;display:block;width:min(400px, 100%)&quot;/&gt;&lt;p&gt;Give the rule a name like &amp;quot;localhost&amp;quot;. If you want you can leave sample URL empty, or add your default localhost URL. Keep &amp;quot;detect via&amp;quot; set to Domain, and for &amp;quot;Match&amp;quot; select Polypane.&lt;/p&gt;&lt;img src=&quot;/blogs/localhostopeners/velja2.png&quot; alt=&quot;The Velja UI with a popup to add a rule.&quot; style=&quot;margin:0 auto;position:relative;display:block;width:min(400px, 100%)&quot;/&gt;&lt;p&gt;Now your localhost URLs will open in Polypane.&lt;/p&gt;&lt;h3 id=&quot;browserosaurus&quot;&gt;&lt;a href=&quot;https://browserosaurus.com/&quot;&gt;Browserosaurus&lt;/a&gt;&lt;/h3&gt;&lt;img src=&quot;/blogs/localhostopeners/browserosaurus.png&quot; alt=&quot;Browserosaurus logo&quot; style=&quot;margin-inline:auto;width:100px;position:relative;display:block&quot;/&gt;&lt;p&gt;An honorable mention here is Browserosaurus. This is an open source application developed by &lt;a href=&quot;https://wstone.io/&quot;&gt;Will Stone&lt;/a&gt; that will prompt you whenever you try to open a URL.&lt;/p&gt;&lt;img src=&quot;/blogs/localhostopeners/browserosaurusscreen.png&quot; alt=&quot;screenshot of Browserosaurus&quot; style=&quot;margin-inline:auto;width:min(400px, 100%);position:relative;display:block&quot;/&gt;&lt;p&gt;Though it doesn&amp;#x27;t have any rules to automatically send URLs to specific browsers, you can add a shortcut to your development browser (Like &amp;quot;P&amp;quot; for Polypane) and press that when the prompt is shown to open links in Polypane.&lt;/p&gt;&lt;h4 id=&quot;installation&quot;&gt;Installation&lt;/h4&gt;&lt;p&gt;You can install Browserosaurus by downloading the right version from their &lt;a href=&quot;https://github.com/will-stone/browserosaurus/releases/latest&quot;&gt;Github releases page&lt;/a&gt; (x64 for Intel, arm64 for M1) or install it using Homebrew: &lt;code class=&quot;language-text&quot;&gt;brew install --cask browserosaurus&lt;/code&gt;.&lt;/p&gt;&lt;h2 id=&quot;windows&quot;&gt;Windows&lt;/h2&gt;&lt;p&gt;On Windows you can use Account surfer if you prefer a GUI or BrowserSelector if you prefer a configuration file.&lt;/p&gt;&lt;h3 id=&quot;browserselector&quot;&gt;&lt;a href=&quot;https://github.com/DanTup/BrowserSelector&quot;&gt;BrowserSelector&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;BrowserSelector uses a &lt;code class=&quot;language-text&quot;&gt;BrowserSelector.ini&lt;/code&gt; file saved next to the BrowserSelector.exe file. Follow the installation instructions for BrowserSelector, then add the following to your &lt;code class=&quot;language-text&quot;&gt;BrowserSelector.ini&lt;/code&gt; file to open all localhost URLs in Polypane.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;ini&quot;&gt;&lt;pre class=&quot;language-ini&quot;&gt;&lt;code class=&quot;language-ini&quot;&gt;&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;browsers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;polypane&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;C:\Program Files\Polypane\Polypane.exe&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;URLs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;localhost&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;polypane&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;/localhost\:*/&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;polypane&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&quot;installation-and-configuration-3&quot;&gt;Installation and configuration&lt;/h4&gt;&lt;p&gt;First, download the &lt;a href=&quot;https://github.com/DanTup/BrowserSelector/releases&quot;&gt;latest release from GitHub&lt;/a&gt;. Extract BrowserSelector.exe and BrowserSelector.ini in a folder you can easily get to with the terminal. Then open &lt;code class=&quot;language-text&quot;&gt;BrowserSelector.init&lt;/code&gt; using Notepad and add in the Polypane lines in the code box above under &lt;code class=&quot;language-text&quot;&gt;[browsers]&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;[URLs]&lt;/code&gt;. Save and close the file.&lt;/p&gt;&lt;p&gt;Next, open your terminal, go to the folder you extracted BrowserSelector in and execute the command &lt;code class=&quot;language-text&quot;&gt;.\BrowserSelector.exe --register&lt;/code&gt;. This will prompt an admin check asking you if you want BrowserSelector to make changes to your installation. Allow this, then go to your Default apps settings and select &amp;quot;DanTup.BrowserSelector&amp;quot; as your default application.&lt;/p&gt;&lt;img src=&quot;/blogs/localhostopeners/browserselector.png&quot; alt=&quot;The windows default apps settings showing how to select BrowserSelector&quot; style=&quot;margin-inline:auto;position:relative;display:block&quot;/&gt;&lt;p&gt;That&amp;#x27;s it, now all localhost URLs are opened in Polypane.&lt;/p&gt;&lt;h3 id=&quot;account-surfer&quot;&gt;&lt;a href=&quot;https://www.microsoft.com/en-us/p/account-surfer/9phvp9rjr7r7?activetab=pivot:overviewtab&quot;&gt;Account Surfer&lt;/a&gt;&lt;/h3&gt;&lt;img src=&quot;/blogs/localhostopeners/accountsurfer.png&quot; alt=&quot;Account Surfer logo&quot; style=&quot;margin-inline:auto;width:100px;position:relative;display:block&quot;/&gt;&lt;p&gt;Account Surfer is a GUI application that lets you choose which browser and browser profile to use when you click on any link and optionally lets you remember that choice for future use.&lt;/p&gt;&lt;h4 id=&quot;installation-1&quot;&gt;Installation&lt;/h4&gt;&lt;p&gt;You can get Account Surfer on the &lt;a href=&quot;https://www.microsoft.com/en-us/p/account-surfer/9phvp9rjr7r7?activetab=pivot:overviewtab&quot;&gt;Windows store&lt;/a&gt; for $6.99. When you first launch the app it asks you to set it as the default browsers, which you can do by clicking through to the settings, scrolling down to the &amp;quot;Web Browser&amp;quot; setting and choosing Account surfer when prompted.&lt;/p&gt;&lt;img src=&quot;/blogs/localhostopeners/windows-settings.png&quot; alt=&quot;The windows default apps settings showing how to select Account Surfer&quot; style=&quot;margin-inline:auto;position:relative;display:block&quot;/&gt;&lt;p&gt;After you have set Account Surfer as the default browser you&amp;#x27;ll see the overview of browsers:&lt;/p&gt;&lt;img src=&quot;/blogs/localhostopeners/accountsurfer1.png&quot; alt=&quot;The main Account Surfer interface&quot; style=&quot;margin-inline:auto;position:relative;display:block&quot;/&gt;&lt;p&gt;Click through to settings. There you will find the header &amp;quot;Saved domains&amp;quot; with a list of browsers below it. Click the &amp;quot;+ domain&amp;quot; button under &amp;quot;Polypane&amp;quot;.&lt;/p&gt;&lt;img src=&quot;/blogs/localhostopeners/accountsurfer2.png&quot; alt=&quot;The Account surfer settings&quot; style=&quot;margin-inline:auto;position:relative;display:block&quot;/&gt;&lt;p&gt;Add the &lt;code class=&quot;language-text&quot;&gt;localhost&lt;/code&gt; domain to Polypane and press &amp;quot;Save&amp;quot; to have Account Surfer always open Localhost URLs in Polypane.&lt;/p&gt;&lt;p&gt;Account Surfer does not support regular expressions yet, so if your dev server uses a specific port, like &lt;code class=&quot;language-text&quot;&gt;8000&lt;/code&gt;, make sure to add that &lt;code class=&quot;language-text&quot;&gt;localhost:8000&lt;/code&gt; to the domain.&lt;/p&gt;&lt;img src=&quot;/blogs/localhostopeners/accountsurfer3.png&quot; alt=&quot;Adding a rule to the account server settings&quot; style=&quot;margin-inline:auto;position:relative;display:block&quot;/&gt;&lt;h2 id=&quot;linux&quot;&gt;Linux&lt;/h2&gt;&lt;h3 id=&quot;bowser&quot;&gt;&lt;a href=&quot;https://github.com/blipk/bowser&quot;&gt;Bowser&lt;/a&gt;&lt;/h3&gt;&lt;img src=&quot;/blogs/localhostopeners/bowser.png&quot; alt=&quot;Bowser logo&quot; style=&quot;margin-inline:auto;width:100px;position:relative;display:block&quot;/&gt;&lt;p&gt;On Linux there is Bowser, which is available as a stand-alone application or a &lt;a href=&quot;https://extensions.gnome.org/extension/2989/bowser-gnome-extension/&quot;&gt;Gnome extension&lt;/a&gt;.
Follow the instructions on the link to set up the Gnome extension, which adds a little icon in he Gnome bar where you can set up your preferred browser:&lt;/p&gt;&lt;img src=&quot;/blogs/localhostopeners/bowser-gnome.png&quot; alt=&quot;Bowser gnome extension popup&quot; style=&quot;margin-inline:auto;position:relative;display:block&quot;/&gt;&lt;h4 id=&quot;installation-2&quot;&gt;Installation&lt;/h4&gt;&lt;p&gt;If you don&amp;#x27;t use Gnome, then the stand-alone application works for you. First check out the repository:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone https://github.com/blipk/Bowser.git&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you don&amp;#x27;t have python3 and python3-tk, make sure to install them first: &lt;code class=&quot;language-text&quot;&gt;sudo apt install python3 python3-tk&lt;/code&gt; or
&lt;code class=&quot;language-text&quot;&gt;sudo yum install python3 python3-tkinter&lt;/code&gt; depending on your version of Linux.&lt;/p&gt;&lt;p&gt;In the Bowser folder, run the &lt;code class=&quot;language-text&quot;&gt;bowser.py&lt;/code&gt; file:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;python bowser.py&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If python 3 is not your default python, you need to switch out &lt;code class=&quot;language-text&quot;&gt;python&lt;/code&gt; for &lt;code class=&quot;language-text&quot;&gt;python3&lt;/code&gt;, as well as in the first line of &lt;code class=&quot;language-text&quot;&gt;bowser.py&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;This will install and setup Bowser for you as well as set it as the default browser. Once installed the configuration window will appear:&lt;/p&gt;&lt;img src=&quot;/blogs/localhostopeners/bowser1.png&quot; alt=&quot;Bowser configuration window&quot; style=&quot;margin-inline:auto;position:relative;display:block&quot;/&gt;&lt;p&gt;Here, click the &amp;quot;new rule&amp;quot; button, and in the popup you see fill in &lt;code class=&quot;language-text&quot;&gt;localhost&lt;/code&gt; and press OK:&lt;/p&gt;&lt;img src=&quot;/blogs/localhostopeners/bowser2.png&quot; alt=&quot;Bowser New rule dialog&quot; style=&quot;margin-inline:auto;position:relative;display:block&quot;/&gt;&lt;p&gt;Then select the new &amp;quot;localhost&amp;quot; rule and at the bottom of the configuration window click on your default browser (Firefox in my case) and select Polypane in the dropdown.&lt;/p&gt;&lt;img src=&quot;/blogs/localhostopeners/bowser3.png&quot; alt=&quot;Bowser configuration window with localhost option selected&quot; style=&quot;margin-inline:auto;position:relative;display:block&quot;/&gt;&lt;p&gt;Lastly, if you don&amp;#x27;t want Bowser to show a popup for every new link, uncheck &amp;quot;Create rules for new links&amp;quot; under the &amp;quot;Settings&amp;quot; menu. Once done, you can close the configuration window and everything is set up! If you want to change or update your configuration, run &lt;code class=&quot;language-text&quot;&gt;python bowser.py&lt;/code&gt; again.&lt;/p&gt;&lt;h3 id=&quot;roll-your-own&quot;&gt;Roll your own&lt;/h3&gt;&lt;p&gt;If you&amp;#x27;re feeling adventurous, This superuser answer explains how you can setup an &lt;code class=&quot;language-text&quot;&gt;xdg-open&lt;/code&gt; script: &lt;a href=&quot;https://superuser.com/questions/688063/is-there-a-way-to-redirect-certain-URLs-to-specific-web-browsers-in-linux/688094#688094&quot;&gt;redirect certain URLs to specific web browsers in Linux&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;It depends on a few different settings like which &lt;code class=&quot;language-text&quot;&gt;grep&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;*-open&lt;/code&gt; (like &lt;code class=&quot;language-text&quot;&gt;gvfs-open&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;kde-open&lt;/code&gt; etc) you have, so you&amp;#x27;ll have to see what works for your setup.&lt;/p&gt;&lt;h2 id=&quot;alternative-our-browser-extensions&quot;&gt;Alternative: our browser extensions&lt;/h2&gt;&lt;p&gt;If you don&amp;#x27;t want to run a separate tool as your browser, an alternative for Polypane is to run our browser extensions.&lt;/p&gt;&lt;p&gt;These add a Polypane button to your browser chrome that you can click to open the current page in Polypane, so when localhost does get opened in your default browser, a single click sends them straight to Polypane.&lt;/p&gt;&lt;p&gt;Polypane has browser extensions for Chrome, Firefox, Edge, Opera, Brave, Vivaldi and Safari, all available on our &lt;a href=&quot;/download/&quot;&gt;download page&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;know-other-ways&quot;&gt;Know other ways?&lt;/h2&gt;&lt;p&gt;If you know other applications, please &lt;a href=&quot;https://twitter.com/polypane&quot;&gt;let us know&lt;/a&gt; and we&amp;#x27;ll update the article!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Developing for color blindness with Polypane]]></title><description><![CDATA[While you might know about color blindness, it can be difficult to imagine being color blind. In fact, many people think
it means you can't…]]></description><link>https://polypane.app/blog/developing-for-color-blindness-with-polypane/</link><guid isPermaLink="false">https://polypane.app/blog/developing-for-color-blindness-with-polypane/</guid><pubDate>Mon, 14 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;While you might know about color blindness, it can be difficult to imagine being color blind. In fact, many people think
it means you can&amp;#x27;t see any color at all, which is not true. Full color blindness, or &amp;quot;Achromatopsia&amp;quot;, only occurs in 0.00003% of males worldwide so it&amp;#x27;s exceedingly rare. Much more common is the inability to see, or tell the difference, between &lt;em&gt;some&lt;/em&gt; colors.&lt;/p&gt;&lt;img alt=&quot;Color blindness checks in Polypane&quot; src=&quot;static/colorblindness-1c2ec2c904e83b5a62959e6e6b42340d.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;h2 id=&quot;what-is-color-blindness&quot;&gt;What is color blindness?&lt;/h2&gt;&lt;p&gt;Color blindness is the name for a group of different eye conditions that affect how a person perceives colors. Due to genetics, it is significantly more prevalent in men compared to women. Around 1 in every 12 men and only 1 in every 200 women have some form of color blindness, so it&amp;#x27;s probably more common than you&amp;#x27;d have guessed!&lt;/p&gt;&lt;p&gt;These different eye conditions can be divided into three categories.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Red-green color blindness (Deuteranopia and Protanopia)&lt;/li&gt;&lt;li&gt;Blue-yellow color blindness (Tritanopia)&lt;/li&gt;&lt;li&gt;Full color blindness (Achromatopsia)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Of those three, Red-green color blindness is by far the most common: roughly half of the men with color blindness have some form of deuteranopia, followed by one in fifty having protanopia. From there on the percentages quickly grow smaller: tritanopia and achromatopsia are both very rare at less than one in a hundred thousand or less.&lt;/p&gt;&lt;p&gt;But knowing that doesn&amp;#x27;t help &lt;em&gt;understanding&lt;/em&gt; people&amp;#x27;s experience. That&amp;#x27;s where Polypane&amp;#x27;s simulators come in.&lt;/p&gt;&lt;h2 id=&quot;color-blindness-simulators-in-polypane&quot;&gt;Color blindness simulators in Polypane&lt;/h2&gt;&lt;p&gt;Polypane&amp;#x27;s simulators quickly let you see your site with eight common types of color blindness. For each eye deficiency we provide two simulators: one for the &amp;quot;full&amp;quot; deficiency, and one for a mild version of it.&lt;/p&gt;&lt;p&gt;Color blindness is a spectrum and can range from barely noticable to severe, so any simulator you use makes a choice where on that spectrum it sits. When a deficiency is less severe, the name ends in &amp;quot;-omaly&amp;quot; (like in &amp;quot;anomaly&amp;quot;). The name for the severe deficiency ends in &amp;quot;op(s)ia&amp;quot;. Keep that in mind as we go through the various simulators:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Red-green color blindness&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Deuteranomaly&lt;/li&gt;&lt;li&gt;Deuteranopia&lt;/li&gt;&lt;li&gt;Protanomaly&lt;/li&gt;&lt;li&gt;Protanopia&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Blue-yellow color blindness&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Tritanomaly&lt;/li&gt;&lt;li&gt;Tritanopia&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Full color blindness&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Achromatomaly&lt;/li&gt;&lt;li&gt;Achromatopsia&lt;/li&gt;&lt;li&gt;Cerebral achromatopsia&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The eye has three types of cones that can percieve color, and they roughly translate to red, green and blue. When one or more of those types of conest don&amp;#x27;t work well, it causes a specific type of color blindness.&lt;/p&gt;&lt;p&gt;Deuteranopia and protanopia are both grouped under red-green color blindness because both make it difficult to tell the difference between red and green. For deuteranopia, this means people lack the ability to see green properly, and for protanopia the ability to see red is diminished. This causes those colors to look similar.&lt;/p&gt;&lt;p&gt;Tritanopia describes people who have difficulty seeing blue, which they confuse with green and difficulty seeing yellow, which becomes like violet for them.&lt;/p&gt;&lt;p&gt;For people with achromatopsia, none of their cones work properly. That leaves the rods in their retina, which are used to distinguish between dark and light. These rods are more sensitive to light than the cones so that&amp;#x27;s why with normal vision it&amp;#x27;s possible for you to see in the dark, but also why you don&amp;#x27;t see color in the dark.&lt;/p&gt;&lt;p&gt;Real achromatopsia is very rare, and also causes blurred vision. Cerebral achromatopsia happens when users can no longer see color specifically due to damage to the brain, such as from a stroke, and is also very rare.&lt;/p&gt;&lt;h3 id=&quot;turning-on-color-blindness-simulators-in-polypane&quot;&gt;Turning on Color Blindness simulators in Polypane&lt;/h3&gt;&lt;p&gt;Now lets see how you can simulate color blindness in Polypane. Turning on a simulator is straightforward and only takes three clicks. Each pane in Polypane has a &lt;a href=&quot;/docs/debug-tools/&quot;&gt;Debug tools&lt;/a&gt; icon above it, and you can click it to open the list of available debug tools:&lt;/p&gt;&lt;img alt=&quot;debug tools menu&quot; src=&quot;static/debug-tool-c283cd0f85e18d2c03be2abfa2692e13.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;In it, switch to the &amp;quot;simulators&amp;quot; tab and click the simulator you want to turn on:&lt;/p&gt;&lt;img alt=&quot;simulators menu&quot; src=&quot;static/simulators-73652ad359f79461737b60aaf1dcc45a.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;When you&amp;#x27;ve turned it on, the debug tool icon has a small dot.&lt;/p&gt;&lt;img alt=&quot;Active dot&quot; src=&quot;data:image/png;base64,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&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;To see which debug tool is active you can hover the icon to show the active debug tool in the tooltip, or click it to see it in the overview.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Polypane has much more debug tools! Check them all out in our &lt;a href=&quot;/docs/debug-tools/&quot;&gt;debug tool documentation&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;h3 id=&quot;designing-and-developing-for-color-blindness&quot;&gt;Designing and developing for color blindness&lt;/h3&gt;&lt;p&gt;With a color blindness simulator active, you&amp;#x27;ll want to &lt;strong&gt;check if any of the colors you use no longer communicate well&lt;/strong&gt;. In particular red and green, which are often used to signify something going wrong or well respectively.&lt;/p&gt;&lt;p&gt;When you find an issue, &lt;strong&gt;try to communicate the same information &lt;em&gt;without&lt;/em&gt; color&lt;/strong&gt;, like in text or with an icon. Make sure that you&amp;#x27;re not communicating info with color alone. By offering multiple indicators your designs become easier to understand for all your users.&lt;/p&gt;&lt;h2 id=&quot;testing-for-other-visual-deficiencies-and-environmental-circumstances&quot;&gt;Testing for other visual deficiencies and environmental circumstances&lt;/h2&gt;&lt;p&gt;Color blindness is not the only visual deficiency Polypane can emulate. There are a number of other visual impairments as well as environmental circumstances that we can emulate. With these, you can test your site for things like glaucoma, tunnel vision, bright sunlight or even emulate how someone with dyslexia could experience your website.&lt;/p&gt;&lt;p&gt;Testing for this broad range of experiences is important. &lt;strong&gt;Not because each of them will give you a concrete issue to fix, but because all of them help you empathise with people&amp;#x27;s experience.&lt;/strong&gt; This will help you make better design and development decisions in your project.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 8.1: Resizable element tree, disable JS feature, new debug tools and more]]></title><description><![CDATA[Polypane 8.1 comes with two often requested features: The tree view in the elements panel is now resizable so you can adapt it to your…]]></description><link>https://polypane.app/blog/polypane-8-1-resizable-element-tree-disable-js-feature-new-debug-tools-and-more/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-8-1-resizable-element-tree-disable-js-feature-new-debug-tools-and-more/</guid><pubDate>Tue, 08 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 8.1 comes with two often requested features: The tree view in the elements panel is now resizable so you can adapt it to your preferences, and there is a new Disable JS debug tool that disables JavaScript in a pane.&lt;/p&gt;&lt;p&gt;We also made a bunch of improvements to the Meta and outline panels, added a dimmed screen simulator, made design updates throughout the app and fixed a number of performance issues.&lt;/p&gt;&lt;h2 id=&quot;resizable-tree-view&quot;&gt;Resizable tree view&lt;/h2&gt;&lt;p&gt;You can now resize the tree view in the elements panel, allowing you to show either more of the tree or more of the style or attribute tabs.&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-8-1/elementspanelresize.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; muted=&quot;&quot; playsinline=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;The Polypane elements panel shown in multiple configurations (right, bottom and left-aligned) while the size of the tree view (vertically or horizontally) is being changed.&lt;/video&gt;&lt;p&gt;We got requests for this ever since we launched the elements panel, so we&amp;#x27;re thrilled to finally have it in. Expect this to show up in other places in the future as well, like the meta and source panels.&lt;/p&gt;&lt;h2 id=&quot;disable-js&quot;&gt;Disable JS&lt;/h2&gt;&lt;p&gt;Another feature many people have asked us for is a way to disable JS. Previously our answer was to use the Chromium devtools for this, but Polypane 8.1 introduces a new Disable JS debug tool so you can turn JavaScript off right from the Polypane interface.&lt;/p&gt;&lt;img src=&quot;/doc-img/overlays/disable-js.png&quot; class=&quot;imgshadow&quot; alt=&quot;Two panes in Polypane, one of them with the Disable JS debug tool active.&quot;/&gt;&lt;p&gt;&lt;em&gt;(Don&amp;#x27;t worry, Polypane&amp;#x27;s docs work without JavaScript, just not in our dev server!)&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Different from other debug tools, Disable JS draws a red border around the pane, and shows a warning icon. Disabling JS also disables various Polypane features in that specific tab, so the warning is there as a reminder.&lt;/p&gt;&lt;h2 id=&quot;dimmed-screen-simulator&quot;&gt;Dimmed screen simulator&lt;/h2&gt;&lt;p&gt;We also added a new simulator, for dimmed screens. This will emulate a desktop screen at 40% brightness, or a mobile phone with the brightness turned all the way down:&lt;/p&gt;&lt;img src=&quot;/doc-img/overlays/dimmedscreen.png&quot; class=&quot;imgshadow&quot; alt=&quot;Three panes in Polypane, one of them is dimmed.&quot;/&gt;&lt;h2 id=&quot;meta-panel-updates&quot;&gt;Meta panel updates&lt;/h2&gt;&lt;p&gt;Each release, we make sure that our social media previews still reflect the latest updates, and look for ways we can improve them even further. This takes a lot of work, but the end result is that &lt;strong&gt;Polypane has the most accurate and up to date previews&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;No other tool, not even the official testers, come close to the accuracy in Polypane, both in terms of pixel precision as well as character precision.&lt;/p&gt;&lt;p&gt;In this release, we updated the &lt;strong&gt;Google SERP preview&lt;/strong&gt;, which recently added a new &amp;quot;kebab&amp;quot; menu to each item:&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-8-1/serp.png&quot; class=&quot;imgshadow&quot; alt=&quot;A Google SERP preview.&quot;/&gt;&lt;p&gt;&lt;em&gt;As you can see, we can even render previews for localhost!&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Slack previews&lt;/strong&gt; also show the file size of the images it shows. Previously Polypane just showed &amp;quot;000 kB&amp;quot; for these, but we now show the accurate file size, just like Slack itself!&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-8-1/slack.png&quot; class=&quot;imgshadow&quot; alt=&quot;A Slack preview.&quot;/&gt;&lt;p&gt;Lastly, we recently noticed an update to the &amp;quot;empty state&amp;quot; design of Facebook link previews, so that&amp;#x27;s also been updated.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-8-1/fbempty.png&quot; class=&quot;imgshadow&quot; alt=&quot;An empty Facebook preview&quot;/&gt;&lt;p&gt;We also fixed two issues for the meta panel: when a site had a list of favicons and all of them returned a 404 code, this would slow down Polypane as it tried to find a favicon to display. Additionally, we now handle image URLS with query parameters better in the Twitter, Facebook and Slack previews.&lt;/p&gt;&lt;h2 id=&quot;outline-panel-updates&quot;&gt;Outline panel updates&lt;/h2&gt;&lt;p&gt;We continue to improve the Outline panel and make it more useful for devs building sites and accessibility auditors checking sites.&lt;/p&gt;&lt;p&gt;For the &lt;strong&gt;Links&lt;/strong&gt;, external URLs now get an icon so they&amp;#x27;re quicker to spot. When a link has a title attribute we&amp;#x27;ll display that in the overview, and also give a warning if the text in the title is the same as the link text itself, since this is an accessibility issue.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-8-1/external.png&quot; class=&quot;imgshadow&quot; alt=&quot;A link from the link panel showing an external icon: a square with an arrow pointing out of it to the top right.&quot;/&gt;&lt;p&gt;For &lt;strong&gt;all lists&lt;/strong&gt; we now more consistently show the text even when the element is hidden, and show a &amp;quot;hidden&amp;quot; badge whenever that&amp;#x27;s the case. In future releases we&amp;#x27;ll improve on this even further, providing warnings when the accessible text and visible text does not match.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-8-1/hiddenheadings.png&quot; class=&quot;imgshadow&quot; alt=&quot;A list of headings with some of them having the badge &amp;#x27;hidden&amp;#x27;.&quot;/&gt;&lt;h2 id=&quot;design-updates&quot;&gt;Design updates&lt;/h2&gt;&lt;p&gt;This release implemented a bunch of subtle updates to the design of the app, to help users get around easier and to make common actions more efficient.&lt;/p&gt;&lt;h3 id=&quot;an-explicit-add-pane-button&quot;&gt;An explicit &amp;#x27;add pane&amp;#x27; button&lt;/h3&gt;&lt;p&gt;While there are half a dozen ways to add panes in Polypane, like double-clicking, &lt;code class=&quot;language-text&quot;&gt;ctrl + n&lt;/code&gt; or the File menu, we didn&amp;#x27;t have an explicit UI element you could click to add a pane, leading to some users not figuring out how to add one. To help users in this area, we now show an explicit &amp;quot;add&amp;quot; button at the end of your your panes:&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-8-1/add.png&quot; class=&quot;imgshadow&quot; alt=&quot;The new add button with an overlaid arrow pointing to it.&quot;/&gt;&lt;p&gt;We feel this strikes a good balance between being clear and not being too much in-your-face, and we&amp;#x27;d love to hear your responses.&lt;/p&gt;&lt;h3 id=&quot;debug-tool-buttons-switched&quot;&gt;Debug tool buttons switched&lt;/h3&gt;&lt;p&gt;The Redo and clear buttons for debug tools have now been switched around, with redo being the left button and clear being the right button. Clearing a debug tool is the more often used button, so that&amp;#x27;s now brought closer to the debug tools menu button.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-8-1/debug.png&quot; class=&quot;imgshadow&quot; alt=&quot;The new debug tool button configuration.&quot;/&gt;&lt;p&gt;This makes the most frequently used option the easiest to reach, though we apologize for any muscle memory you have to retrain now.&lt;/p&gt;&lt;h3 id=&quot;updated-shortcut-badges&quot;&gt;Updated shortcut badges&lt;/h3&gt;&lt;p&gt;Shortcuts in menu items are now shown as badges instead of underlined text. They&amp;#x27;re now rendered in a larger font-size and the lack of underline also improves their readability.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-8-1/shortcutbadges.png&quot; class=&quot;imgshadow&quot; alt=&quot;The reload menu showing new shortcut badges.&quot;/&gt;&lt;p&gt;On Mac they use the icons for Cmd, Option and Shift (⌘, ⌥ and ⇧ respectively) to bring them in line with the native menu shortcuts.&lt;/p&gt;&lt;h3 id=&quot;more-info-in-the-polypane-peek-tooltip&quot;&gt;More info in the Polypane Peek tooltip&lt;/h3&gt;&lt;p&gt;In previous releases the &lt;a href=&quot;/docs/polypane-peek/&quot;&gt;Polypane Peek&lt;/a&gt; tooltip shows the &lt;code class=&quot;language-text&quot;&gt;alt&lt;/code&gt; attribute when inspecting an image. We&amp;#x27;ve expanded that to showing the &lt;code class=&quot;language-text&quot;&gt;href&lt;/code&gt; value when inspecting links, and the &lt;code class=&quot;language-text&quot;&gt;action&lt;/code&gt; value when inspecting forms.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-8-1/href.png&quot; class=&quot;imgshadow&quot; alt=&quot;A Polypane Peek tooltip, with the &amp;#x27;href&amp;#x27; info highlighted with a box around it.&quot;/&gt;&lt;h3 id=&quot;other-changes&quot;&gt;Other changes&lt;/h3&gt;&lt;p&gt;We&amp;#x27;ve tweaked the navigator area of the elements panel, so that the font information now also has an appropriate icon, and the spacing around all elements has been refined to make it clearer which elements below together.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-8-1/elementspanel.png&quot; class=&quot;imgshadow&quot; alt=&quot;The updated navigator area of the Elements panel.&quot;/&gt;&lt;p&gt;We&amp;#x27;ve also gone through all the resize cursors used in the app to make them both internally consistent and consistent with the operating system. It&amp;#x27;s a small thing, but details matter.&lt;/p&gt;&lt;h2 id=&quot;motion-sensor-request-clarification&quot;&gt;Motion Sensor request clarification&lt;/h2&gt;&lt;p&gt;We got a bunch of different questions about why some sites, like fedex.com, ask for &amp;quot;sensor&amp;quot; access in Polypane but not in Chrome. That&amp;#x27;s because Chrome allows the use of motion sensors and accelerometers by default. This has caused various scripts, like those by Akamai, to use it as a fingerprinting vector.&lt;/p&gt;&lt;p&gt;In Polypane, where you work to improve your own sites, we felt it more important to be explicit about these requests so don&amp;#x27;t allow them by default and you have to explicitly allow it for each origin.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-8-1/motionsensor.png&quot; class=&quot;imgshadow&quot; alt=&quot;A permission popup in Polypane explaining the sensors permission request.&quot;/&gt;&lt;p&gt;We&amp;#x27;ve updated the message to explain what &amp;quot;sensors&amp;quot; means, and also that Chrome allows these by default. You can permanently allow any permission request to silently allow it during subsequent sessions.&lt;/p&gt;&lt;h2 id=&quot;consoleimage-support&quot;&gt;Console.image support&lt;/h2&gt;&lt;p&gt;The Polypane console now supports &lt;code class=&quot;language-text&quot;&gt;console.image&lt;/code&gt;. This isn&amp;#x27;t an official browser feature, but rather a clever hack to show images in browser consoles using a JS library, so it&amp;#x27;s a little bit of a &amp;quot;fun&amp;quot; function.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-8-1/consoleimage2.png&quot; class=&quot;imgshadow&quot; alt=&quot;An image shown in the Polypane console.&quot;/&gt;&lt;p&gt;&lt;em&gt;&lt;code class=&quot;language-text&quot;&gt;console.image&lt;/code&gt; by &lt;a href=&quot;https://defaced.dev/tools/consoleimg/&quot;&gt;@defaced&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;h2 id=&quot;noteworthy-fixes&quot;&gt;Noteworthy fixes&lt;/h2&gt;&lt;p&gt;The Fullscreen feature on Mac now works again, after we accidentally disabled it in 8.0. We also missed a change with regards to the drag API, causing HTML files that were dragged into Polypane not to load anymore. This is now reinstated. Drag an HTML file onto the workspace to open it in the current tab, or drag it onto the tab bar to open it in a new tab.&lt;/p&gt;&lt;p&gt;We also resolved a number of performance issues where specific sites didn&amp;#x27;t work well with the assumptions Polypane made about their structure. If you encounter a site that&amp;#x27;s much slower than other pages (such as this one) when opened in Polypane, please &lt;a href=&quot;/support/&quot;&gt;let us know&lt;/a&gt; so we can fix the issue and make Polypane better for everyone!&lt;/p&gt;&lt;h2 id=&quot;updated-chromium-new-experimental-api&quot;&gt;Updated Chromium, new experimental API&lt;/h2&gt;&lt;p&gt;Chromium has been updated to 98.0.4758.102 and the &lt;strong&gt;custom highlights API&lt;/strong&gt; is now available in Polypane. Head over to our docs on &lt;a href=&quot;/docs/experimental-chromium-features/&quot;&gt;Experimental Chromium Features&lt;/a&gt; for a full overview of the available APIs. If you&amp;#x27;d like to see one activated, &lt;a href=&quot;/support/&quot;&gt;Let us know&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;get-polypane-81&quot;&gt;Get Polypane 8.1&lt;/h2&gt;&lt;p&gt;Polypane is available for Windows, Mac (universal dmg for Intel and M1) and Linux (.deb or AppImage) in both 64 bit and ARM versions.&lt;/p&gt;&lt;p&gt;Polypane automatically updates on Mac, Windows and on Linux when using the AppImage. Otherwise, go to
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; to download the latest version!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Try it for free&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;h3 id=&quot;deprecation-notice&quot;&gt;Deprecation notice&lt;/h3&gt;&lt;p&gt;In Polypane 7 we deprecated legacy mode. This feature is on track to be removed in Polypane 9.&lt;/p&gt;&lt;h2 id=&quot;polypane-810-changelog&quot;&gt;Polypane 8.1.0 Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;New Features&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Disable JS debug tool&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Dimmed screen debug tool&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Elements panel tree view is now resizable&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Workspace now has visible &amp;quot;add pane&amp;quot; button&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Support for console.image&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Support for custom highlight api&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Shortcut displayed on Mac now use icons&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Shortcut are shown as more readable badges&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Debug Tool reload and clear buttons are now switched to common action needs less mouse movement&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta Panel: Updated Google SERP Preview&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta Panel: Slack preview now shows correct file size&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta Panel: Sites with broken metadata no longer slow down Polypane&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta Panel: Facebook preview empty state is now more accurate&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline: External links now have icons&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline: Show hidden elements and hidden text more consistently&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline: Links show title attribute and give warning when it duplicates the content (Thanks Jules!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline: Image path resolving is now faster&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Polypane Peek tooltip now shows &lt;code class=&quot;language-text&quot;&gt;href&lt;/code&gt; for links and &lt;code class=&quot;language-text&quot;&gt;action&lt;/code&gt; for forms.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Resize cursors are now consistent across the app&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements Panel design updates&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Motion sensor request now shows additional explanation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Update Chromium&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; update accessibility ruleset&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; updated google fonts&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Fullscreen shortcut on Mac works again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Performance issue with Japanese Noto font (Thanks Hiro!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Dragging HTML files into Polypane works again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Hide warning for missing H1 when &amp;quot;show issues&amp;quot; is off&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Color gamut button alignment&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Web Vitals FCP score now taken into account for global score&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; issue where color contrast debug tool did not detect large text correctly&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Meta Panel: Issue with Slack, Twitter and Facebook previews missing image for some sites (Thanks Roel!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements Panel: issue with animation names that contain dashes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Resizing panes with left sidebar open led to incorrect width&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Broken images in Meta panel led to load loops&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Panel resizer sometimes overlapped menus&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Incorrect font used for code styles&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[How we made the State of CSS more responsive and accessible]]></title><description><![CDATA[Each year,  the state of CSS  takes a global survey of the CSS landscape. Its results are highly regarded and influence browsers, toolmakers…]]></description><link>https://polypane.app/blog/how-we-made-the-state-of-css-more-responsive-and-accessible/</link><guid isPermaLink="false">https://polypane.app/blog/how-we-made-the-state-of-css-more-responsive-and-accessible/</guid><pubDate>Wed, 16 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Each year, &lt;a href=&quot;https://2021.stateofcss.com&quot;&gt;the state of CSS&lt;/a&gt; takes a global survey of the CSS landscape. Its results are highly regarded and influence browsers, toolmakers and web developers around the world. So I (Kilian) was super honored when I was asked to help out with making the survey results more responsive and accessible. I also ended up writing this years &lt;a href=&quot;https://2021.stateofcss.com/en-US/conclusion&quot;&gt;conclusion&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;To be clear: the survey results website was already well coded. The site was built in a responsive way and had accessibility testing done but there was still opportunity to optimize many parts of the survey.&lt;/p&gt;&lt;p&gt;I started out doing a &lt;a href=&quot;/blog/checking-webpage-quality-in-5-minutes-with-polypane/&quot;&gt;quick 5 minute scan&lt;/a&gt; to see the issues that came up. While I focused primarily on things that could be improved on smaller screen sizes, but Polypane also found accessibility-related improvements that could be made. I noted down a variety of issues, from truncated text to missing landmark elements and from spacing issues to color contrast issues.&lt;/p&gt;&lt;p&gt;Here&amp;#x27;s a roundup of the things I found, and how I fixed them.&lt;/p&gt;&lt;h3 id=&quot;forwardprevious-buttons-had-text-overflow-issues&quot;&gt;Forward/previous buttons had text-overflow issues&lt;/h3&gt;&lt;p&gt;At the bottom of each page were navigational buttons that let users go to the previous and next pages. On mobile the contents of these buttons were truncated, so part of the text was no longer readable.&lt;/p&gt;&lt;img src=&quot;/blogs/stateofcss/buttons-old.png&quot; class=&quot;imgshadow&quot; alt=&quot;&quot;/&gt;&lt;p&gt;This happened because on mobile a grid layout was used with each button taking up &lt;code class=&quot;language-text&quot;&gt;1fr&lt;/code&gt;. Because the grid dictated the available space, the text inside the buttons was truncated.&lt;/p&gt;&lt;p&gt;By changing the container from a grid layout to a flex layout which allowed wrapping (with &lt;code class=&quot;language-text&quot;&gt;flex-wrap: wrap&lt;/code&gt;), the buttons would align vertically on mobile layouts making them wide enough for text not to get truncated. With the flex layout, I could also make sure the buttons grew to full width on mobile, but keep their intrinsic width at desktop sizes.&lt;/p&gt;&lt;img src=&quot;/blogs/stateofcss/buttons-new.png&quot; class=&quot;imgshadow&quot; alt=&quot;&quot;/&gt;&lt;h3 id=&quot;giving-charts-more-space&quot;&gt;Giving charts more space&lt;/h3&gt;&lt;p&gt;The charts are the main show of the State of CSS results so I wanted to make sure they had as much space as possible, while also making the most of the available space. At the start, a chart always has a right-aligned set of icons called the &amp;quot;side area&amp;quot;. The header too could have a set of tabs that&amp;#x27;d be right-aligned next to the header, making the charts feel cramped on smaller mobile phones:&lt;/p&gt;&lt;img src=&quot;/blogs/stateofcss/chart-old.png&quot; class=&quot;imgshadow&quot; alt=&quot;&quot;/&gt;&lt;p&gt;To clear the space for both on mobile, I made two changes:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The tabs in the header would be shown below it, giving the header the full width of the screen.&lt;/li&gt;&lt;li&gt;The side area would be shown above the chart, giving more horizontal space to the chart.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This gave both the charts and header some well-needed horizontal space:&lt;/p&gt;&lt;img src=&quot;/blogs/stateofcss/chart-new.png&quot; class=&quot;imgshadow&quot; alt=&quot;&quot;/&gt;&lt;p&gt;The main and side areas were split using a CSS grid with named areas, but for mobile I switched this out for a columnar flex layout. This made it easier to position the buttons with a few lines of CSS. I could&amp;#x27;ve also still used a CSS grid with updated named areas, but it would&amp;#x27;ve required more CSS to specify.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;While the side area in the new location looked fine on Polypane, due to the CSS property &lt;code class=&quot;language-text&quot;&gt;appearance: button&lt;/code&gt; on each button in the side area, Mobile Safari rendered extra padding around each of the buttons. This was not visible in the old layout, and not visible in Polypane either.&lt;/p&gt;&lt;br/&gt;I&amp;#x27;m mentioning this explicitly: while using Polypane means you no longer have to test &lt;i&gt;all&lt;/i&gt; the layouts on &lt;i&gt;all&lt;/i&gt; the browsers, each rendering engine is different and you should still test each one for issues.&lt;/blockquote&gt;&lt;h4 id=&quot;updating-each-chart&quot;&gt;Updating each chart&lt;/h4&gt;&lt;p&gt;After maximizing the space available to each chart, I set out to make sure each chart made the most of the available space. The charting library used by the State of CSS is called &lt;a href=&quot;https://nivo.rocks/&quot;&gt;Nivo&lt;/a&gt; and it&amp;#x27;s really good. Each chart type comes in two variants: a fixed width size and a responsive size that adapts to the available space.&lt;/p&gt;&lt;p&gt;For the mobile layouts, it doesn&amp;#x27;t always make sense to show the responsive chart variants: some charts simply have more data than would fit the available screen space. In those cases, charts were given an explicit scroll area. Several charts already used this, so I went over each chart to determine how best to make use of the available space:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Make it scrollable or keep it fitted to the available space&lt;/li&gt;&lt;li&gt;Minimize spacing around parts of the charts to make the most of the space.&lt;/li&gt;&lt;li&gt;Minimizing space around the charts, so visitors had to scroll less.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This is most noticeable in the ranking chart. Initially this always took up the same amount of space between each column. By updating the available space for charts, Nivo automatically minimized the space between columns while the desktop size made use of the space, allowing visitors to follow the changing in rankings easier.&lt;/p&gt;&lt;img src=&quot;/blogs/stateofcss/ranking.png&quot; class=&quot;imgshadow&quot; alt=&quot;&quot;/&gt;&lt;p&gt;Some other changes to the charts I made were:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Cutting the amount of spacing below each chart in half on mobile.&lt;/li&gt;&lt;li&gt;Making charts scroll horizontally when the screen width was too narrow.&lt;/li&gt;&lt;li&gt;Prevent tooltips from being clipped by charts on mobile.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;document-structure&quot;&gt;Document structure&lt;/h3&gt;&lt;p&gt;Polypane&amp;#x27;s &lt;a href=&quot;/docs/outline-panel/&quot;&gt;outline panel&lt;/a&gt; gives you an overview of headings, landmarks, links and images in one go, helping you spot errors and areas of improvement. By browsing the pages with the panel open I quickly found some improvements:&lt;/p&gt;&lt;h4 id=&quot;add-landmarks&quot;&gt;Add landmarks&lt;/h4&gt;&lt;p&gt;Landmarks are elements like &lt;code class=&quot;language-text&quot;&gt;header&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;nav&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;footer&lt;/code&gt; that tell people using assistive technologies what part of the page they&amp;#x27;re currently at. Not all pages need them, but most do. Because of this, Polypane doesn&amp;#x27;t show an error when they&amp;#x27;re missing, but it will show warnings.&lt;/p&gt;&lt;div style=&quot;display:flex;gap:1rem;width:100%&quot;&gt;&lt;div style=&quot;flex:1 1 50%&quot;&gt;&lt;strong&gt;Missing Header and Footer&lt;/strong&gt;&lt;img style=&quot;width:100%&quot; src=&quot;/blogs/stateofcss/outline-old.png&quot; class=&quot;imgshadow&quot; alt=&quot;&quot;/&gt;&lt;/div&gt;&lt;div style=&quot;flex:1 1 50%&quot;&gt;&lt;strong&gt;Header and Footer semantics added&lt;/strong&gt;&lt;img style=&quot;width:100%&quot; src=&quot;/blogs/stateofcss/outline-new.png&quot; class=&quot;imgshadow&quot; alt=&quot;&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;For the State of CSS website, there were definitely areas of the site that acted as a header and footer, so I updated those areas to use the right semantics.&lt;/p&gt;&lt;h4 id=&quot;duplicate-titles&quot;&gt;Duplicate titles&lt;/h4&gt;&lt;p&gt;Polypane also found some instances of duplicate titles. These can be hard to spot, since the duplication usually happens at different parts of the page and you don&amp;#x27;t see them side-by-side. While a sighted user can usually distinguish between these as they probably look different and they&amp;#x27;re on different parts of the page, someone using assistive technologies might have a harder time determining from the title which part of the page they&amp;#x27;re on. When you can, you want to avoid duplicate titles.&lt;/p&gt;&lt;p&gt;It turns out the recommended resources block duplicated the header above and below a separator. This is most likely a copy-paste bug, but Polypane quickly flagged this as an issue and I could delete one of the headings:&lt;/p&gt;&lt;img src=&quot;/blogs/stateofcss/duplicate1-old.png&quot; class=&quot;imgshadow&quot; alt=&quot;&quot;/&gt;&lt;img src=&quot;/blogs/stateofcss/duplicate1-new.png&quot; class=&quot;imgshadow&quot; alt=&quot;&quot;/&gt;&lt;h4 id=&quot;more-duplicate-titles&quot;&gt;More duplicate titles&lt;/h4&gt;&lt;p&gt;But I also noticed a lot of repeated headings on the &lt;a href=&quot;https://2021.stateofcss.com/en-US/features/layout&quot;&gt;features&lt;/a&gt; pages. All the labels for the stacked horizontal barcharts were marked up as &lt;code class=&quot;language-text&quot;&gt;h4&lt;/code&gt; elements.&lt;/p&gt;&lt;img src=&quot;/blogs/stateofcss/duplicate2-visual.png&quot; class=&quot;imgshadow&quot; alt=&quot;&quot;/&gt;&lt;img src=&quot;/blogs/stateofcss/duplicate2-error.png&quot; class=&quot;imgshadow&quot; alt=&quot;&quot; style=&quot;float:right;margin-left:2rem;width:25%;min-width:250px&quot;/&gt;&lt;p&gt;While I felt that an &lt;code class=&quot;language-text&quot;&gt;h4&lt;/code&gt; was the wrong element, I didn&amp;#x27;t immediately know what the right element would be. So I asked the help of fellow front-enders in the HTML channel in the &lt;a href=&quot;https://fronteers.nl/about&quot;&gt;Fronteers&lt;/a&gt; Slack group.&lt;/p&gt;&lt;p&gt;After a short discussion most people thought a &lt;code class=&quot;language-text&quot;&gt;&amp;lt;dl&amp;gt;&lt;/code&gt; element was most appropriate, though &lt;code class=&quot;language-text&quot;&gt;&amp;lt;table&amp;gt;&lt;/code&gt; semantics were also suggested. Between those I opted for &lt;code class=&quot;language-text&quot;&gt;&amp;lt;dl&amp;gt;&lt;/code&gt;, since it covered the right semantics and was easier to implement.&lt;/p&gt;&lt;p&gt;This cleaned up the outline a lot, making it easier to navigate from chart to chart using assistive technologies while still using the right semantics to make sure that each bar chart had a proper label attached to it.&lt;/p&gt;&lt;h3 id=&quot;color-contrast-changes&quot;&gt;Color contrast changes&lt;/h3&gt;&lt;img src=&quot;/blogs/stateofcss/cover.svg&quot; alt=&quot;&quot; style=&quot;max-width:150px;margin:1rem 1rem 1rem 0;display:block;css-float:left&quot;/&gt;&lt;p&gt;The State of CSS has a dark mode style, fitting the developer-focused nature of the website. Unfortunately the existing link colors ( &lt;span class=&quot;InlineColor-styles-module--wrap--33UfV&quot;&gt;&lt;span class=&quot;InlineColor-styles-module--swatch--1ktiS&quot; style=&quot;background-color:#ED2E84&quot;&gt;&lt;/span&gt;#ed2e84&lt;/span&gt; and &lt;span class=&quot;InlineColor-styles-module--wrap--33UfV&quot;&gt;&lt;span class=&quot;InlineColor-styles-module--swatch--1ktiS&quot; style=&quot;background-color:#1734BF&quot;&gt;&lt;/span&gt;#1734bf&lt;/span&gt;), while bright and punchy, did not have enough contrast with the background.&lt;/p&gt;&lt;p&gt;While Polypane automatically suggested colors ( &lt;span class=&quot;InlineColor-styles-module--wrap--33UfV&quot;&gt;&lt;span class=&quot;InlineColor-styles-module--swatch--1ktiS&quot; style=&quot;background-color:#f2498e&quot;&gt;&lt;/span&gt;#f2498e&lt;/span&gt; and &lt;span class=&quot;InlineColor-styles-module--wrap--33UfV&quot;&gt;&lt;span class=&quot;InlineColor-styles-module--swatch--1ktiS&quot; style=&quot;background-color:#7c83dc&quot;&gt;&lt;/span&gt;#7c83dc&lt;/span&gt; ) that would&amp;#x27;ve worked well, we ended up referencing the new logo for this year (designed by &lt;a href=&quot;https://twitter.com/ckirknielsen&quot;&gt;Christopher Kirk-Nielsen&lt;/a&gt;) and using a pink from it: &lt;span class=&quot;InlineColor-styles-module--wrap--33UfV&quot;&gt;&lt;span class=&quot;InlineColor-styles-module--swatch--1ktiS&quot; style=&quot;background-color:#ef4e88&quot;&gt;&lt;/span&gt;#ef4e88&lt;/span&gt;.&lt;/p&gt;&lt;h3 id=&quot;in-closing&quot;&gt;In Closing&lt;/h3&gt;&lt;p&gt;I made more changes, like set the minimum font size to 12px, added a theme color (the &lt;a href=&quot;/docs/meta-information/&quot;&gt;Meta panel&lt;/a&gt; helpfully pointed this out) and updated spacing in many different places to make the mobile display more cohesive (like on the awards page). If you want to go through the changes I made, have a look at the &lt;a href=&quot;https://github.com/StateOfJS/Monorepo/pulls?q=is%3Apr+author%3AKilian&quot;&gt;List of PRs I opened&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;It&amp;#x27;s always exciting to work in a new (for you) codebase, and I definitely needed time to get my bearings. &lt;a href=&quot;https://sachagreif.com/&quot;&gt;Sacha&lt;/a&gt; was very patient with me and helped me find my way around the codebase. Even though our workdays could not have been further apart, me living in The Netherlands and Sacha in Japan, we managed a good cadence and could sync up before my workday started and after his workday properly ended.&lt;/p&gt;&lt;p&gt;The State of CSS (and State of JS) surveys are some of the largest surveys of developers out there, and their results really have a material impact on browsers, tool developers and the wider industry. If you&amp;#x27;re not participating in them yet, keep an eye out for them and be sure to have your voice heard.&lt;/p&gt;&lt;p&gt;To stay up to date with them, you can sign up to be reminded for the next edition below &lt;a href=&quot;https://2021.stateofcss.com/en-US/conclusion/&quot;&gt;the conclusion&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane is now part of the GitHub Education Intro to Web Dev pack]]></title><description><![CDATA[We are proud to announce that Polypane is now part of  GitHub Education Intro to Web Dev . The response to Polypane being part of the Github…]]></description><link>https://polypane.app/blog/polypane-is-now-part-of-the-git-hub-education-intro-to-web-dev-pack/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-is-now-part-of-the-git-hub-education-intro-to-web-dev-pack/</guid><pubDate>Mon, 07 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We are proud to announce that Polypane is now part of &lt;a href=&quot;https://education.github.com/experiences/intro-to-web-dev?utm_source=github-kit-x-introtowebdev-polypane&quot;&gt;GitHub Education Intro to Web Dev&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The response to Polypane being part of the Github Student Developer Pack has been phenomenal. Seeing Polypane be used across the world by students to develop their project is nothing short of amazing.&lt;/p&gt;&lt;p&gt;We are really thrilled to team up with GitHub to make Polypane accessible to even more students just starting out on their journey to become web developers and designers and we think Polypane will be a great help as they learn to make websites and web applications that work everywhere and for everyone.&lt;/p&gt;&lt;h3 id=&quot;the-intro-to-web-dev&quot;&gt;The Intro To Web Dev&lt;/h3&gt;&lt;p&gt;Everything you need to build your next website. Learn how to design and build your own website as you learn the basics of web development. The Intro to Web Dev Experience gives students the tools to start you on a path, no matter how much experience or technical knowledge you currently have.&lt;/p&gt;&lt;h3 id=&quot;polypane&quot;&gt;Polypane&lt;/h3&gt;&lt;p&gt;Our mission at Polypane is to improve the workflow of designers and developers. We do that by offering a world-class development browser that includes the tools you need to develop, debug and test websites and web apps. Polypane nudges you in the right direction and makes things that are difficult to find out normally easily discoverable with a single click. Questions like &amp;#x27;does my site work on all mobile devices?&amp;#x27; &amp;#x27;Are all my meta tags correct?&amp;#x27; &amp;#x27;Is my design actually accessible?&amp;#x27; are easily answered with Polypane.&lt;/p&gt;&lt;p&gt;More information about the GitHub Education Intro To Web Dev Experience: &lt;a href=&quot;https://education.github.com/experiences/intro-to-web-dev?utm_source=github-kit-x-introtowebdev-polypane&quot;&gt;GitHub Education Intro to Web Dev&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 8: better Elements Inspector, new syncing features, Chromium 98 and more]]></title><description><![CDATA[Polypane 8 comes with a better Elements inspector, big performance improvements, Chromium 98 and many other new and improved features, like…]]></description><link>https://polypane.app/blog/polypane-8-better-elements-inspector-new-syncing-features-chromium-98-and-more/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-8-better-elements-inspector-new-syncing-features-chromium-98-and-more/</guid><pubDate>Tue, 01 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 8 comes with a better Elements inspector, big performance improvements, Chromium 98 and many other new and improved features, like forced colors emulation, focus state sync, ARM support, UI improvement, a new debug tool and all-in-all netting a changelog of over 100 items. Lets get into it.&lt;/p&gt;&lt;h2 id=&quot;better-element-inspector&quot;&gt;Better Element inspector&lt;/h2&gt;&lt;p&gt;The Polypane element inspector inspects elements across panes and lets you edit the same element in all panes at the same time, a unique and powerful feature built from scratch for Polypane.&lt;/p&gt;&lt;p&gt;This round, we focused on some of the most requested features, making the design easier to understand for people coming from other browsers and greatly improved the performance of the inspector as well.&lt;/p&gt;&lt;h3 id=&quot;60-faster-element-inspection&quot;&gt;60% faster element inspection&lt;/h3&gt;&lt;p&gt;We rewrote core parts of our element inspection logic, making selecting elements and changing styles over 60% faster compared to Polypane 7. This is a pretty major difference and &lt;strong&gt;it feels great&lt;/strong&gt;. Especially considering we now surface more information than we ever did, more on that below.&lt;/p&gt;&lt;h3 id=&quot;updated-design&quot;&gt;Updated design&lt;/h3&gt;&lt;p&gt;To accommodate the new features and address some the issues people had with our Elements Panel we tweaked and improved the design. There are no major changes, but a lot of little tweaks to make it feel more familiar while also making room for new features. Have a look at the old and new design side by side:&lt;/p&gt;&lt;div style=&quot;display:flex;gap:1rem;width:100%&quot;&gt;&lt;div style=&quot;flex:1 1 50%&quot;&gt;&lt;strong&gt;Element inspector in Polypane 7&lt;/strong&gt;&lt;img style=&quot;width:100%&quot; src=&quot;/blogs/polypane-8/old.png&quot; class=&quot;imgshadow&quot; alt=&quot;The old elements inspector.&quot;/&gt;&lt;/div&gt;&lt;div style=&quot;flex:1 1 50%&quot;&gt;&lt;strong&gt;Element inspector in Polypane 8&lt;/strong&gt;&lt;img style=&quot;width:100%&quot; src=&quot;/blogs/polypane-8/new.png&quot; class=&quot;imgshadow&quot; alt=&quot;The new elements inspector.&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;The Tree view is now styled similarly to the Chromium elements panel: collapsed elements are shown with &lt;code class=&quot;language-text&quot;&gt;...&lt;/code&gt; instead of as opening tags and short content is shown inside the element. We hope this makes it easier for people to switch to the Polypane Element inspector.&lt;/p&gt;&lt;p&gt;For the navigator area, we tightened up the alignment and placement of icons, ids and classes, and we now collapse the box model by default so more space is visible for the Style tab. The button to toggle the box model now has text to make that clearer.&lt;/p&gt;&lt;p&gt;The biggest changes happened in the Style tab. We switched to a monospace font which allows us to show more code in the same area while bumping up the contrast of different components without making it feel too busy. A sharp eye will notice some new checkboxes as well…&lt;/p&gt;&lt;h3 id=&quot;toggling-individual-styles-on-and-off&quot;&gt;Toggling individual styles on and off&lt;/h3&gt;&lt;p&gt;Those checkboxes are for the most requested feature for the Elements inspector: the ability to toggle individual styles on and off. It was a huge undertaking, but it&amp;#x27;s here!&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-8/disabledrules.png&quot; class=&quot;imgshadow&quot; alt=&quot;List of CSS Styles with some of them having a line through them, indicating they&amp;#x27;re disabled.&quot;/&gt;&lt;p&gt;Toggling a style is quick and gives you feedback across all your panes. Styles that are toggled off are shown with a line-through so you can at a glance see which styles are enabled and disabled.&lt;/p&gt;&lt;h3 id=&quot;cascade-layer-support&quot;&gt;Cascade layer support&lt;/h3&gt;&lt;p&gt;The Element inspector now has full support for displaying Cascade layers. They are set to ship as stable in the next release of Chromium while in Polypane you can use them already.&lt;/p&gt;&lt;p&gt;Instead of having just one way to overwrite the specificity, with &lt;code class=&quot;language-text&quot;&gt;!important&lt;/code&gt;, cascade layers lets you define separate layers for different parts of your CSS.&lt;/p&gt;&lt;p&gt;Each new layer overwrites the old one, making it easy to work with third party CSS and saving you from having to add more complex selectors just to be more specific. For an introduction to Cascade Layers, read the &lt;a href=&quot;https://www.smashingmagazine.com/2022/01/introduction-css-cascade-layers/&quot;&gt;Cascade Layers article by Stephanie Eckles&lt;/a&gt;.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-8/cascade.png&quot; class=&quot;imgshadow&quot; alt=&quot;Nested cascade layers in the Polypane Element inspector&quot;/&gt;&lt;p&gt;Work to support cascade layers is underway in all major browsers but it hasn&amp;#x27;t shipped yet (except in Safari&amp;#x27;s technology preview), meaning that &lt;strong&gt;Polypane is the first Chromium-based browser with devtools support for Cascade layers&lt;/strong&gt;, and the second browser to ship it. How cool is that?&lt;/p&gt;&lt;h3 id=&quot;container-query-and-supports-query-support&quot;&gt;Container Query and Supports query support&lt;/h3&gt;&lt;p&gt;Like Cascade layers, container queries are an upcoming technology that Polypane has enabled. While the elements panel already showed &lt;code class=&quot;language-text&quot;&gt;@media&lt;/code&gt; queries, we updated our logic to show &lt;em&gt;all&lt;/em&gt; at-rules, adding &lt;code class=&quot;language-text&quot;&gt;@supports&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;@container&lt;/code&gt; to the list, as well as the &lt;code class=&quot;language-text&quot;&gt;@layer&lt;/code&gt; mentioned above.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-8/container.png&quot; class=&quot;imgshadow&quot; alt=&quot;Container queries in the Polypane Element inspector&quot;/&gt;&lt;p&gt;If there are nested at-rules the Elements inspector shows all of them so you can always see why something is applied.&lt;/p&gt;&lt;h3 id=&quot;shift-to-inspect-pointer-eventsnone&quot;&gt;Shift to inspect &lt;code class=&quot;language-text&quot;&gt;pointer-events:none&lt;/code&gt;&lt;/h3&gt;&lt;p&gt;A useful feature in Chromium devtools is you can press &lt;code class=&quot;language-text&quot;&gt;shift&lt;/code&gt; to inspect elements that have &lt;code class=&quot;language-text&quot;&gt;pointer-events:none&lt;/code&gt; applied to them. Now that feature is also available for the Polypane inspection tools, either from the inspect button or after pressing &lt;code class=&quot;language-text&quot;&gt;alt&lt;/code&gt;/&lt;code class=&quot;language-text&quot;&gt;option&lt;/code&gt; to use Polypane Peek.&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-8/pointerevents.m4v&quot; loop=&quot;&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;h3 id=&quot;other-element-inspector-improvements&quot;&gt;Other Element Inspector improvements&lt;/h3&gt;&lt;p&gt;We made more changes to the Element Inspector:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Double click any attribute in the tree view to copy its value.&lt;/li&gt;&lt;li&gt;Click any id or class in the Navigator to copy its value, formatted for CSS.&lt;/li&gt;&lt;li&gt;The color picker of a CSS value with a custom property now updates the custom property instead of the CSS value.&lt;/li&gt;&lt;li&gt;We rewrote the autosuggest UI for CSS and HTML properties so you can find matches faster.&lt;/li&gt;&lt;li&gt;Polypane Peek can now also be used with the Chromium devtools by selecting those in the address bar.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There&amp;#x27;s also a few bug fixes, you can find those in the &lt;a href=&quot;#polypane-800-changelog&quot;&gt;full changelog&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/docs/elements-panel/&quot;&gt;Elements Inspector documentation&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;performance-improvements&quot;&gt;Performance improvements&lt;/h2&gt;&lt;p&gt;With this release we set out to improve performance across the application. We wrote about the 60% performance improvement in the elements panel above, but we also made improvements to other parts of the app.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;50% reduction in load time&lt;/strong&gt;&lt;br/&gt;
By improving the order of things we do during launch we managed to improve startup time by 50%, and completely did
away with the &amp;quot;loading Polypane&amp;quot; screen.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Faster refresh rate for scroll syncing&lt;/strong&gt;&lt;br/&gt;
The scroll sync logic has now been updated to no longer need CSS updates on scroll, making it much smoother.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Website bottlenecks guards&lt;/strong&gt;&lt;br/&gt;
While Polypane previously showed a warning for sites that had more than 10K CSS selectors, we now disable various features at 15K selectors. Polypane disables hover syncing, breakpoint detection and overflow detection to keep the rest of the UI performant. In future releases we might disable more features.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Preventing data-related performance issues&lt;/strong&gt;&lt;br/&gt;
We also fixed several bottlenecks in the Polypane UI and parsing logic: The address bar could get slow because your history
had too many matches, so we now limit the number of matches we show.&lt;/p&gt;&lt;p&gt;If a chat widget on a site changed the page title every second (purely hypothetical of course, you would never do that!) that would slow down Polypane a lot because we re-parsed the page whenever the page title changed for legacy reasons. Page title changes also reset any active page navigation. We now no longer use page title change as an indication for navigation or need to re-parse the page.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Faster Polypane Peek tooltip&lt;/strong&gt;&lt;br/&gt;
Our tooltip was already fast but when improving our style inspection we found a potential slowdown for the tooltip, so we added that in. Enjoy the 4ms speedup!&lt;/p&gt;&lt;h2 id=&quot;updated-sync-options&quot;&gt;Updated Sync options&lt;/h2&gt;&lt;p&gt;You can now turn off individual syncing options, we stopped syncing form submissions and we can also sync &lt;strong&gt;Focus events&lt;/strong&gt;.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-8/syncoptions.png&quot; class=&quot;imgshadow&quot; alt=&quot;Context menu of the sync options button showing which events are synced&quot;/&gt;&lt;p&gt;&lt;strong&gt;Individual sync options&lt;/strong&gt; &lt;br/&gt;
Right-click the sync button in the address bar to toggle individual syncing options. You can for example choose to sync hovering but not keypresses.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Focus sync&lt;/strong&gt; &lt;br/&gt;
Normally, focus is only ever in a single place across your entire operating system. With Focus sync, each pane can retain their own focus, synced between panes.&lt;/p&gt;&lt;p&gt;Doing keyboard testing and seeing how Focus moves across the page on multiple panes is an extremely useful for those of you doing accessibility testing.&lt;/p&gt;&lt;p&gt;Focus sync is off by default. Turn it on by right-clicking the sync button in the address bar.&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-8/focus-sync.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;&lt;strong&gt;Preventing multiple form submissions&lt;/strong&gt; &lt;br/&gt;
One thing that tripped people up is that forms would be submitted multiple times (once in every pane), which could trigger server issues. While not unsurprising (if you do the same action in multiple panes, you ...do the same action) it&amp;#x27;s most often not desirable.&lt;/p&gt;&lt;p&gt;Polypane 8 no longer syncs form submissions across panes. Note that you will need to use proper form semantics for Polypane to detect that a click or keypress triggers a submit action.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/docs/synced-interactions/&quot;&gt;Synced interactions documentation&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;forced-colors-emulation&quot;&gt;Forced colors emulation&lt;/h2&gt;&lt;p&gt;Polypane can now emulate forced colors:&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-8/forced-colors-emulation.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;This is &lt;em&gt;great&lt;/em&gt; because it means that to work on your Forced Colors design you:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;No longer need a windows device.&lt;/li&gt;&lt;li&gt;No longer need to switch your &lt;em&gt;entire device&lt;/em&gt; into forced colors mode.&lt;/li&gt;&lt;li&gt;You can quickly refer back to the regular design side-by-side for pointers.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;By switching the &lt;code class=&quot;language-text&quot;&gt;prefers-color-scheme&lt;/code&gt; from light to dark, the forced colors design will be updated as well.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/docs/emulation/&quot;&gt;Emulation documentation&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;console-updates&quot;&gt;Console updates&lt;/h2&gt;&lt;p&gt;Along with updating the Elements panel we also did another round of improvements for the Console: fixing various bugs, improving rendering performance and adding some new features&lt;/p&gt;&lt;p&gt;&lt;strong&gt;New console functions&lt;/strong&gt;&lt;br/&gt;
The Polypane console has added support the following console functions:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;assert&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;time&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;timeLog&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;timeEnd&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;count&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;countReset&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;It already supported &lt;code class=&quot;language-text&quot;&gt;log&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;warn&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;error&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;debug&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;info&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;dir&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;table&lt;/code&gt;. All console functions are now also available without typing &lt;code class=&quot;language-text&quot;&gt;console.&lt;/code&gt; in front of them.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Navigation events&lt;/strong&gt;&lt;br/&gt;
The console now shows navigation events like reloads and new pages so you know which console messages belong to which page.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;New JSON renderer&lt;/strong&gt;&lt;br/&gt;
We switched out our JSON/Object renderer for one that more closely resembles the JSON rendering of the Chromium devtools.&lt;/p&gt;&lt;div style=&quot;display:flex;gap:1rem;width:100%&quot;&gt;&lt;div style=&quot;flex:1 1 50%&quot;&gt;&lt;strong&gt;Logging in Polypane 7&lt;/strong&gt;&lt;img style=&quot;width:100%&quot; src=&quot;/blogs/polypane-8/console-old.png&quot; class=&quot;imgshadow&quot; alt=&quot;The new console rendering.&quot;/&gt;&lt;/div&gt;&lt;div style=&quot;flex:1 1 50%&quot;&gt;&lt;strong&gt;Logging in Polypane 8&lt;/strong&gt;&lt;img style=&quot;width:100%&quot; src=&quot;/blogs/polypane-8/console-new.png&quot; class=&quot;imgshadow&quot; alt=&quot;The new console rendering.&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;/docs/console/&quot;&gt;Console documentation&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;updated-rules-and-guides&quot;&gt;Updated Rules and Guides&lt;/h2&gt;&lt;p&gt;Our rulers and guides feature also got another round of improvements:&lt;/p&gt;&lt;h3 id=&quot;alignment-to-site&quot;&gt;Alignment to site&lt;/h3&gt;&lt;p&gt;Previously the ruler features were fixed to the viewport, so if you scrolled the page they would not scroll along. In
Polypane 8 they do, so the rulers, guides, rows and grid now scroll along with the page.&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-8/page-scrolling-rulers.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;h3 id=&quot;setting-a-custom-color&quot;&gt;Setting a custom color&lt;/h3&gt;&lt;p&gt;You can now change the color of the overlays to contrast with your site (or fit your mood):&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-8/ruler-colors.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;h3 id=&quot;dot-grid-option&quot;&gt;Dot grid option&lt;/h3&gt;&lt;p&gt;Instead of grid lines you can now also set the grid to be shown as dots:&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-8/dotgrid.png&quot; class=&quot;imgshadow&quot; alt=&quot;This page overlaid with a 20px dot grid.&quot;/&gt;&lt;h3 id=&quot;right-aligned-guides&quot;&gt;Right-aligned guides&lt;/h3&gt;&lt;p&gt;You can now add guides that are right-aligned by specifying them with a negative value. They will stay attached to the right side even when you resize the page.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/docs/rulers-grids-and-guides/&quot;&gt;Rulers, Grid and Guides documentation&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;panel-can-now-be-left-aligned&quot;&gt;Panel can now be left aligned&lt;/h2&gt;&lt;p&gt;Speaking of alignment, you can now left-align the panel. Right-click the alignment button in the panel to set it to either right, bottom or left alignment:&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-8/panel-left.png&quot; class=&quot;imgshadow&quot; alt=&quot;The meta panel open on the left side of the UI&quot;/&gt;&lt;p&gt;&lt;a href=&quot;/docs/intro-to-panel/&quot;&gt;Panel documentation&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;new-color-contrast-debug-tool-logic&quot;&gt;New Color Contrast debug tool logic&lt;/h2&gt;&lt;p&gt;Measuring text contrast is complex and is influenced by a lot of different factors. Previously, we calculated the text and background colors of an element, taking opacity and all relevant parent background colors into account. This works well, but it&amp;#x27;s missing some factors.&lt;/p&gt;&lt;p&gt;In Polypane 8, we now improved the handling of &lt;code class=&quot;language-text&quot;&gt;opacity&lt;/code&gt; set on parent elements and added support for &lt;code class=&quot;language-text&quot;&gt;filter: opacity()&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;text-shadow&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;text-stroke&lt;/code&gt;, all of which combined provide a more realistic calculation of contrast.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/docs/debug-tools/#contrast-checker&quot;&gt;Color Contrast Checker documentation&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The contrast checker in Polypane uses the WCAG2 algorithm. If you&amp;#x27;ve heard about APCA recently as the new improved algorithm, it&amp;#x27;s important to keep in mind that, while very cool, it&amp;#x27;s not yet an official standard so can not be used to check compliance. Kilian wrote the article &lt;a href=&quot;https://kilianvalkhof.com/2021/accessibility/wcag-2-is-what-we-have/&quot;&gt;WCAG2 is what we have&lt;/a&gt; that explains why. In a future update of Polypane we will provide APCA and WCAG2 contrast logic side by side.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;meta-panel-updates&quot;&gt;Meta Panel updates&lt;/h2&gt;&lt;p&gt;The meta panel now highlights the parts of your title or description that run over the recommended length.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-8/meta.png&quot; class=&quot;imgshadow&quot; alt=&quot;The meta panel highlighting the overly long title of this page.&quot;/&gt;&lt;p&gt;In the past few months both Slack and Discord updated their rich previews (very subtly), so we&amp;#x27;ve updated our previews to match their new designs.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/docs/meta-information/&quot;&gt;Meta panel documentation&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;new-debug-tool-hide-cursor&quot;&gt;New Debug tool: Hide Cursor&lt;/h2&gt;&lt;p&gt;No image for this one, but it&amp;#x27;s handy nonetheless. The Hide Cursor debug tool hides your mouse cursor. This way you can do a keyboard test and not be tempted to cheat.&lt;/p&gt;&lt;h2 id=&quot;csp-header-warning&quot;&gt;CSP header warning&lt;/h2&gt;&lt;p&gt;When a site sets content-security-policy (CSP) headers it disables part of the functionality Polypane offers. While we had an option to disable CSP headers for a few versions now, Polypane now detects when CSP headers block functionality and shows a warning and option to turn them off.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-8/csp.png&quot; class=&quot;imgshadow&quot; alt=&quot;The CSP warning on news.ycombinator.com.&quot;/&gt;&lt;h2 id=&quot;chromium-98&quot;&gt;Chromium 98&lt;/h2&gt;&lt;p&gt;Polypane now runs on Chromium 98. We always try to keep up with the latest version of Chromium to make sure you get to use the latest rendering engine, the latest security improvements and the latest new features.&lt;/p&gt;&lt;p&gt;Notable new experimental features are the &lt;code class=&quot;language-text&quot;&gt;selectmenu&lt;/code&gt; element and the &lt;code class=&quot;language-text&quot;&gt;::spelling-error&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;::grammar-error&lt;/code&gt; pseudo classes.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/docs/experimental-chromium-features/&quot;&gt;Overview of experimental Chromium features&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;arm-support&quot;&gt;ARM support&lt;/h2&gt;&lt;p&gt;We&amp;#x27;ve had an M1 version for Mac for quite a long time and now we also have ARM versions for Windows and Linux. So if you run on those architectures you can now use a more performant version of Polypane.&lt;/p&gt;&lt;p&gt;Windows now has a universal installer just like Mac, and for Linux you need to choose the appropriate architecture (The download page will automatically detect this for you).&lt;/p&gt;&lt;p&gt;If you want to get the ARM version now make sure to download the new version from the site, as Polypane will update to the same architecture it installed with.&lt;/p&gt;&lt;h2 id=&quot;other-improvements-and-bugfixes&quot;&gt;Other improvements and bugfixes&lt;/h2&gt;&lt;p&gt;As usual this release got a little out of hand, here are some other notable improvements and bugfixes that dont deserve their own heading but are still noteworthy. You can find the entire list in the changelog.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;We aligned with Chrome on the behavior when double clicking the tab bar. Instead of opening a new tab, the app now (un)maximizes.&lt;/li&gt;&lt;li&gt;The scroll position in default mode is now preserved on reload again, so live reloading works much nicer. This worked in previous versions, but we broke it. It&amp;#x27;s fixed now!&lt;/li&gt;&lt;li&gt;All areas are now named sections so you can use assistive technologies to navigate across the app easier.&lt;/li&gt;&lt;li&gt;Live reload can now set a delay in decimal seconds. The newest generation of build tools is significantly faster, often only needing milliseconds to compile so waiting even a full second is way too long.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;get-polypane-8&quot;&gt;Get Polypane 8&lt;/h2&gt;&lt;p&gt;Polypane is available for Windows, Mac (universal dmg for Intel and M1) and Linux (.deb or AppImage) in both 64 bit and ARM versions.&lt;/p&gt;&lt;p&gt;Polypane automatically updates on Mac, Windows and on Linux when using the AppImage. Otherwise, go to
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; to download the latest version!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Try it for free&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;h3 id=&quot;deprecation-notice&quot;&gt;Deprecation notice&lt;/h3&gt;&lt;p&gt;In Polypane 7 we deprecated legacy mode. This feature is on track to be removed in Polypane 9.&lt;/p&gt;&lt;h2 id=&quot;polypane-800-changelog&quot;&gt;Polypane 8.0.0 Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;New features&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Element inspector: Toggle individual styles off and on&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Element inspector: Cascade layer support in Element Inspector&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Element inspector: Container Query and Supports query support&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Emulation: Added Forced Color emulation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Sync Options: Focus sync&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Sync options: Turn specific sync options on and off&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Chromium 98&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; ARM support for Windows and Linux&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Experimental features: selectmenu, spelling and grammar pseudos&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Detect and warn about CSP issues on a site&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Shift to inspect elements with pointer-events: none&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Debug tool added: Hide cursor&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Rulers and Guides updates&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Panel can now be left-aligned&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Performance: 50% improvement in app load time&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Performance: faster syncing of scroll position&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Performance: At 15K rules of CSS Polypane disables hover sync, breakpoint detection and overflow detection features&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Performance: Page title change no longer cause Panels to update&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Performance: Improve performance of suggestions in Address bar&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Page reloads preserve scroll position (Thanks many people!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; UI: Double-clicking tab bar now maximizes app instead of opening a new tab&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; UI: Address bar now works better when opening new tab&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; UI: New design for URL hover indicator&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; UI: Warning shown when first using tabs explaining how they work&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; UI: Panel border lights up to indicate it&amp;#x27;s draggable&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; UI: Focus border in Dark mode now less pronounced&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; UI: Esc in address bar now reverts URL&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; UI: All parts of the Polypane UI now are named sections for improved navigation with assistive technologies&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; UI: Reference image UI now visually consistent with other parts of UI&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Sync Scroll: Better handling of pages with smooth scrolling enabled (Thanks Stratos!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Sync: Form submissions are prevented from being synced across panes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Color contrast: now takes parent opacity and filter opacity into account&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Color contrast: now takes text shadows into account&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Color contrast: now takes text outlines into account&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Live Reload: You can now set the delay in decimal seconds&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Color chooser: Tints and shades now have consistent alpha value&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Color chooser: Click preview to copy color&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Color picker: Show icons for copy actions&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements Inspector: 60% performance improvement when selecting new element&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements Inspector: Update Style editing UI&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements Inspector: Improve performance of getting list of classes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements Inspector: Refreshes info on page reload&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements Inspector: Collapse box model by default, add text to toggle&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements Inspector: Active element in tree view now scrolls into view&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements Inspector: Click to copy Classes and ID in navigator (Thanks Roni!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements Inspector tree navigator is now styled like chromium&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements Inspector tree navigator double click attribute value to copy&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements Inspector now sorts CSS Rules by CSS4 compatible specificity calculation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements Inspector the color picker of a css value with a custom property now updates the custom property&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements Inspector: new autosuggest UI for css and HTML properties&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta Panel: Highlight part of title and page description that are too long&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta Panel: Update Slack preview to new design&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta Panel: Update Discord preview to new design&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta Panel: Detect more variations of charset declaration&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Share: QR code no longer moves Live CSS badge out of the way&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Devtools panel now includes a reload button&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Devtools: Add XState devtools&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Devtools: F12 now both opens and closes the devtools&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Debug tools: Small text tool no longer shows warning for elements with font-size of zero&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Rulers: now scroll along with website&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Rulers: Ability to set colors&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Rulers: Dot grid option&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Rulers: Allow guides to be set from the right&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: Displayed image src is limited to 5 lines of visible text&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: Warn for more nondescriptive text in link and image overviews&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: Prevent getting outline on each URL change&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Console: JSON display is now more aligned with Chromium devtools&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Console: Support the time, time, timeLog, timeEnd, count, countReset and assert console methods&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Console: show navigation events&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Console: console functions can now be used without &lt;code class=&quot;language-text&quot;&gt;console.&lt;/code&gt; in front of them&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Peek: faster rendering of inspection tooltip&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Peek: option to use chromium devtools instead&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Workspace pane: now shows icons for each default workspace&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; New &amp;quot;Reset app to defaults&amp;quot; option in main menu&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Shortcut panel on Mac now uses ⌘ and ⌥ icons&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Web Vitals popup now shows status icons in the overview&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Web Vitals popup now shows scoring for FCP&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated list of Google fonts&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent crash caused by parsing a non-plain text robots.txt (Thanks Roni!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Clicking relative links in outline panel now loads correct URL&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; issue with Polypane Peek not being available on load&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Alignment in Attribute and Data labels in elements panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent style editing sometimes changing wrong CSS rule&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Text overflow in Web Vitals tooltip with zoomed text&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Bug where Color chooser would be positioned incorrectly&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Syncing of &lt;code class=&quot;language-text&quot;&gt;-webkit&lt;/code&gt; hover styles&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Title change no longer blocks page navigation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Incorrect permission message for geolocation (Thanks Zjelko!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Console: Prevent issue where messages added in rapid succession weren&amp;#x27;t all being added&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Peek: issue when inspect tooltip would not be shown&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Live CSS: No longer indents randomly&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Meta panel: No longer use &amp;quot;favicon missing&amp;quot; as alt for favicons&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Reference image being out of sync with website&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Consistent capitalization of menu shortcuts on Windows&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Overview screenshot sometimes having stale data&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Element Inspector: Support editing and adding Keyframe styling&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Element Inspector: consistent specificity display&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Element Inspector: Arrow keys changed em to rem&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Element Inspector: Formatting of Copied Keyframe CSS rules&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Element Inspector: Pseudoclass styling being set incorrectly&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Element Inspector: font-face editing in Legacy mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Adjusted text size did not apply on launch&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Configurators and info panels overlapped address bar suggestions&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Error message when syncing events on deleted elements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Error message when getting hover status&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Live Reload: injection in legacy mode causing reloads&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Browse panel didn&amp;#x27;t open URL on app launch with tool selected (Thanks Michael!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Live Reload: Better support for strings in the ignorepatterns.txt file (Thanks Nick!)&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[The breakpoints we tested in 2021 & 2022, and the ones to test in 2023]]></title><description><![CDATA[Which screen sizes to design, build and test on is a perennial topic in web development. While well-built responsive
websites will work at…]]></description><link>https://polypane.app/blog/the-breakpoints-we-tested-in-2021-and-the-ones-to-test-in-2022/</link><guid isPermaLink="false">https://polypane.app/blog/the-breakpoints-we-tested-in-2021-and-the-ones-to-test-in-2022/</guid><pubDate>Wed, 19 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Which screen sizes to design, build and test on is a perennial topic in web development. While well-built responsive
websites will work at any size, during development it&amp;#x27;s easier to use a small number of sizes to check with (even in Polypane!)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;But what sizes to use?&lt;/strong&gt; There&amp;#x27;s a number of different approaches we&amp;#x27;ll go over in this article, all updated to be relevant in 2022 and 2023.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Base it off device groups: mobile, tablet, laptop and desktop.&lt;/li&gt;&lt;li&gt;Use the breakpoints from &lt;a href=&quot;/blog/css-breakpoints-used-by-popular-css-frameworks/&quot;&gt;popular CSS frameworks&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Using &lt;a href=&quot;/create-workspace/&quot;&gt;the dimensions your visitors use&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Using the most used breakpoints of 2021 and 2022.&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;based-on-device-sizes&quot;&gt;Based on device sizes&lt;/h3&gt;&lt;p&gt;There&amp;#x27;s mobile phones, tablets, laptops and desktops, so if you use size for each of that category, you cover them:&lt;/p&gt;&lt;div class=&quot;WorkspacePreviewBreakpoints-styles-module--workspaceWrapper--Ji7Yl&quot;&gt;&lt;div class=&quot;WorkspacePreviewBreakpoints-styles-module--buttonContainer--1UPyH&quot;&gt;Device sizes &lt;a class=&quot;WorkspacePreviewBreakpoints-styles-module--open--Tem3A&quot; href=&quot;https://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A375%2C%22title%22%3A%22Mobile%22%7D%2C%7B%22width%22%3A768%2C%22title%22%3A%22Tablet%22%7D%2C%7B%22width%22%3A1280%2C%22title%22%3A%22Laptop%22%7D%2C%7B%22width%22%3A1920%2C%22title%22%3A%22Desktop%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreviewBreakpoints-styles-module--panelist--3CMcb panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:53.57142857142857px;height:100%&quot;&gt;Mobile&lt;i&gt;375px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:109.71428571428571px;height:100%&quot;&gt;Tablet&lt;i&gt;768px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:182.85714285714286px;height:100%&quot;&gt;Laptop&lt;i&gt;1280px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:274.2857142857143px;height:100%&quot;&gt;Desktop&lt;i&gt;1920px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;This gives a good overview, but you run the risk of &lt;a href=&quot;/blog/overlooked-breakpoints-in-responsive-design/&quot;&gt;missing the in-between sizes&lt;/a&gt;, smaller than 375px and between 900 and 1000px wide.&lt;/p&gt;&lt;p&gt;Both of those are often forgotten, but still see quite a bit of real-life usage. The first one in older mobile phones, and the second one on tablets, laptops and desktops in unmaximized browser windows.&lt;/p&gt;&lt;h3 id=&quot;based-on-popular-css-frameworks&quot;&gt;Based on popular CSS frameworks&lt;/h3&gt;&lt;p&gt;We&amp;#x27;ve written about &lt;a href=&quot;/blog/css-breakpoints-used-by-popular-css-frameworks/&quot;&gt;the breakpoints that popular CSS frameworks use&lt;/a&gt; before.
These are excellent when you&amp;#x27;re also using the rest of the framework, or as a starting-off point. For example, here&amp;#x27;s the breakpoints in Tailwind CSS 3.0:&lt;/p&gt;&lt;div class=&quot;WorkspacePreviewBreakpoints-styles-module--workspaceWrapper--Ji7Yl&quot;&gt;&lt;div class=&quot;WorkspacePreviewBreakpoints-styles-module--buttonContainer--1UPyH&quot;&gt;Breakpoints from Tailwind CSS &lt;a class=&quot;WorkspacePreviewBreakpoints-styles-module--open--Tem3A&quot; href=&quot;https://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A640%2C%22title%22%3A%22sm%22%7D%2C%7B%22width%22%3A768%2C%22title%22%3A%22md%22%7D%2C%7B%22width%22%3A1024%2C%22title%22%3A%22lg%22%7D%2C%7B%22width%22%3A1280%2C%22title%22%3A%22xl%22%7D%2C%7B%22width%22%3A1536%2C%22title%22%3A%222xl%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreviewBreakpoints-styles-module--panelist--3CMcb panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:91.42857142857143px;height:100%&quot;&gt;sm&lt;i&gt;640px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:109.71428571428571px;height:100%&quot;&gt;md&lt;i&gt;768px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:146.28571428571428px;height:100%&quot;&gt;lg&lt;i&gt;1024px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:182.85714285714286px;height:100%&quot;&gt;xl&lt;i&gt;1280px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:219.42857142857142px;height:100%&quot;&gt;2xl&lt;i&gt;1536px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;This gives a nice spread, though with a relatively high starting point you run the risk of having to do extra work after implementing the design
to make sure everything fit on mobile devices.&lt;/p&gt;&lt;h3 id=&quot;based-on-your-visitor-data&quot;&gt;Based on your visitor data&lt;/h3&gt;&lt;p&gt;If you use Google Analytics, your visitors browser dimensions are stored as well. This means you can retrieve them
from the Google Analytics dashboard and use those to test on. If you want an overview of them, generate your own &lt;a href=&quot;/responsive-website-test/&quot;&gt;browser size wall&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;For example, here&amp;#x27;s the 5 most used dimension on this site:&lt;/p&gt;&lt;div class=&quot;WorkspacePreviewBreakpoints-styles-module--workspaceWrapper--Ji7Yl&quot;&gt;&lt;div class=&quot;WorkspacePreviewBreakpoints-styles-module--buttonContainer--1UPyH&quot;&gt;Viewports from Polypane.app visitors &lt;a class=&quot;WorkspacePreviewBreakpoints-styles-module--open--Tem3A&quot; href=&quot;https://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A1900%2C%22title%22%3A%224.55%25%22%7D%2C%7B%22width%22%3A1900%2C%22title%22%3A%222.13%25%22%7D%2C%7B%22width%22%3A1520%2C%22title%22%3A%222.02%25%22%7D%2C%7B%22width%22%3A1350%2C%22title%22%3A%221.99%25%22%7D%2C%7B%22width%22%3A1350%2C%22title%22%3A%221.95%25%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreviewBreakpoints-styles-module--panelist--3CMcb panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:271.42857142857144px;height:100%&quot;&gt;4.55%&lt;i&gt;1900px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:271.42857142857144px;height:100%&quot;&gt;2.13%&lt;i&gt;1900px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:217.14285714285714px;height:100%&quot;&gt;2.02%&lt;i&gt;1520px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:192.85714285714286px;height:100%&quot;&gt;1.99%&lt;i&gt;1350px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:192.85714285714286px;height:100%&quot;&gt;1.95%&lt;i&gt;1350px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;While you can use the above it&amp;#x27;s important to realize that &lt;strong&gt;our&lt;/strong&gt; audience probably isn&amp;#x27;t &lt;strong&gt;your&lt;/strong&gt; audience. Polypane is a tool
for web developers, so the vast majority of our visitors are viewing our site on a desktop device, and fairly large ones
at that.&lt;/p&gt;&lt;p&gt;Notice too that none of the most popular sizes here map to the traditional device widths mentioned
above. Every audience is different, and it&amp;#x27;s best to cater to yours.&lt;/p&gt;&lt;h4 id=&quot;create-a-polypane-workspace-based-on-google-analytics&quot;&gt;Create a Polypane workspace based on Google Analytics&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;You can also use &lt;a href=&quot;/create-workspace/&quot;&gt;our GA workspace creator&lt;/a&gt; to automate the process, select how many panes you want and how to sort them, and then opening them in Polypane with a single click.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;the-breakpoints-we-tested-in-2021-and-2022&quot;&gt;The breakpoints we tested in 2021 and 2022&lt;/h3&gt;&lt;p&gt;That leaves us with the last method: using the breakpoints that have been used the most in the past years. For that we can use two
sources: the Web Almanac and Polypane.&lt;/p&gt;&lt;h4 id=&quot;from-the-web-almanac&quot;&gt;From the Web Almanac&lt;/h4&gt;&lt;p&gt;Each year, the &lt;a href=&quot;https://almanac.httparchive.org/en/2022/&quot;&gt;Web Almanac&lt;/a&gt; analyses over 8 million websites (8.2 in 2021, 8.3 in 2022) old and new, to make an overview of the most used web features, including breakpoints. That also includes all the sites
in the web almanacs testing data that existed (well) before this year.&lt;/p&gt;&lt;p&gt;It has &lt;a href=&quot;https://almanac.httparchive.org/en/2022/css&quot;&gt;a chapter on CSS&lt;/a&gt; that includes a list of &lt;a href=&quot;https://almanac.httparchive.org/en/2022/css#common-breakpoints&quot;&gt;common breakpoints&lt;/a&gt;.
It&amp;#x27;s worth reading the analysis: they make a split between &lt;code class=&quot;language-text&quot;&gt;min-width&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;max-width&lt;/code&gt; media queries because you can see a clear
difference in sizes used (&lt;code class=&quot;language-text&quot;&gt;min-width&lt;/code&gt; is more often used for &lt;code class=&quot;language-text&quot;&gt;767px&lt;/code&gt; while &lt;code class=&quot;language-text&quot;&gt;max-width&lt;/code&gt; for &lt;code class=&quot;language-text&quot;&gt;768px&lt;/code&gt;, for example). We&amp;#x27;re splitting
those out in the overview below as well, as they give a nice contrast.&lt;/p&gt;&lt;h5 id=&quot;min-widths-for-2021-and-2022&quot;&gt;Min-widths for 2021 and 2022&lt;/h5&gt;&lt;div class=&quot;WorkspacePreviewBreakpoints-styles-module--workspaceWrapper--Ji7Yl&quot;&gt;&lt;div class=&quot;WorkspacePreviewBreakpoints-styles-module--buttonContainer--1UPyH&quot;&gt;Most used min-width breakpoints from the Web Almanac 2021 &lt;a class=&quot;WorkspacePreviewBreakpoints-styles-module--open--Tem3A&quot; href=&quot;https://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A768%2C%22title%22%3A%2257%25%22%7D%2C%7B%22width%22%3A1200%2C%22title%22%3A%2244%25%22%7D%2C%7B%22width%22%3A992%2C%22title%22%3A%2240%25%22%7D%2C%7B%22width%22%3A600%2C%22title%22%3A%2231%25%22%7D%2C%7B%22width%22%3A782%2C%22title%22%3A%2225%25%22%7D%2C%7B%22width%22%3A480%2C%22title%22%3A%2224%25%22%7D%2C%7B%22width%22%3A1024%2C%22title%22%3A%2216%25%22%7D%2C%7B%22width%22%3A767%2C%22title%22%3A%229%25%22%7D%2C%7B%22width%22%3A800%2C%22title%22%3A%228%25%22%7D%2C%7B%22width%22%3A991%2C%22title%22%3A%223%25%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreviewBreakpoints-styles-module--panelist--3CMcb panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:109.71428571428571px;height:100%&quot;&gt;57%&lt;i&gt;768px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:171.42857142857142px;height:100%&quot;&gt;44%&lt;i&gt;1200px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:141.71428571428572px;height:100%&quot;&gt;40%&lt;i&gt;992px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:85.71428571428571px;height:100%&quot;&gt;31%&lt;i&gt;600px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:111.71428571428571px;height:100%&quot;&gt;25%&lt;i&gt;782px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:68.57142857142857px;height:100%&quot;&gt;24%&lt;i&gt;480px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:146.28571428571428px;height:100%&quot;&gt;16%&lt;i&gt;1024px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:109.57142857142857px;height:100%&quot;&gt;9%&lt;i&gt;767px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:114.28571428571429px;height:100%&quot;&gt;8%&lt;i&gt;800px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:141.57142857142858px;height:100%&quot;&gt;3%&lt;i&gt;991px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;WorkspacePreviewBreakpoints-styles-module--workspaceWrapper--Ji7Yl&quot;&gt;&lt;div class=&quot;WorkspacePreviewBreakpoints-styles-module--buttonContainer--1UPyH&quot;&gt;Most used min-width breakpoints from the Web Almanac 2022 &lt;a class=&quot;WorkspacePreviewBreakpoints-styles-module--open--Tem3A&quot; href=&quot;https://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A768%2C%22title%22%3A%2257%25%22%7D%2C%7B%22width%22%3A1200%2C%22title%22%3A%2242%25%22%7D%2C%7B%22width%22%3A992%2C%22title%22%3A%2239%25%22%7D%2C%7B%22width%22%3A600%2C%22title%22%3A%2232%25%22%7D%2C%7B%22width%22%3A782%2C%22title%22%3A%2225%25%22%7D%2C%7B%22width%22%3A480%2C%22title%22%3A%2223%25%22%7D%2C%7B%22width%22%3A1024%2C%22title%22%3A%2217%25%22%7D%2C%7B%22width%22%3A767%2C%22title%22%3A%228%25%22%7D%2C%7B%22width%22%3A800%2C%22title%22%3A%227%25%22%7D%2C%7B%22width%22%3A991%2C%22title%22%3A%223%25%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreviewBreakpoints-styles-module--panelist--3CMcb panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:109.71428571428571px;height:100%&quot;&gt;57%&lt;i&gt;768px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:171.42857142857142px;height:100%&quot;&gt;42%&lt;i&gt;1200px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:141.71428571428572px;height:100%&quot;&gt;39%&lt;i&gt;992px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:85.71428571428571px;height:100%&quot;&gt;32%&lt;i&gt;600px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:111.71428571428571px;height:100%&quot;&gt;25%&lt;i&gt;782px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:68.57142857142857px;height:100%&quot;&gt;23%&lt;i&gt;480px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:146.28571428571428px;height:100%&quot;&gt;17%&lt;i&gt;1024px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:109.57142857142857px;height:100%&quot;&gt;8%&lt;i&gt;767px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:114.28571428571429px;height:100%&quot;&gt;7%&lt;i&gt;800px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:141.57142857142858px;height:100%&quot;&gt;3%&lt;i&gt;991px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;Between the two years the order of these stayed the same (remember, most of those 8 million websites were
created &lt;em&gt;before&lt;/em&gt; 2021). There are some percentage point changes her and there but nothing worth calling out.&lt;/p&gt;&lt;h5 id=&quot;max-widths-for-2021-and-2022&quot;&gt;Max-widths for 2021 and 2022&lt;/h5&gt;&lt;div class=&quot;WorkspacePreviewBreakpoints-styles-module--workspaceWrapper--Ji7Yl&quot;&gt;&lt;div class=&quot;WorkspacePreviewBreakpoints-styles-module--buttonContainer--1UPyH&quot;&gt;Most used max-width breakpoints from the Web Almanac 2021 &lt;a class=&quot;WorkspacePreviewBreakpoints-styles-module--open--Tem3A&quot; href=&quot;https://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A767%2C%22title%22%3A%2252%25%22%7D%2C%7B%22width%22%3A600%2C%22title%22%3A%2238%25%22%7D%2C%7B%22width%22%3A768%2C%22title%22%3A%2238%25%22%7D%2C%7B%22width%22%3A480%2C%22title%22%3A%2236%25%22%7D%2C%7B%22width%22%3A991%2C%22title%22%3A%2230%25%22%7D%2C%7B%22width%22%3A1024%2C%22title%22%3A%2227%25%22%7D%2C%7B%22width%22%3A800%2C%22title%22%3A%2226%25%22%7D%2C%7B%22width%22%3A1200%2C%22title%22%3A%2218%25%22%7D%2C%7B%22width%22%3A992%2C%22title%22%3A%2213%25%22%7D%2C%7B%22width%22%3A782%2C%22title%22%3A%2210%25%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreviewBreakpoints-styles-module--panelist--3CMcb panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:109.57142857142857px;height:100%&quot;&gt;52%&lt;i&gt;767px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:85.71428571428571px;height:100%&quot;&gt;38%&lt;i&gt;600px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:109.71428571428571px;height:100%&quot;&gt;38%&lt;i&gt;768px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:68.57142857142857px;height:100%&quot;&gt;36%&lt;i&gt;480px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:141.57142857142858px;height:100%&quot;&gt;30%&lt;i&gt;991px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:146.28571428571428px;height:100%&quot;&gt;27%&lt;i&gt;1024px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:114.28571428571429px;height:100%&quot;&gt;26%&lt;i&gt;800px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:171.42857142857142px;height:100%&quot;&gt;18%&lt;i&gt;1200px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:141.71428571428572px;height:100%&quot;&gt;13%&lt;i&gt;992px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:111.71428571428571px;height:100%&quot;&gt;10%&lt;i&gt;782px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;WorkspacePreviewBreakpoints-styles-module--workspaceWrapper--Ji7Yl&quot;&gt;&lt;div class=&quot;WorkspacePreviewBreakpoints-styles-module--buttonContainer--1UPyH&quot;&gt;Most used max-width breakpoints from the Web Almanac 2022 &lt;a class=&quot;WorkspacePreviewBreakpoints-styles-module--open--Tem3A&quot; href=&quot;https://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A767%2C%22title%22%3A%2251%25%22%7D%2C%7B%22width%22%3A600%2C%22title%22%3A%2239%25%22%7D%2C%7B%22width%22%3A768%2C%22title%22%3A%2238%25%22%7D%2C%7B%22width%22%3A480%2C%22title%22%3A%2235%25%22%7D%2C%7B%22width%22%3A991%2C%22title%22%3A%2229%25%22%7D%2C%7B%22width%22%3A1024%2C%22title%22%3A%2226%25%22%7D%2C%7B%22width%22%3A800%2C%22title%22%3A%2225%25%22%7D%2C%7B%22width%22%3A1200%2C%22title%22%3A%2219%25%22%7D%2C%7B%22width%22%3A992%2C%22title%22%3A%2213%25%22%7D%2C%7B%22width%22%3A782%2C%22title%22%3A%2212%25%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreviewBreakpoints-styles-module--panelist--3CMcb panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:109.57142857142857px;height:100%&quot;&gt;51%&lt;i&gt;767px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:85.71428571428571px;height:100%&quot;&gt;39%&lt;i&gt;600px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:109.71428571428571px;height:100%&quot;&gt;38%&lt;i&gt;768px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:68.57142857142857px;height:100%&quot;&gt;35%&lt;i&gt;480px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:141.57142857142858px;height:100%&quot;&gt;29%&lt;i&gt;991px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:146.28571428571428px;height:100%&quot;&gt;26%&lt;i&gt;1024px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:114.28571428571429px;height:100%&quot;&gt;25%&lt;i&gt;800px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:171.42857142857142px;height:100%&quot;&gt;19%&lt;i&gt;1200px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:141.71428571428572px;height:100%&quot;&gt;13%&lt;i&gt;992px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:111.71428571428571px;height:100%&quot;&gt;12%&lt;i&gt;782px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;Likewise for the max-widths there was no change in the order of these and there were slight changes in the percentages.&lt;/p&gt;&lt;h5 id=&quot;comparing-min-and-max-widths&quot;&gt;Comparing min and max widths&lt;/h5&gt;&lt;p&gt;When it comes to the difference between &lt;code class=&quot;language-text&quot;&gt;min-width&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;max-width&lt;/code&gt; though, apart from the 1px differences here and there, an interesting difference appears: the spread for &lt;code class=&quot;language-text&quot;&gt;min-width&lt;/code&gt; is much wider. For &lt;code class=&quot;language-text&quot;&gt;min-width&lt;/code&gt;, the top 10 goes from 57% usage to 3%, while max-width starts lower, at 52%, and ends higher, at 10%.&lt;/p&gt;&lt;p&gt;Min-widths means &lt;a href=&quot;/blog/responsive-design-ground-rules/#rule-2-mobile-first&quot;&gt;you&amp;#x27;re &lt;em&gt;adding&lt;/em&gt; styling as you get wider&lt;/a&gt;, while max-widths usually disable styling as they get smaller. Because of this, you frequently need
less min-widths, and your styling works for a longer time before you need a new breakpoint.&lt;/p&gt;&lt;p&gt;In addition, when using min-widths you are more likely adding breakpoints based on the content. With each website&amp;#x27;s content breaking in different places, that means that the number of different breakpoints will be higher.&lt;/p&gt;&lt;h4 id=&quot;the-most-used-breakpoints-in-polypane-in-2021-and-2022&quot;&gt;The most-used breakpoints in Polypane in 2021 and 2022&lt;/h4&gt;&lt;p&gt;We can also look at the most used pane sizes in Polypane in 2021 and 2022. The sizes that &lt;strong&gt;real developers have used the most in the past
year&lt;/strong&gt; to develop websites with.&lt;/p&gt;&lt;p&gt;This gives the most accurate look at what sizes modern sites are optimized for. Here is the top 10 for 2021:&lt;/p&gt;&lt;div class=&quot;WorkspacePreviewBreakpoints-styles-module--workspaceWrapper--Ji7Yl&quot;&gt;&lt;div class=&quot;WorkspacePreviewBreakpoints-styles-module--buttonContainer--1UPyH&quot;&gt;Most used breakpoints in Polypane in 2021 &lt;a class=&quot;WorkspacePreviewBreakpoints-styles-module--open--Tem3A&quot; href=&quot;https://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A320%2C%22title%22%3A%225.48%25%22%7D%2C%7B%22width%22%3A1280%2C%22title%22%3A%224.49%25%22%7D%2C%7B%22width%22%3A768%2C%22title%22%3A%223.41%25%22%7D%2C%7B%22width%22%3A1920%2C%22title%22%3A%222.41%25%22%7D%2C%7B%22width%22%3A500%2C%22title%22%3A%222.19%25%22%7D%2C%7B%22width%22%3A568%2C%22title%22%3A%221.89%25%22%7D%2C%7B%22width%22%3A800%2C%22title%22%3A%221.86%25%22%7D%2C%7B%22width%22%3A375%2C%22title%22%3A%221.81%25%22%7D%2C%7B%22width%22%3A1024%2C%22title%22%3A%221.69%25%22%7D%2C%7B%22width%22%3A1440%2C%22title%22%3A%221.25%25%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreviewBreakpoints-styles-module--panelist--3CMcb panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:45.714285714285715px;height:100%&quot;&gt;5.48%&lt;i&gt;320px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:182.85714285714286px;height:100%&quot;&gt;4.49%&lt;i&gt;1280px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:109.71428571428571px;height:100%&quot;&gt;3.41%&lt;i&gt;768px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:274.2857142857143px;height:100%&quot;&gt;2.41%&lt;i&gt;1920px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:71.42857142857143px;height:100%&quot;&gt;2.19%&lt;i&gt;500px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:81.14285714285714px;height:100%&quot;&gt;1.89%&lt;i&gt;568px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:114.28571428571429px;height:100%&quot;&gt;1.86%&lt;i&gt;800px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:53.57142857142857px;height:100%&quot;&gt;1.81%&lt;i&gt;375px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:146.28571428571428px;height:100%&quot;&gt;1.69%&lt;i&gt;1024px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:205.71428571428572px;height:100%&quot;&gt;1.25%&lt;i&gt;1440px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;If we look at these sizes we see a nice spread between device sizes, breakpoints from CSS Frameworks and the many
&lt;a href=&quot;/docs/workspace-management/&quot;&gt;presets&lt;/a&gt; that Polypane ships with.&lt;/p&gt;&lt;p&gt;And here is the top 10 for 2022:&lt;/p&gt;&lt;div class=&quot;WorkspacePreviewBreakpoints-styles-module--workspaceWrapper--Ji7Yl&quot;&gt;&lt;div class=&quot;WorkspacePreviewBreakpoints-styles-module--buttonContainer--1UPyH&quot;&gt;Most used breakpoints in Polypane in 2022 &lt;a class=&quot;WorkspacePreviewBreakpoints-styles-module--open--Tem3A&quot; href=&quot;https://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A320%2C%22title%22%3A%220.7%25%22%7D%2C%7B%22width%22%3A1280%2C%22title%22%3A%220.63%25%22%7D%2C%7B%22width%22%3A768%2C%22title%22%3A%220.53%25%22%7D%2C%7B%22width%22%3A1920%2C%22title%22%3A%220.39%25%22%7D%2C%7B%22width%22%3A500%2C%22title%22%3A%220.35%25%22%7D%2C%7B%22width%22%3A375%2C%22title%22%3A%220.3%25%22%7D%2C%7B%22width%22%3A1440%2C%22title%22%3A%220.27%25%22%7D%2C%7B%22width%22%3A568%2C%22title%22%3A%220.24%25%22%7D%2C%7B%22width%22%3A800%2C%22title%22%3A%220.23%25%22%7D%2C%7B%22width%22%3A1024%2C%22title%22%3A%220.23%25%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreviewBreakpoints-styles-module--panelist--3CMcb panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:45.714285714285715px;height:100%&quot;&gt;0.7%&lt;i&gt;320px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:182.85714285714286px;height:100%&quot;&gt;0.63%&lt;i&gt;1280px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:109.71428571428571px;height:100%&quot;&gt;0.53%&lt;i&gt;768px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:274.2857142857143px;height:100%&quot;&gt;0.39%&lt;i&gt;1920px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:71.42857142857143px;height:100%&quot;&gt;0.35%&lt;i&gt;500px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:53.57142857142857px;height:100%&quot;&gt;0.3%&lt;i&gt;375px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:205.71428571428572px;height:100%&quot;&gt;0.27%&lt;i&gt;1440px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:81.14285714285714px;height:100%&quot;&gt;0.24%&lt;i&gt;568px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:114.28571428571429px;height:100%&quot;&gt;0.23%&lt;i&gt;800px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:146.28571428571428px;height:100%&quot;&gt;0.23%&lt;i&gt;1024px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;These percentages are very different from 2021. That&amp;#x27;s because as Polypane has grown over the years, so has the diversity of breakpoints people use to test.&lt;/p&gt;&lt;p&gt;We love this because it means
people are increasingly letting go of &lt;a href=&quot;/blog/thanks-i-phone-14-designing-for-device-sizes-is-dead/&quot;&gt;designing for devices&lt;/a&gt; in favor of picking breakpoints that
work for their content.&lt;/p&gt;&lt;h3 id=&quot;the-breakpoints-to-develop-on-in-2023&quot;&gt;The breakpoints to develop on in 2023&lt;/h3&gt;&lt;p&gt;As you can see from the relatively low percentages, there are thousands of other sizes being used in Polypane. There is no
single right set of dimensions.&lt;/p&gt;&lt;p&gt;So the best answer? Pick a set you like and adapt it. Any of the ones on this page are a good choice.&lt;/p&gt;&lt;p&gt;If you notice you often make errors at a
size you&amp;#x27;re not currently developing for, make sure to add it. And if you find yourself fixing the same issue at multiple
sizes, maybe you can hide one of them during development.&lt;/p&gt;&lt;p&gt;Regardless of which default sizes you choose to develop on, &lt;strong&gt;it&amp;#x27;s best to see all of them in one overview.&lt;/strong&gt; That&amp;#x27;s what
Polypane lets you do. All the other parts of your browser are synced
as well: your interactions happen in all panes, our elements panel lets you edit and inspect elements in all
panes at the same time, and our console intelligently combines messages from each pane.&lt;/p&gt;&lt;p&gt;Polypane has &lt;a href=&quot;https://dashboard.polypane.app/register/&quot;&gt;a free trial&lt;/a&gt; available, click the link below to sign up!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Improving your CLS and LCP Core Web Vitals]]></title><description><![CDATA[Web Vitals are a set of measurements that gauge the user experience of your website. If you score poorly
on them, your site is not as nice…]]></description><link>https://polypane.app/blog/improving-your-cls-and-lcp-core-web-vitals/</link><guid isPermaLink="false">https://polypane.app/blog/improving-your-cls-and-lcp-core-web-vitals/</guid><pubDate>Wed, 24 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Web Vitals are a set of measurements that gauge the user experience of your website. If you score poorly
on them, your site is not as nice to use as a site with good Core Web Vitals. Google
also uses them to determine the SEO score of a page. So improving them is important for any website.&lt;/p&gt;&lt;h2 id=&quot;what-are-the-core-web-vitals&quot;&gt;What are the &lt;em&gt;Core&lt;/em&gt; Web Vitals?&lt;/h2&gt;&lt;p&gt;While there are seven different Web Vitals, the Core Web Vitals are the three that have the largest impact:&lt;/p&gt;&lt;h3 id=&quot;cls-cumulative-layout-shift&quot;&gt;CLS: Cumulative Layout Shift&lt;/h3&gt;&lt;p&gt;This measures how much your layout changes as the page loads, or as a user interacts with your page. Things like
images loading and pushing content down, or web fonts loading and causing your type to change will change the layout of
your page which can be frustrating to your visitors.&lt;/p&gt;&lt;p&gt;You want your CLS to be below 0.1 to get a &amp;quot;Good&amp;quot; score.&lt;/p&gt;&lt;h3 id=&quot;fid-first-input-delay&quot;&gt;FID: First Input Delay&lt;/h3&gt;&lt;p&gt;This measures how soon your page is interactive by checking how fast your site responds to the first interaction a user
has with your page. While your page is loading it&amp;#x27;s too busy to process the event and only processes that after the
loading is done.&lt;/p&gt;&lt;p&gt;You want your FID to be below 100ms to get a &amp;quot;Good&amp;quot; score.&lt;/p&gt;&lt;h3 id=&quot;lcp-largest-contentful-paint&quot;&gt;LCP: Largest Contentful Paint&lt;/h3&gt;&lt;p&gt;This measures how long it takes your page to load visually. The Largest Contentful Paint is measured in the
time it takes for the last largest visual element to load. This doesn&amp;#x27;t have to be the visually largest element visible,
or even the largest image. It can also be a block of text with a web font.&lt;/p&gt;&lt;p&gt;You want your LCP to be below 2.5 seconds to get a &amp;quot;Good&amp;quot; score.&lt;/p&gt;&lt;p&gt;Out of these three, CLS and LCP are influenced mostly by your page styling (and the way that is loaded) while FID essentially
measures how much JS you execute on load.&lt;/p&gt;&lt;p&gt;The other Web Vitals are FCP (First Contentful Paint), TTFB (Time To First Byte), TBT (Total Blocking Time) and TTI
(Time To Interactive). This list will probably be expanded with Web Vitals that measure animation performance and overall responsiveness.&lt;/p&gt;&lt;h2 id=&quot;monitoring-your-core-web-vitals&quot;&gt;Monitoring your core web vitals&lt;/h2&gt;&lt;p&gt;To improve something you first need to measure it. Polypane continuously monitors the web vitals in each pane, but to not clutter the interface your score is hidden until you decide to show it.&lt;/p&gt;&lt;p&gt;Click the settings icon in the top right of Polypane and then toggle &amp;quot;Web Vitals status&amp;quot; to turn web vitals on.&lt;/p&gt;&lt;img src=&quot;/blogs/webvitals/settings.png&quot; class=&quot;imgshadow&quot; alt=&quot;The settings panel with the `Web Vitals Status` option highlighted.&quot;/&gt;&lt;p&gt;With web vitals turned on each pane gets a new label that shows either a &lt;b style=&quot;color:green&quot;&gt;●&lt;/b&gt;, &lt;b style=&quot;color:orange&quot;&gt;■&lt;/b&gt; or &lt;b style=&quot;color:red&quot;&gt;▲&lt;/b&gt; for a &amp;quot;good&amp;quot;, &amp;quot;needs improvement&amp;quot; or &amp;quot;poor&amp;quot; score respectively. If you score &amp;quot;needs improvement&amp;quot; or &amp;quot;poor&amp;quot; on any of the web vitals, the label also shows the Web Vitals that score &amp;quot;poor&amp;quot; or &amp;quot;needs improvement&amp;quot;.&lt;/p&gt;&lt;p&gt;To get more detailed information you can hover over the label and a popup opens with a full overview of your Web Vitals. Along with the Core Web Vitals, Polypane also shows you the First Contentful Paint score and Time To First Byte.&lt;/p&gt;&lt;img src=&quot;/doc-img/webvitals.png&quot; class=&quot;imgshadow&quot; alt=&quot;The Web Vitals tooltip showing the different scores. First input delay is orange, because it scored &amp;#x27;needs improvement&amp;#x27;.&quot;/&gt;&lt;p&gt;This gives you a more detailed overview of your web vitals score. For any public page you&amp;#x27;ll notice a bunch of bars here
along with the score you get for each web vital.&lt;/p&gt;&lt;p&gt;Those bars show you the average scoring for your page, from the CrUX Field Data that Google collects for all sites. Field Data tells you the average
loading experience in the real world. The larger the green part of the bars for CLS and LCP are, the more people your page loads fast for.
The CrUX Field Data is measured separately for mobile and desktop, and Polypane will automatically switch between those depending
on the size of your pane.&lt;/p&gt;&lt;h3 id=&quot;why-crux-data-is-useful&quot;&gt;Why CrUX data is useful&lt;/h3&gt;&lt;p&gt;Web Vitals are non-deterministic so it&amp;#x27;s important to look at the averages. Your Web Vitals score will be different on each device, but also
different each time your reload your page. Sometimes the network might be a little bit slower, or your CPU might be doing
something difficult right as your page is also being parsed, resulting in a worse Web Vitals score.&lt;/p&gt;&lt;p&gt;By showing the averages you can quickly check if your experience compares to the majority of people loading your page, and if the majority of
your visitors have a good experience.&lt;/p&gt;&lt;h2 id=&quot;improving-cls-and-lcp&quot;&gt;Improving CLS and LCP&lt;/h2&gt;&lt;p&gt;Polypane offers visualizations for both the CLS and LCP so you can figure out exactly which elements contribute to a score
and improve them one by one. For example on this page the LCP is the image at the top of the page and it has a score of 1.9s, which is &amp;quot;good&amp;quot;.&lt;/p&gt;&lt;p&gt;When a visualization is available there will be an &lt;svg id=&quot;i-eye&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;circle cx=&quot;17&quot; cy=&quot;15&quot; r=&quot;1&quot;&gt;&lt;/circle&gt;&lt;circle cx=&quot;16&quot; cy=&quot;16&quot; r=&quot;6&quot;&gt;&lt;/circle&gt;&lt;path d=&quot;M2 16 C2 16 7 6 16 6 25 6 30 16 30 16 30 16 25 26 16 26 7 26 2 16 2 16 Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt; Eye icon visible in the popup next to the Web Vital. Click it to
toggle the visualization.&lt;/p&gt;&lt;h3 id=&quot;cumulative-layout-shift&quot;&gt;Cumulative Layout Shift&lt;/h3&gt;&lt;p&gt;The Cumulative Layout Shift visualization will show you how all the elements that contribute to the layout shift behaved
from their initial point of rendering (semitransparent red rectangle with a dashed red border) to their ending position
(transparent rectangle with a solid red border).&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-7/cls-demo.mp4&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;Visualization of the Cumulative Layout Shift on the Polypane getting started page.&lt;/video&gt;&lt;p&gt;The bigger the change between the first and second rectangle, the higher your
CLS score. For each of these types of elements you can improve your score by doing the following:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Images&lt;/strong&gt; (and video) could be loaded in too late, in which case you want to add the &lt;code class=&quot;language-text&quot;&gt;loading=&amp;quot;eager&amp;quot;&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;importance=&amp;quot;high&amp;quot;&lt;/code&gt; attributes to tell the browser to start loading these early.&lt;br/&gt;&lt;br/&gt;Images can also be missing an aspect ratio or width and height attributes. When you add these the browser can already calculate the space an image will take before the image has loaded, so that wont cause a layout shift.&lt;br/&gt;&lt;br/&gt;Also make sure that any hero images you have are preloaded at the top of the page using &lt;code class=&quot;language-text&quot;&gt;&amp;lt;link rel=&amp;quot;preload&amp;quot; href=&amp;quot;your-file.jpg&amp;quot; /&amp;gt;&lt;/code&gt;.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Text elements&lt;/strong&gt; that result in a layout shift are usually caused by your webfont taking too long to load and the elements to first be rendered in the fallback font, then rendered again in the webfont. If your webfont is not important, switch your @font-face declaration from &lt;code class=&quot;language-text&quot;&gt;display: swap;&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;display: optional;&lt;/code&gt;. This will give your web font a very small window to load (fast enough to not trigger a layout shift) or the browser will keep the fallback font and won&amp;#x27;t update to the new font. &lt;br/&gt;&lt;br/&gt;You should also make sure to preload your font-files by adding them as &lt;code class=&quot;language-text&quot;&gt;preload&lt;/code&gt; links in the header. This will tell your browsers that you&amp;#x27;re going to use this font, and the browser will download it in advance.&lt;br/&gt;&lt;br/&gt; There are also techniques to configure your fallback font using CSS Font Descriptors to make sure that there is no change in the layout when swapping the fonts. Making sure that works well with fallback fonts on all operating systems is impossible though, so we wont recommend it.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elements loaded in through JS&lt;/strong&gt; are more difficult. When you can, make sure to reserve the space your content will take up (even if it&amp;#x27;s an estimate) to minimize the layout changing.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Keep in mind that multiple reloads of your page might show you different cumulative layout shift scores, and that different screen sizes will
get different elements contributing to the CLS. So make sure to check multiple reloads and multiple screen sizes. In Polypane, you can do that both
at the same time by using multiple panes.&lt;/p&gt;&lt;p&gt;Even if you have a very low CLS the visualization can still show elements causing a CLS. You dont have to improve these,
but because the shifts might be small they could be easy to fix.&lt;/p&gt;&lt;h3 id=&quot;largest-contentful-paint&quot;&gt;Largest Contentful Paint&lt;/h3&gt;&lt;p&gt;The LCP visualization will highlight the element that causes the LCP. If your LCP is low or in the green then this is just for your
information, there is nothing to do or to improve. But if your LCP is too high, in the orange or in the red, there&amp;#x27;s things you can
do to improve.&lt;/p&gt;&lt;img src=&quot;/blogs/webvitals/largest-contentful-paint.png&quot; class=&quot;imgshadow&quot; alt=&quot;The Web Vitals tooltip with the visualization for largest contentful paint turned on, showing a border around the image at the top of this page.&quot;/&gt;&lt;p&gt;In general, make sure that your site loads as fast as possible. For this you can also use the Time To First Byte measurement in
the Web Vitals tooltip, which tells you how long it takes for the first bytes to load after you requested the page. In essence, how long
it take your server to respond. If this takes very long it means your server is taking a long time to generate the page.&lt;/p&gt;&lt;p&gt;There&amp;#x27;s many ways to make your server faster but that&amp;#x27;s a little out-of-scope for this article. Still, that
will have the biggest effect on your LCP.&lt;/p&gt;&lt;p&gt;It&amp;#x27;s not just how fast your server responds with the HTML, but also all the other resources that need to get downloaded. For a good LCP you need to make sure that the CSS, webfonts and images that are required for your page load are downloaded as fast as possible.&lt;/p&gt;&lt;p&gt;To do this you can make the same improvements as for CLS: Add a &lt;code class=&quot;language-text&quot;&gt;loading=&amp;quot;eager&amp;quot;&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;importance=&amp;quot;high&amp;quot;&lt;/code&gt; to your LCP image and make sure to preload that image in your &lt;code class=&quot;language-text&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt; using &lt;code class=&quot;language-text&quot;&gt;&amp;lt;link rel=&amp;quot;preload&amp;quot; href=&amp;quot;your-file.jpg&amp;quot; /&amp;gt;&lt;/code&gt;. You should also do this when your LCP element has a large background image.&lt;/p&gt;&lt;p&gt;If your LCP is a text block with a web font, make sure to preload that webfont as well: &lt;code class=&quot;language-text&quot;&gt;&amp;lt;link rel=&amp;quot;preload&amp;quot; href=&amp;quot;your-font.woff2&amp;quot; /&amp;gt;&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;And if the load of your page depends on third party code, like Google Analytics, you can &lt;code class=&quot;language-text&quot;&gt;preconnect&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;dns-prefetch&lt;/code&gt; the domains they&amp;#x27;re on to get a faster response:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;preconnect&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;https://googleanalytics.com/&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;dns-prefetch&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;https://googleanalytics.com/&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This way your browser already knows you&amp;#x27;re going to connect to these domains and it can do the DNS lookup and connection before the request.&lt;/p&gt;&lt;p&gt;Just knowing your Core Web Vitals score doesn&amp;#x27;t help you figure out what parts of your page to improve, but with the visualizations in Polypane the elements you should focus on become instantly clear. Check out your Core Web Vitals by &lt;a href=&quot;https://dashboard.polypane/app/register/&quot;&gt;starting a free Polypane trial&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[The EyeDropper API: Pick colors from anywhere on your screen]]></title><description><![CDATA[With the new EyeDropper API in Chromium, websites can let visitors pick colors from anywhere on their screen, adding another
feature to the…]]></description><link>https://polypane.app/blog/the-eye-dropper-api-pick-colors-from-anywhere-on-your-screen/</link><guid isPermaLink="false">https://polypane.app/blog/the-eye-dropper-api-pick-colors-from-anywhere-on-your-screen/</guid><pubDate>Thu, 11 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;With the new EyeDropper API in Chromium, websites can let visitors pick colors from anywhere on their screen, adding another
feature to the web that used to require hacky solutions and is now just a few lines of code.  The API is
clean and modern and easy to use. In this article we&amp;#x27;ll discuss how to set it up, handle edge cases and additional features
we hope will land in future updates.&lt;/p&gt;&lt;p&gt;We&amp;#x27;ve been following the EyeDropper API since it was first proposed and have been experimenting with it as different
parts became available as well as providing input while the feature was being developed. In &lt;a href=&quot;/blog/polypane-7/&quot;&gt;Polypane 7&lt;/a&gt;
we started using it extensively for the new color picker and new palettes.&lt;/p&gt;&lt;h2 id=&quot;try-it-out&quot;&gt;Try it out&lt;/h2&gt;&lt;p&gt;Try the color picker API below (Chromium 95 or Polypane 7 and up).&lt;/p&gt;&lt;div style=&quot;display:flex;justify-content:center&quot;&gt;&lt;div class=&quot;poly-color-chooser-example&quot;&gt;&lt;em&gt;The EyeDropper API is not supported. Please use Polypane or another Chromium-based browser.&lt;/em&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2 id=&quot;how-to-use-the-eyedropper-api&quot;&gt;How to use the EyeDropper API&lt;/h2&gt;&lt;p&gt;The API adds a new global, &lt;code class=&quot;language-text&quot;&gt;EyeDropper&lt;/code&gt; (or &lt;code class=&quot;language-text&quot;&gt;window.EyeDropper&lt;/code&gt;) that you can use to set up a new eyedropper object:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; eyeDropper &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;EyeDropper&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This eyeDropper object has one function, &lt;code class=&quot;language-text&quot;&gt;eyeDropper.open()&lt;/code&gt;. This starts the color picker and changes the users cursor
into a color picker, complete with magnified area and a highlighted pixel. This function returns a promise, so you can
use it either with &lt;code class=&quot;language-text&quot;&gt;await&lt;/code&gt; or as a promise.&lt;/p&gt;&lt;p&gt;One gotcha is that it only works when called from &lt;strong&gt;a user-initiated event&lt;/strong&gt;. This is part of the security model, to
prevent websites from potentially scraping pixels without the user knowing.&lt;/p&gt;&lt;h3 id=&quot;detecting-support-for-the-eyedropper-api&quot;&gt;Detecting support for the EyeDropper API&lt;/h3&gt;&lt;p&gt;Because the API is only available in Chromium you will need to check for support before using it. The most straightforward
way to do that is to only offer your color picking UI when &lt;code class=&quot;language-text&quot;&gt;window.EyeDropper&lt;/code&gt; is not undefined:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;EyeDropper&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Okay to use EyeDropper&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Hide the UI&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;await-based-version&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;await&lt;/code&gt; based version&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// won&amp;#x27;t work&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; eyeDropper&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// works&lt;/span&gt;
document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;queryselector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;.colorbutton&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;click&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; eyeDropper&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;eyeDropper.open()&lt;/code&gt; call will resolve in two situations:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The user clicks anywhere on the screen.&lt;/li&gt;&lt;li&gt;The user pressed the &lt;kbd&gt;Esc&lt;/kbd&gt; key.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;In the last situation the eyeDropper will throw an exception, but in the first situation you will get a &lt;code class=&quot;language-text&quot;&gt;ColorSelectionResult&lt;/code&gt;
object, which has an &lt;code class=&quot;language-text&quot;&gt;sRGBHex&lt;/code&gt; property containing the picked color in hexadecimal format. In your code you can check if
&lt;code class=&quot;language-text&quot;&gt;result.sRGBHex&lt;/code&gt; is defined and then do with it what you want.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;queryselector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;.colorbutton&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;click&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; eyeDropper&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sRGBHex&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sRGBHex&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You don&amp;#x27;t &lt;em&gt;have&lt;/em&gt; to handle the exception but if you wanted to provide the user feedback that they cancelled the eyedropper,
you need to add a &lt;code class=&quot;language-text&quot;&gt;try .. catch&lt;/code&gt; to the code:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;queryselector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;.colorbutton&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;click&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; eyeDropper&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sRGBHex&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sRGBHex&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// &amp;quot;DOMException: The user canceled the selection.&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;promise-based-version&quot;&gt;Promise based version&lt;/h3&gt;&lt;p&gt;You don&amp;#x27;t have to use the &lt;code class=&quot;language-text&quot;&gt;await&lt;/code&gt; version. &lt;code class=&quot;language-text&quot;&gt;eyeDropper.open()&lt;/code&gt; returns a promise, so adding a &lt;code class=&quot;language-text&quot;&gt;.then()&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;.catch()&lt;/code&gt; also works:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;queryselector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;.colorbutton&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;click&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    eyeDropper
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sRGBHex&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// &amp;quot;DOMException: The user canceled the selection.&amp;quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;things-to-keep-in-mind-when-using-the-eyedropper-api&quot;&gt;Things to keep in mind when using the EyeDropper API&lt;/h2&gt;&lt;p&gt;There are two gotchas with the API, at least as it&amp;#x27;s currently implemented in Chromium that we&amp;#x27;ve found that you should
be aware of.&lt;/p&gt;&lt;h3 id=&quot;color-picking-does-not-use-the-live-screen&quot;&gt;Color picking does not use the live screen&lt;/h3&gt;&lt;p&gt;At least in the current implementation, the color picker get the pixels as shown on the screen when you call &lt;code class=&quot;language-text&quot;&gt;.open()&lt;/code&gt;.
This means that if you&amp;#x27;re playing video the color picker will show the pixels of the frame that was visible then, not the
live video.&lt;/p&gt;&lt;p&gt;This is dependent on the implementation and we hope a future update of Chromium will allow for live data.&lt;/p&gt;&lt;h3 id=&quot;color-picking-only-works-as-the-result-of-a-user-action&quot;&gt;Color picking only works as the result of a user action&lt;/h3&gt;&lt;p&gt;As mentioned earlier you need a user initiated event to open the eye dropper. This is to prevent sites from opening the
eyedropper UI to start scraping your screen right on load. Instead the user needs to perform an action for the API to work,
like a click or keypress.&lt;/p&gt;&lt;h2 id=&quot;features-we-want-to-see-added&quot;&gt;Features we want to see added&lt;/h2&gt;&lt;p&gt;The EyeDropper API is still very young and minimal. During our implementation we encountered a number of features that we
would like to see added to the API in future updates.&lt;/p&gt;&lt;h3 id=&quot;live-preview-of-the-hovered-color&quot;&gt;Live preview of the hovered color&lt;/h3&gt;&lt;p&gt;A major component of many eye droppers, like those in design tools, is that they also show a preview swatch of the
hovered color. You can use this to compare it to another swatch or quickly check a HEX code. The current API does not
offer this over security concerns. We have filed an issue against the EyeDropper API on GitHub for this: &lt;a href=&quot;https://github.com/WICG/eyedropper-api/issues/6&quot;&gt;#6 Live feedback is needed&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&quot;a-more-extensive-color-model&quot;&gt;A more extensive color model&lt;/h3&gt;&lt;p&gt;Currently, all colors are returned in the sRGB color model. This means the API won&amp;#x27;t accurately return colors outside
the sRGB spectrum, for example those on Apple&amp;#x27;s P3 screens. How to deal with this is &lt;a href=&quot;https://github.com/WICG/eyedropper-api/issues/3&quot;&gt;an open issue&lt;/a&gt;.
Work is also happening on a &lt;a href=&quot;https://github.com/WICG/color-api&quot;&gt;new Color API for the web&lt;/a&gt;. The EyeDropper API could use
this Color API when it lands in future versions of browsers.&lt;/p&gt;&lt;h3 id=&quot;a-more-natural-way-to-select-multiple-colors&quot;&gt;A more natural way to select multiple colors&lt;/h3&gt;&lt;p&gt;Because of the current security model, each time a user picks a color they need to re-initiate a user action which can be tedious.
For example if you want to create a palette of colors in one go, you want to start picking colors, click on all the colors you
want to add and then close out of the eye dropper. We similarly filed an issue for this on Github: &lt;a href=&quot;https://github.com/WICG/eyedropper-api/issues/9&quot;&gt;#9 Do we expect multiselect to work?&lt;/a&gt; and this feature is currently being considered.&lt;/p&gt;&lt;p&gt;For this it would be nice if we could designate a part of the page (like a button) as an area where the EyeDropper
doesn&amp;#x27;t work, that instead functions as a &amp;quot;done&amp;quot; button. This way users can select multiple colors and then click that
button when they&amp;#x27;re done.&lt;/p&gt;&lt;h2 id=&quot;other-browsers&quot;&gt;Other browsers&lt;/h2&gt;&lt;p&gt;For now, the API is only available in Chromium based browsers from version 95 on and there has not been a signal from
Safari and Firefox yet. If you want those browsers to support the EyeDropper API as well, add your support to the open issues:
&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=1728527&quot;&gt;Issue #1728527 for Firefox&lt;/a&gt; and &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=229755&quot;&gt;Issue #229755 for Safari&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The EyeDropper API is a nice addition to the browser that we hope to see land in more browsers. We make good use of it
in Polypane and would like to see it be developed further.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 7]]></title><description><![CDATA[Polypane 7 adds a new color picker tool, support for pseudo-elements and pseudo-classes in the Elements panel, new Web Vitals data and…]]></description><link>https://polypane.app/blog/polypane-7/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-7/</guid><pubDate>Mon, 08 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 7 adds a new color picker tool, support for pseudo-elements and pseudo-classes in the Elements panel, new Web Vitals data and visualisations, an integration with Marker.io, new simulators, an update to Chromium 96 and much more.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;What&amp;#x27;s Polypane?&lt;/strong&gt; Polypane is a web browser for developers, designers and anyone that works on web projects. It shows
sites in multiple fully synced &lt;em&gt;panes&lt;/em&gt; and has tons of features that help with responsive design, accessibility and
overall site quality.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;new-color-picker-&quot;&gt;New color picker 🎯&lt;/h2&gt;&lt;p&gt;A proper, screen-wide color picker has been on our wishlist since 2016 and thanks to new APIs in Chromium we&amp;#x27;ve finally
been able to include it.&lt;/p&gt;&lt;img src=&quot;/doc-img/colorpicker/icon.png&quot; class=&quot;imgshadow&quot; alt=&quot;The Polypane address bar with the color picker icon highlighted.&quot;/&gt;&lt;p&gt;You can pick a color from anywhere on your screen by clicking the color picker icon in the address bar, or by pressing &lt;code class=&quot;language-text&quot;&gt;shift&lt;/code&gt; + &lt;code class=&quot;language-text&quot;&gt;alt&lt;/code&gt; + &lt;code class=&quot;language-text&quot;&gt;p&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;After you&amp;#x27;ve selected a color, we copy it to the clipboard and the picked colors overview opens (you can also open it by right-clicking the icon)
This is an overview of previously selected colors and accessibility info of your last two selected colors.&lt;/p&gt;&lt;p&gt;Checking text contrast is as easy as first selecting the background color and then the text color. We show these two colors in big swatches that you can also click to copy the color.&lt;/p&gt;&lt;img src=&quot;/doc-img/colorpicker/ui.png&quot; class=&quot;imgshadow&quot; alt=&quot;The Color Picker UI showing the selected colors and previously selected colors.&quot;/&gt;&lt;p&gt;Polypane shows color contrast info below it, and suggests an improved color when needed. We do the same for the 9 previously selected colors, and you can swap out any of those colors for the foreground or background colors so quickly compare the contrast ratio of any color pair.&lt;/p&gt;&lt;div style=&quot;position:relative;width:100%;padding-top:56.25%&quot;&gt;&lt;a id=&quot;video&quot; style=&quot;position:absolute;top:-100px&quot;&gt;&lt;/a&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/rldFPBecGIE?&amp;amp;autoplay=false&amp;amp;start=0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; style=&quot;position:absolute;top:0px;left:0px;width:100%;height:100%&quot; frameBorder=&quot;0&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;For a full overview check the &lt;a href=&quot;/docs/color-picker/&quot;&gt;color picker docs&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;elements-panel-updates-&quot;&gt;Elements panel updates 🔍&lt;/h2&gt;&lt;p&gt;The Elements panel is now more compact, so there is more place for the tabs that let you edit the styles, attributes etc.&lt;/p&gt;&lt;p&gt;The content editor now sizes to fit the text in it and has a button that lets you quickly copy the text to make it
easier to get that data back into your CMS or HTML after you&amp;#x27;re done editing it.&lt;/p&gt;&lt;h3 id=&quot;pseudo-elements-and-pseudo-classes&quot;&gt;Pseudo-elements and pseudo-classes&lt;/h3&gt;&lt;p&gt;The biggest change is that the Polypane elements panel now supports pseudo-elements like &lt;code class=&quot;language-text&quot;&gt;::before&lt;/code&gt;, and
pseudo-classes like &lt;code class=&quot;language-text&quot;&gt;:hover&lt;/code&gt; with &lt;strong&gt;full editing capability&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;This took a lot of work to get right, but having it makes it
much easier to edit more complex layouts.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-7/pseudos.png&quot; class=&quot;imgshadow&quot; alt=&quot;The Elements Panel with the ::before and ::after pseudo-elements highlighted in the tree view and the style tab.&quot;/&gt;&lt;p&gt;They are collapsed by default so they don&amp;#x27;t get in the way of editing the element itself, but toggle them open
and you can edit the pseudo-elements and classes across all your panels.&lt;/p&gt;&lt;p&gt;The style panel will also show associated &lt;code class=&quot;language-text&quot;&gt;@font-face&lt;/code&gt; and
&lt;code class=&quot;language-text&quot;&gt;@keyframe&lt;/code&gt; styles that you can edit too. Find them at the bottom of the style panel.&lt;/p&gt;&lt;h3 id=&quot;new-color-chooser-&quot;&gt;New Color chooser 🎨&lt;/h3&gt;&lt;p&gt;With the release of our new color picker we decided to also revise the color picker in the Elements panel and give it a
much needed upgrade.&lt;/p&gt;&lt;p&gt;The new color chooser is more performant, lets you pick colors from anywhere on the screen, makes it easier to switch between notations,
shows tints and shades for your selected color so you can easily go darker or lighter, and also has handy access to the
last picked colors from the color picker.&lt;/p&gt;&lt;p&gt;And it also comes in dark mode.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-7/colorpicker.png&quot; style=&quot;margin:auto;max-width:100%;display:block&quot; alt=&quot;The new Color picker in light and dark mode side by side.&quot;/&gt;&lt;h2 id=&quot;web-vitals-field-data-and-visualizations-&quot;&gt;Web Vitals Field data and Visualizations 💓&lt;/h2&gt;&lt;p&gt;The Web Vitals overlay now shows CrUX Field data when available, so you can compare your experience to real world
usage and also see how well your pages do overall.&lt;/p&gt;&lt;img src=&quot;/doc-img/webvitals.png&quot; class=&quot;imgshadow&quot; alt=&quot;The Web Vitals tooltip showing the different scores. First input delay is orange, because it scored &amp;#x27;needs improvement&amp;#x27;.&quot;/&gt;&lt;p&gt;The overlay switches between the mobile CrUX data and desktop CrUX data depending on the size of a pane, matching the way
CrUX field data make the distinction. This way you always compare to the right data.&lt;/p&gt;&lt;p&gt;Knowing how well your pages do in the wild and how your current experience compares to them is useful, but one thing we
always try to do with Polypane is help with the next step: &lt;strong&gt;if you have a bad score, how do you fix it?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The new visualizations for the Cumulative Layout Shift and highlight of the Largest Contentful Paint element can be
turned on from the Web Vitals tooltip and instantly tell you which elements you should improve.&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-7/cls-demo.mp4&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;Visualisation of the Cumulative Layout Shift on the Polypane getting started page.&lt;/video&gt;&lt;h2 id=&quot;markerio-integration-🧩&quot;&gt;Marker.io integration 🧩&lt;/h2&gt;&lt;p&gt;We&amp;#x27;re pretty excited to now have integrated support for &lt;a href=&quot;https://marker.io/?utm_source=polypane&quot;&gt;Marker.io&lt;/a&gt;! We worked together with the
Marker.io team to make this a first-class integration.&lt;/p&gt;&lt;p&gt;With Marker.io you can screenshot and annotate parts of the page and send them to whatever project management you use,
like Jira or Asana, to Slack or you can even have it emailed to you.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-7/markerio.png&quot; class=&quot;imgshadow&quot; alt=&quot;Marker.io running in Polypane.&quot;/&gt;&lt;p&gt;Marker.io is extremely helpful for anyone doing testing and QA, and we&amp;#x27;ve had many requests for this integration specifically
so we&amp;#x27;re very excited about it. Learn more over on the &lt;a href=&quot;/integrations/markerio/&quot;&gt;Marker.io integration page&lt;/a&gt;. The
integrations we offer in Polypane are growing with every release, so we&amp;#x27;ve made a dedicated &lt;a href=&quot;/integrations/&quot;&gt;integrations&lt;/a&gt; page
where you can find an overview.&lt;/p&gt;&lt;h3 id=&quot;discount-for-markerio&quot;&gt;Discount for Marker.io&lt;/h3&gt;&lt;p&gt;The folks at Marker.io have been kind enough &lt;strong&gt;to offer a 10% discount to Polypane users!&lt;/strong&gt; Find your discount code by on
the new &lt;a href=&quot;https://dashboard.polypane.app/deals&quot;&gt;deals page in the dashboard&lt;/a&gt;!&lt;/p&gt;&lt;h2 id=&quot;horizontal-overflow-detection-️&quot;&gt;Horizontal overflow detection 🖱️&lt;/h2&gt;&lt;p&gt;Polypane has had &lt;a href=&quot;/docs/layout-debugging/&quot;&gt;tools to help with horizontal overflow&lt;/a&gt;, but one thing that was missing was
pro-active notification of overflow issues. In Polypane 7 we&amp;#x27;ve added just that. When Polypane detects horizontal overflow
issues in a pane it will show a new icon below it:&lt;/p&gt;&lt;img src=&quot;/doc-img/horizoverflow.png&quot; class=&quot;imgshadow&quot; alt=&quot;An icon and popup warning showing a horizontal overflow issue.&quot;/&gt;&lt;p&gt;When you click on the icon layout debugging for that pane turns on, so you can quickly find the overflow-causing elements
highlighted in red.&lt;/p&gt;&lt;p&gt;Not only that, it will also detect when you&amp;#x27;re using &lt;code class=&quot;language-text&quot;&gt;width: 100vw&lt;/code&gt;, a common cause of scroll bars on computers without
overlay scrollbars (which is: computers without macOS).&lt;/p&gt;&lt;img src=&quot;/doc-img/horizontalscroll.png&quot; class=&quot;imgshadow&quot; alt=&quot;An icon and popup warning showing a 100vw width detected.&quot;/&gt;&lt;p&gt;Clicking the icon will open the elements panel with the &lt;code class=&quot;language-text&quot;&gt;width: 100vw&lt;/code&gt; element so you can test changing it there.
Changing it to &lt;code class=&quot;language-text&quot;&gt;100%&lt;/code&gt; will often yield the same design on Mac while fixing the horizontal overflow issue elsewhere.&lt;/p&gt;&lt;p&gt;Read more about overflow issues in our article &lt;a href=&quot;/blog/strategies-for-dealing-with-horizontal-overflows/&quot;&gt;dealing with horizontal overflows&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;polypane-share-&quot;&gt;Polypane Share 🔗&lt;/h2&gt;&lt;p&gt;We recently introduced &lt;a href=&quot;/docs/link/&quot;&gt;Polypane Links&lt;/a&gt;, an easy way to share links that open in Polypane directly along
with a set of panes. Try them out in our article &lt;a href=&quot;/blog/css-breakpoints-used-by-popular-css-frameworks/&quot;&gt;CSS breakpoints used by popular CSS frameworks&lt;/a&gt;!&lt;/p&gt;&lt;p&gt;Polypane Share makes it easy to create these links from inside Polypane, either as a QR code or copyable URL.
This makes sharing URLs with your team using the right viewports to check really easy.&lt;/p&gt;&lt;p&gt;Polypane share is available when hovering over the address bar and clicking on the QR code icon on the right.&lt;/p&gt;&lt;p&gt;For situations where the &lt;code class=&quot;language-text&quot;&gt;polypane://&lt;/code&gt; protocol is not accepted, we also introduce websafe links. These link to a page
on polypane.app, and that page then opens Polypane with your URL and panes.&lt;/p&gt;&lt;img src=&quot;/doc-img/share-qr-polypane.png&quot; class=&quot;imgshadow&quot; alt=&quot;The Polypane Share popup is open and showing a QR code.&quot;/&gt;&lt;h3 id=&quot;regular-qr-codes&quot;&gt;Regular QR codes&lt;/h3&gt;&lt;p&gt;You can also switch to regular QRs so you can easily open URLs on your devices to test
on them (because testing on real devices is
still important, even with Polypane!)&lt;/p&gt;&lt;p&gt;Polypane will automatically detect when &lt;strong&gt;you&amp;#x27;re working on localhost and replace that
with your IP address so devices on your network can open the URL&lt;/strong&gt;.&lt;/p&gt;&lt;img src=&quot;/doc-img/share-qr-regular.png&quot; class=&quot;imgshadow&quot; alt=&quot;The Share popup is open and showing a QR code.&quot;/&gt;&lt;h2 id=&quot;new--updated-debug-tools-and-simulators-️🗨️&quot;&gt;New &amp;amp; updated debug tools and simulators 👁️‍🗨️&lt;/h2&gt;&lt;p&gt;The list of built-in debug tools and simulators in Polypane is always growing.
This release adds two new debug tools, two updated simulators and one new simulator. The total is now 37!&lt;/p&gt;&lt;h3 id=&quot;interactive-glaucoma-simulator&quot;&gt;Interactive Glaucoma simulator&lt;/h3&gt;&lt;p&gt;After implementing the Tunnel Vision simulator, an impairment often associated with
Glaucoma (very severe glaucoma causes tunnel vision) we researched what a fully interactive glaucoma visualization should
look like.&lt;/p&gt;&lt;p&gt;There are many different visualization available, as there is not one right answer to the question &amp;quot;what does someone with glaucoma see?&amp;quot;,
but we&amp;#x27;re very happy with what we think is &lt;strong&gt;the first fully interactive Glaucoma visualization for web content:&lt;/strong&gt;&lt;/p&gt;&lt;video src=&quot;/doc-img/overlays/glaucoma.mp4&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;Glaucoma debug tool overlaid on the Polypane website&lt;/video&gt;&lt;h3 id=&quot;macular-degeneration-simulator&quot;&gt;Macular degeneration simulator&lt;/h3&gt;&lt;p&gt;Macular degeneration is kind of the opposite of tunnel vision: instead of losing your peripheral vision, you lose your
central version.&lt;/p&gt;&lt;img src=&quot;/doc-img/overlays/macular.png&quot; class=&quot;imgshadow&quot; alt=&quot;The Macular degeneration simulator.&quot;/&gt;&lt;h3 id=&quot;updated-cataracts-simulator&quot;&gt;Updated Cataracts simulator&lt;/h3&gt;&lt;p&gt;During our research into Glaucoma we also took a critical look at our existing cataracts simulation and determined that
it was not doing enough. Here too we looked at the available research into what cataracts is really like to bring the
simulator closer to reality.&lt;/p&gt;&lt;img src=&quot;/doc-img/overlays/cataracts.png&quot; class=&quot;imgshadow&quot; alt=&quot;The improved Cataracts simulator.&quot;/&gt;&lt;h3 id=&quot;detect-small-text-&quot;&gt;Detect small text 🔬&lt;/h3&gt;&lt;p&gt;Use this to find instances where your text is so small that it causes issues. This debug tool will flag regular text
that&amp;#x27;s smaller than 12px, and form elements that are smaller than 16px. The latter causes iOS to zoom in on your page when
focusing a form element, which can look bad and can be confusing to your visitor.&lt;/p&gt;&lt;img src=&quot;/doc-img/overlays/smalltext.png&quot; class=&quot;imgshadow&quot; alt=&quot;A warning pointing to an element with small text.&quot;/&gt;&lt;h3 id=&quot;text-spacing-wcag-1412&quot;&gt;Text Spacing (WCAG 1.4.12)&lt;/h3&gt;&lt;p&gt;This debug tool applies the minimum text spacing requirements from the WCAG criterion 1.4.12. Use this to check if any content is lost with these extra settings. Head over to our &lt;a href=&quot;/docs/debug-tools/#text-spacing-wcag-1412&quot;&gt;debug tool docs&lt;/a&gt; for a list of specific text spacing changes.&lt;/p&gt;&lt;img src=&quot;/doc-img/overlays/forcespacing.png&quot; class=&quot;imgshadow&quot; alt=&quot;The Polypane homepage with expanded text spacing. Some elements are no longer fully readable.&quot;/&gt;&lt;p&gt;&lt;em&gt;As you see, we have some work to do for this&lt;/em&gt; 😉&lt;/p&gt;&lt;h2 id=&quot;chromium-96&quot;&gt;Chromium 96&lt;/h2&gt;&lt;p&gt;Polypane is now running the beta version of Chromium 96. That means you can now use the following features in Polypane:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;prefers-contrast&lt;/code&gt; emulation, find it in the emulation popover.&lt;/li&gt;&lt;li&gt;Eyedropper API, which powers our color picker!&lt;/li&gt;&lt;li&gt;URLPattern&lt;/li&gt;&lt;li&gt;Container queries (was already available in Polypane 6.x)&lt;/li&gt;&lt;li&gt;Scrollbar gutter&lt;/li&gt;&lt;li&gt;accent-color (was already available in Polypane 6.x)&lt;/li&gt;&lt;li&gt;crypto.randomUUID()&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;other-new-features-&quot;&gt;Other new features 📜&lt;/h2&gt;&lt;p&gt;The number of new features in Polypane 7 is pretty big, here are some smaller features. Be sure to scroll through the
full changelog for everything new. The &lt;a href=&quot;/docs/&quot;&gt;documentation&lt;/a&gt; for all features is fully up to date.&lt;/p&gt;&lt;h3 id=&quot;new-and-updated-device-presets-&quot;&gt;New and updated device presets 📱&lt;/h3&gt;&lt;p&gt;With the release of iOS15 and the bottom-aligned address bar, the viewport sizes of iOS devices in portrait mode changed
slightly. So all our iOS devices are updated to support the new sizes.&lt;/p&gt;&lt;p&gt;New Samsung mobile phones and tablets are also added to our list of device presets, with both the viewport sizes and
device sizes for portrait and landscape. If you&amp;#x27;re missing a device or screen size, let us know!&lt;/p&gt;&lt;h3 id=&quot;mute-audio-option-&quot;&gt;Mute audio option 🔇&lt;/h3&gt;&lt;p&gt;You can now mute audio for all panes, or for all but the first pane in the global settings. This should help when you&amp;#x27;re
working on sites with audio! You can find this in the global settings menu&lt;/p&gt;&lt;h3 id=&quot;updated-social-media-previews-️&quot;&gt;Updated social media previews 🖼️&lt;/h3&gt;&lt;p&gt;Between Polypane 6.3 and Polypane 7, LinkedIn, Telegram for Web and Google all introduced dark modes! So we&amp;#x27;ve updated our
designs with support as well. Now all social media previews that Polypane shows support both light and dark mode.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-7/linkedin-dark.png&quot; class=&quot;imgshadow&quot; alt=&quot;LinkedIn dark mode preview.&quot;/&gt;&lt;img src=&quot;/blogs/polypane-7/google-dark.png&quot; class=&quot;imgshadow&quot; alt=&quot;Google dark mode preview.&quot;/&gt;&lt;h3 id=&quot;improved-accessibility-testing-and-reporting&quot;&gt;Improved accessibility testing and reporting&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;The landmark outline&lt;/strong&gt; overview has new tests. The overview now warns about multiple navigation landmarks
that don&amp;#x27;t have unique labels and about labels that includes the name of the landmark, causing screen readers to repeat themselves.&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;Focus order&lt;/strong&gt; overview now hightlights elements that don&amp;#x27;t follow the reading direction of the page, which can be
confusing for people using the keyboard to navigate your page. These items will be highlighted both in the list and in
the focus order overlay on your page.&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;images&lt;/strong&gt; outline is now more performant and does a better job of parsing the different image properties. It will
also now warn you about the use of color words in your description, as this can be inaccessible to some visitors.&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;Link&lt;/strong&gt; outline now shows ARIA links as well, though that will also get you a warning to use a real link instead.
Resolving relative links has also been improved, so link checking is now more reliable.&lt;/p&gt;&lt;h3 id=&quot;reference-image-offsets&quot;&gt;Reference image offsets&lt;/h3&gt;&lt;p&gt;The &lt;a href=&quot;/docs/reference-image/&quot;&gt;reference image&lt;/a&gt; feature lets you overlay an image on top of your web page so you can check
for visual regressions or design adherence.&lt;/p&gt;&lt;p&gt;You can now add a horizontal and vertical offset to the image to position it correctly.&lt;/p&gt;&lt;h2 id=&quot;get-polypane-7&quot;&gt;Get Polypane 7&lt;/h2&gt;&lt;p&gt;Polypane is available for Windows, Mac (universal dmg for Intel and M1) and Linux (.deb or AppImage).&lt;/p&gt;&lt;p&gt;Polypane automatically updates on Mac and Windows and on Linux when using the AppImage. Otherwise, head over to
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; to download the latest version!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Try it for free&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;polypane-701-changelog&quot;&gt;Polypane 7.0.1 Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Marker.io flow now returns to button instead of capture flow&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Scrollbars are now easier to click&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Pane close buttons now appears on focus too&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: links with the text &amp;quot;learn more&amp;quot; are now flagged&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: images with the filename as alt text are now flagged&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated list of google fonts&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated version of Chromium 96&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated list of accessibility rulesets&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Faster initial pane load time&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Prevents false positive virus warnings for the installer on Windows (Thanks Dave!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Better error handling inside Polypane with options to reload or reset data&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Crash related to long URLs&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Crash related to grid overlay (Thanks Sebastian!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Error message for Nextjs users (Thanks Alex!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; On some Linux systems settings were saved in the wrong directory&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Updating on M1 sometimes updated to Intel version&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;full-700-changelog&quot;&gt;Full 7.0.0 Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;New features&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Eye dropper color picker&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Support for pseudo-element, pseudo-classes, keyframe and font-face in Elements panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Web vitals pop-ups show CrUX field data&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Polypane Links integration&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Horizontal overflow detection&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; CLS and LCP overlays&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Marker.io integration&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Update to Chromium 96&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Prefers-contrast emulation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Samsung android phones and tablet device presets&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Mute options for panes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Dark modes for Google Search, LinkedIn and Telegram previews&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Small font size checker debug tool&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Force text spacing debug tool&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Interactive glaucoma simulator&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Macular degeneration simulator&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; New Google fonts&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; &amp;quot;Pane zoom&amp;quot; is now renamed to &amp;quot;Scale&amp;quot;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated viewports for iOS15&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; New Ultrawide device preset (Thanks Patrick!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; HTML Validation rules&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Live Reload now shows optional notifications&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Live Reload supports reloading multiple CSS files with the same name (Thanks Alex!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel supports new individual transform options&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel navigator design is clearer&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel specificity notation now uses commas (Thanks Bramus!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel specificity links to explainer page for each selector&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel has new color picker with recently selected colors, tints and eye dropper&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel content editor now auto-sizes and has a copy button&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel now warns about similar landmarks without unique title&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel now warns if landmark label includes the role&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel now shows elements with role=link in link overview (and shows a warning)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel Focus order now warns when focus order goes against reading direction.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel update image overview design&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel images are now lazy loaded&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel images now warns about colors in alt text&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel list of icons shows dimensions and type of icon&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Reference image can now be offset from the site (Thanks Roni!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Live CSS variable font loading for complex multi-axis fonts improved&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated Cataracts simulator&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Legacy mode is now deprecated, will be removed in Polypane 9&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Remove &amp;quot;new random pane size&amp;quot; menu item (Thanks Martin!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Dark mode is now correctly restored on Windows (Thanks Thomas!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Live Reload preserves all search params when injecting CSS and Images&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Scrolling in number inputs no longer scrolls the main workspace&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Menus that open dialogs now have ellipsis added to them&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Touch emulation now also sets the hover:none media query (Thanks Thomas!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Detached devtools no longer close and reopen when inspecting an element (Thanks Jason!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Double clicking to fill height now takes global zoom into account&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Polypane Peek tooltip now positioned correctly for elements left offscreen (Thanks Matthias!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Reset URL when it&amp;#x27;s invalid on launch (Thanks Markus!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Preserve search parameters when loading URLs from browser extensions&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Support backticks in Live CSS panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent applying breakpoint panes when there are no breakpoints (Thanks Jens Olaf!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; CSS Breakpoint detection no longer needs initial user input to work (Thanks Jens Olaf!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Alignment issues in select elements in Panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Position of quality bar in Full layout&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Outline panel Links checker now only matches the word &amp;quot;more&amp;quot; for check of unclear link text.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Outline panel relative URLs are now resolved and checked correctly&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[How TeliportMe is moving to the web with Polypane]]></title><description><![CDATA[We interviewed Vineet Devaiah, the CEO of TeliportMe on their move to the web and how Polypane is helping them do this. Hey Vineet, so good…]]></description><link>https://polypane.app/blog/how-teliport-me-is-moving-to-the-web-with-polypane/</link><guid isPermaLink="false">https://polypane.app/blog/how-teliport-me-is-moving-to-the-web-with-polypane/</guid><pubDate>Mon, 11 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;We interviewed Vineet Devaiah, the CEO of TeliportMe on their move to the web and how Polypane is helping them do this.&lt;/em&gt;&lt;/p&gt;&lt;h3 id=&quot;hey-vineet-so-good-to-talk-to-you-can-you-introduce-us-to-teliportme&quot;&gt;Hey Vineet, so good to talk to you! Can you introduce us to &lt;a href=&quot;https://teliportme.com/&quot;&gt;TeliportMe&lt;/a&gt;?&lt;/h3&gt;&lt;p&gt;Yeah, Teliportme is the world&amp;#x27;s largest online virtual tour and 360 panorama sharing website. People can create virtual tours and see other virtual tours easily and intuitively using our interface.&lt;/p&gt;&lt;p&gt;We have six and a half million registered users, about fifteen million app downloads and millions of visits to our website each month. For the last four years we have been building the B2B side of our company, helping businesses create virtual tours and 360 panoramas of their locations. That&amp;#x27;s been scaling really well.&lt;/p&gt;&lt;div style=&quot;position:relative;width:100%;padding-top:56.25%;border-radius:4px;overflow:hidden;box-shadow:rgba(20, 40, 50, 0.05) 0px 4px 4px, rgba(20, 40, 50, 0.05) 0px 1px 10px, rgba(20, 40, 50, 0.08) 0px 20px 30px&quot;&gt;&lt;a id=&quot;video&quot; style=&quot;position:absolute;top:-100px&quot;&gt;&lt;/a&gt;&lt;iframe src=&quot;https://teliportme.com/embed/tour/67cefa05-7848-4d9b-a7bb-d7357df06f9c&quot; frameBorder=&quot;0&quot; scrolling=&quot;no&quot; allowfullscreen=&quot;&quot; style=&quot;position:absolute;top:0px;left:0px;width:100%;height:100%&quot; allow=&quot;vr,gyroscope,accelerometer,fullscreen&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;A live demo of Teliportme&amp;#x27;s software.&lt;/em&gt;&lt;/p&gt;&lt;h3 id=&quot;very-cool-how-did-teliportme-get-started&quot;&gt;Very cool! How did TeliportMe get started?&lt;/h3&gt;&lt;p&gt;Back in 2011 me and my cofounder Abhinav Asthana, now the cofounder of Postman, had this vision for building a crowdsourced street view. We had the idea that augmented reality is going to be the future and people are going to be wearing AR glasses. We were one of the first companies to develop an app for Google Glass back in the day, so we were very geeky in that sense. Still, that was the vision! We wanted to make sure everyone could own their own street view style virtual tours.&lt;/p&gt;&lt;h3 id=&quot;teliportme-started-as-just-an-app-right-what-made-you-move-to-the-web&quot;&gt;TeliportMe started as just an app right? What made you move to the web?&lt;/h3&gt;&lt;p&gt;I&amp;#x27;ve been a programmer for a while now and probably have built hundreds of websites in my time but TeliportMe was very much a mobile first app. We were very strict about not building out any features on the web.&lt;/p&gt;&lt;p&gt;We thought, if we start building features on the web then people will start asking for even more things on the web and then we&amp;#x27;re losing focus. So for the longest time we put a hundred percent of our focus on the mobile app. So for our app around 2014, we didn&amp;#x27;t even have a login on the web, just a landing page with a &amp;quot;download app&amp;quot; link. Then around 2016 we built the first basic version of our web site where you could log in and see some of your stuff. When we decided to do that, we needed to build a proper user interface, administration UI and all that jazz.&lt;/p&gt;&lt;p&gt;We&amp;#x27;re good at programming so we banged that out in two, three months, but the design was very functional. We used Tachyons so everything was fast and we had all the components, so we didn&amp;#x27;t have to worry about the design too much.&lt;/p&gt;&lt;p&gt;Then our customer base grew and changed to larger businesses and our vision of what we wanted started to change. And we needed to change the website&lt;/p&gt;&lt;img alt=&quot;overview of Teliportme&amp;#x27;s feature page&quot; src=&quot;/blogs/casestudy-teliportme/site.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;h3 id=&quot;what-did-you-want-to-change&quot;&gt;What did you want to change?&lt;/h3&gt;&lt;p&gt;There were a few things. Firstly we built our initial site in React since that&amp;#x27;s what we knew and we didn&amp;#x27;t care about SEO. But that meant that the site was not properly indexable. That was fine when we didn&amp;#x27;t care about the site but now we wanted our site to be better indexable and more of a better looking marketing site too.&lt;/p&gt;&lt;p&gt;So this was really the first time we cared about the design, because it just hadn&amp;#x27;t been necessary even with millions of people visiting the website, since they were all going to the mobile app. But the website was becoming more important, so we started working on it properly&lt;/p&gt;&lt;h3 id=&quot;how-did-you-end-up-using-polypane-for-this-project&quot;&gt;How did you end up using Polypane for this project?&lt;/h3&gt;&lt;p&gt;I was in the middle of designing the new website and during the pandemic we had a dramatic change in our company structure where we went from mostly full time people to mostly contractors. Working with contractors is great but you also have to be more specific about what you want to do.&lt;/p&gt;&lt;p&gt;So I was using a browser to manually check sizes, make screenshots and then send those over to the contractors to show what should be changed and where. It was a very time intensive process.&lt;/p&gt;&lt;img alt=&quot;Teliportme&amp;#x27;s home page&quot; src=&quot;/blogs/casestudy-teliportme/fullpage.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto 2rem 2rem;display:block;max-width:33%;float:right&quot;/&gt;&lt;p&gt;Then I found Polypane and I was like &amp;quot;Oh, this is a cool idea&amp;quot; so I tried it and it really improved my workflow very fast. It obviously helped me look at different resolutions, but also with the fact that I wanted to be very specific about communicating issues I found and not wanting to waste too much time doing that.&lt;/p&gt;&lt;p&gt;What I really like is that Polypane is really smartly designed, the way you have figured out how to integrate it within a workflow and how easily you can use it. From a product perspective, it&amp;#x27;s really solidly designed.&lt;/p&gt;&lt;h3 id=&quot;what-results-did-you-see-with-polypane&quot;&gt;What results did you see with Polypane?&lt;/h3&gt;&lt;p&gt;I do a lot of things other than design so context switching and then checking the design, making screenshots, sending feedback et cetera cost me a lot of time. But with Polypane that was super easy, since you can just load the url, see the different sizes and everything you do is synced.&lt;/p&gt;&lt;p&gt;Because of that there&amp;#x27;s way less context switching. Polypane really helps there because it&amp;#x27;s so easy to get to the overview: open the link in Polypane and you can see what it looks like in like five different browsers, so that in itself is a huge time saver. I&amp;#x27;d say Polypane saved me an hour for each feedback session we had.&lt;/p&gt;&lt;h3 id=&quot;whats-next-for-teliportme&quot;&gt;What&amp;#x27;s next for TeliportMe?&lt;/h3&gt;&lt;p&gt;Things are going well. We&amp;#x27;re a ten year old company and we&amp;#x27;ve been through a lot of ups and downs, so we&amp;#x27;re cautious about being optimistic, but the product is progressing and the customers are coming in.&lt;/p&gt;&lt;p&gt;Before our move to the web, users were a lot more fleeting. They would download the app and then use it or not, you don&amp;#x27;t have a lot of control over that. But on the web the feedback cycles are a little bit longer, and people spend more time with your product and they can reach out if they have support questions. So we really see there&amp;#x27;s more momentum there. We&amp;#x27;ve been doing this for ten years and now it&amp;#x27;s time for us to move to the web. We&amp;#x27;re definitely betting on the web now!&lt;/p&gt;&lt;p&gt;For the future we&amp;#x27;ll keep improving our value proposition, help people with repeated use and become more of a service provider and find partners and agencies that can use our software for their clients.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Thanks Vineet for this interview! I&amp;#x27;d urge every web agency to have a look at &lt;a href=&quot;https://teliportme.com/&quot;&gt;TeliportMe&lt;/a&gt; since it can be a great addition to your service offering!&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 6.3: Tunnel vision simulator, webmanifest support, updated UI]]></title><description><![CDATA[In Polypane 6.3 we added new debug tools and improved the meta panel and outline panel. And we moved the reload button. What's Polypane…]]></description><link>https://polypane.app/blog/polypane-6-3-tunnel-vision-simulator-webmanifest-support-updated-ui/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-6-3-tunnel-vision-simulator-webmanifest-support-updated-ui/</guid><pubDate>Thu, 05 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In Polypane 6.3 we added new debug tools and improved the meta panel and outline panel. And we moved the reload button.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;What&amp;#x27;s Polypane?&lt;/strong&gt; Polypane is a web browser for developers, designers and anyone that works on web projects. It shows sites in multiple fully synced &lt;em&gt;panes&lt;/em&gt; and has tons of features that help with responsive design, accessibility and overall site quality.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;tunnel-vision-simulator&quot;&gt;Tunnel vision simulator&lt;/h2&gt;&lt;p&gt;The new tunnel vision simulator will let you experience websites as if you had tunnel vision, with the mouse cursor position
acting as your focus. Everything apart from a small area in the center of your vision will be obscured while the page itself
remains fully interactive.&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-6-3/tunnelvision-site.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;Tunnel vision debug tool overlaid on the Polypane website&lt;/video&gt;&lt;p&gt;Tunnel vision can be caused by various diseases like glaucoma or pituitary tumors but also as a result of temporary impairments like alcohol consumption, migraines
drugs, panic attacks, altitude sickness or poisoning, or even situational impairments like wearing safety goggles or helmets.&lt;/p&gt;&lt;p&gt;With such a wide range of causes, your site will certainly be used by people with tunnel vision (though we haven&amp;#x27;t been
able to finds specific numbers on how common it is), so it&amp;#x27;s important that information can be found even when you can&amp;#x27;t
see the entire page, and that related information is close to each other.&lt;/p&gt;&lt;h2 id=&quot;target-size-cursor-debug-tool&quot;&gt;Target size cursor debug tool&lt;/h2&gt;&lt;p&gt;To make sure all the elements on your site are easily clickable or touchable, they should be at least 44 by 44 pixels and
that area should not overlap with other clickable elements. The target size cursor debug tool replaces your cursor with a 44 by 44 pixel square so you
can hover over elements and check if they have enough space around them.&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-6-3/targetsize.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;Target size cursor hovering over a number of different links showing they are far enough apart.&lt;/video&gt;&lt;img alt=&quot;webmanifest entries of the Polypane site&quot; src=&quot;/blogs/polypane-6-3/webmanifest.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem 0 2rem 1rem;display:block;max-width:33%;float:right&quot;/&gt;&lt;h2 id=&quot;web-manifest-support&quot;&gt;Web manifest support&lt;/h2&gt;&lt;p&gt;The &lt;a href=&quot;/docs/meta-information/&quot;&gt;Meta panel&lt;/a&gt; now shows the contents of a linked manifest file so you can easily verify its contents.
Any theme color specified by it is added to the list of theme colors.&lt;/p&gt;&lt;h2 id=&quot;the-reload-button-has-been-moved-&quot;&gt;The reload button has been moved 😱&lt;/h2&gt;&lt;p&gt;The reload button is now positioned to the left of the address bar, in the same location it&amp;#x27;s in Google Chrome. A lot
of users have requested this change because the reload button inside the address bar messes with their muscle memory.&lt;/p&gt;&lt;img alt=&quot;An arrow going from the old location of the reload button in the address bar to the new location next to the navigation arrows&quot; src=&quot;/blogs/polypane-6-3/reload.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;While we really liked the reload button in the address bar, it&amp;#x27;s more important to make the Polypane UI as easy to use
as possible and sometimes that involves making sure it aligns with other browsers.&lt;/p&gt;&lt;h2 id=&quot;outline-panel-improvements&quot;&gt;Outline panel improvements&lt;/h2&gt;&lt;p&gt;We&amp;#x27;ve continued to improve the &lt;a href=&quot;/docs/outline-panel/&quot;&gt;Outline panel&lt;/a&gt; by surfacing more info that helps you build better structures.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Links&lt;/strong&gt; now show a warning for non-descriptive text like &amp;quot;click here&amp;quot; or &amp;quot;more&amp;quot;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Images&lt;/strong&gt; show warnings for more variations of redundant text (like &amp;quot;a photo of&amp;quot;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Focus order&lt;/strong&gt; now also shows which element(s) have an autofocus attribute.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The &lt;a href=&quot;/docs/outline-panel/&quot;&gt;Outline panel&lt;/a&gt; already warns you about many other issues as well, like missing alt attributes, links that don&amp;#x27;t use
https, broken links, skipped heading levels and more. If you haven&amp;#x27;t opened it yet to inspect your pages, have a look!&lt;/p&gt;&lt;h2 id=&quot;other-changes&quot;&gt;Other changes&lt;/h2&gt;&lt;h3 id=&quot;social-media-rendering&quot;&gt;Social media rendering&lt;/h3&gt;&lt;p&gt;We&amp;#x27;ve updated the Discord and Slack previews to be in line with recent updates on those platforms (You need a keen eye
to spot the differences, but they&amp;#x27;re there!), and have improved the resolution of relative opengraph image urls for all
previews using them.&lt;/p&gt;&lt;h3 id=&quot;performance&quot;&gt;Performance&lt;/h3&gt;&lt;p&gt;We&amp;#x27;ve improved performance in a number of different areas of the application, most notably in opening and interacting with
the panel and the elements panel in particular.&lt;/p&gt;&lt;h3 id=&quot;better-scroll-syncing&quot;&gt;Better scroll syncing&lt;/h3&gt;&lt;p&gt;Starting in 6.3 Polypane detects when the &lt;code class=&quot;language-text&quot;&gt;body&lt;/code&gt; and not the &lt;code class=&quot;language-text&quot;&gt;html&lt;/code&gt; is the scroll container and uses that to sync the scroll position instead.
This also works for the full height screenshots.&lt;/p&gt;&lt;p&gt;We recommend avoiding giving the &lt;code class=&quot;language-text&quot;&gt;body&lt;/code&gt; element a fixed height so the browser can use the viewport as a scroll area for
slightly better performance. If your site uses the body element as a scroll container however, Polypane should now work better for you.&lt;/p&gt;&lt;h2 id=&quot;get-polypane-63&quot;&gt;Get Polypane 6.3&lt;/h2&gt;&lt;p&gt;Polypane is available for Windows, Mac (with versions for Intel and M1) and Linux (.deb or AppImage).&lt;/p&gt;&lt;p&gt;Polypane automatically updates on Mac and Windows. Linux users need to download the new version from
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt;. You can find the Mac and Windows versions on that page too.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Try it for free&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;full-changelog&quot;&gt;Full Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;New Features&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Tunnel vision simulator&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Target size cursor debug tool&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Reload button moved out of address bar&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Webmanifest info in Meta panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Support setting Polypane as default browser (Thanks Jared!)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel adds warning for non-descriptive links (Thanks Roel!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel adds warning for more redundant alt texts&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; More complex object rendering supported in Console&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Console log message rendering&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; More accurate Opengraph image link resolution&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Discord preview rendering (Thanks Charlie!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Slack preview rendering&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Support scroll sync on the body element as well (Thanks Galen!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: prevent warning for multiple theme colors&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: explain warning for theme colors in non-hex format&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated list of Google Fonts&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updates list of accessibility rules&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel focus order now shows elements with autofocus&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel performance&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Support SVG favicons in tabs&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Improve application of Glaucoma simulator&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Website notifications are now being shown&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where workspaces were not applied correctly (Thanks Galen!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent incorrect ruler grid sizes (Thanks Nick!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Highlighting not working on page load&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Twitter preview title cutoff&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Opengraph warning not detecting the og:image:alt attribute (Thank Charlie!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Mailto permission requests no longer block and open new tabs&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent redirection after accepting web notifications&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Peek stopped working in Legacy mode after first click&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Element panel shows text content for elements with single text node&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;polypane-631&quot;&gt;Polypane 6.3.1&lt;/h2&gt;&lt;p&gt;6.3.1 adds the ability to set custom ignore patterns for live reload, a custom font size for live CSS, updates the Twitter and Google previews and fixes a number of bugs.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;New Features&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Set custom ignore patterns for live reloading (Thanks Patrick!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Ability to set a custom font size in the Live CSS panel (Thanks Kevin!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Open &lt;code class=&quot;language-text&quot;&gt;polypane://&lt;/code&gt; links from inside Polypane&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Google preview rendering is now more accurate&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Twitter preview has been updated to the new Twitter design&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where Elements panel didn&amp;#x27;t display the correct specificity&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Inspector tooltip on mobile devices no longer causes the page to zoom out&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Hide &amp;#x27;redundant&amp;#x27; warnings when show warnings is unchecked.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Restore &amp;#x27;redundant&amp;#x27; image warning style&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where the panel menu would pop open without the rest of the panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where scrolling caused console errors to appear (Thanks Alex!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where &lt;code class=&quot;language-text&quot;&gt;vmin&lt;/code&gt; got replaces by &lt;code class=&quot;language-text&quot;&gt;in&lt;/code&gt; in Element style panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where the best practices checkbox got reset on new accessibility tests&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;polypane-632&quot;&gt;Polypane 6.3.2&lt;/h2&gt;&lt;p&gt;6.3.2 is a bugfix release with some dependency upgrades.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Show warning if Polypane is running under Rosetta on Mac&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Add new Google Fonts&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Update accessibility ruleset&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Live reload ignorepatterns expecting unix line endings (Thanks Patrick!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Toybox API key input was broken (Thanks Kave!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Situation where inlined background images were rewritten incorrectly (Thanks Todd!)&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Detecting media query support in CSS and JavaScript]]></title><description><![CDATA[Recently I needed a way to detect support for a media query in CSS and JavaScript. To detect if a browser supports a certain CSS feature…]]></description><link>https://polypane.app/blog/detecting-media-query-support-in-css-and-java-script/</link><guid isPermaLink="false">https://polypane.app/blog/detecting-media-query-support-in-css-and-java-script/</guid><pubDate>Mon, 19 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently I needed a way to detect support for a media query in CSS and JavaScript. To detect if a browser supports a certain CSS feature, you can use &lt;code class=&quot;language-text&quot;&gt;@supports () { ... }&lt;/code&gt;, but that doesn&amp;#x27;t work for media queries. In this article I&amp;#x27;ll show you how you can.&lt;/p&gt;&lt;h3 id=&quot;why-i-needed-this&quot;&gt;Why I needed this&lt;/h3&gt;&lt;p&gt;For &lt;a href=&quot;https://kilianvalkhof.com/2021/accessibility/increasing-access-to-your-website-with-prefers-reduced-data/&quot;&gt;a presentation I did on &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt;&lt;/a&gt; I wanted to apply something in one of two situations:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;There was no support for &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt; at all&lt;/li&gt;&lt;li&gt;There was support for &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt; and the value was &amp;quot;no-preference&amp;quot;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For this, I couldn&amp;#x27;t use just &lt;code class=&quot;language-text&quot;&gt;@media (prefers-reduced-data: no-preference)&lt;/code&gt; because that would be false if either there was no support (since the browser wouldn&amp;#x27;t understand the media query) or if it &lt;em&gt;was&lt;/em&gt; supported but the user wanted to preserve data.&lt;/p&gt;&lt;p&gt;What I needed was a test for the media feature regardless of it&amp;#x27;s value. To do that, we can use &lt;a href=&quot;https://polypane.app/blog/the-complete-guide-to-css-media-queries/#the-or-operator--a-comma&quot;&gt;the or notation&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&quot;detecting-media-query-support-in-css&quot;&gt;Detecting media query support in CSS&lt;/h3&gt;&lt;p&gt;To detect if a media query is supported in CSS at all, you can use the following CSS:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; all &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prefers-reduced-data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prefers-reduced-data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  ...&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That looks like a bit of weird, so lets dissect what it actually says. Firstly, let&amp;#x27;s split the two media features:&lt;/p&gt;&lt;h4 id=&quot;prefers-reduced-data&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;(prefers-reduced-data)&lt;/code&gt;&lt;/h4&gt;&lt;p&gt;This one looks straightforward but there&amp;#x27;s something weird: the media feature is missing a value! Usually, media features come with a value like &amp;quot;min-width: 400px&amp;quot;, but this one doesn&amp;#x27;t.&lt;/p&gt;&lt;p&gt;That&amp;#x27;s because media features have a &amp;quot;shorthand&amp;quot; when they only have two options and prefers-reduced-data does, it only has &amp;quot;no-preference&amp;quot; (off) and &amp;quot;reduce&amp;quot; (on). When you omit the value, it tests for it being on.&lt;/p&gt;&lt;p&gt;So here&amp;#x27;s how this will resolve:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;No preference: false&lt;/li&gt;&lt;li&gt;Reduce: true&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;But if the browser doesn&amp;#x27;t support a media feature, it will automatically interpret the media query as &amp;quot;not all&amp;quot;, which is always false, so we end with this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;No support: false&lt;/li&gt;&lt;li&gt;No preference: false&lt;/li&gt;&lt;li&gt;Reduce: true&lt;/li&gt;&lt;/ul&gt;&lt;h4 id=&quot;not-all-and-prefers-reduced-data&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;not all and (prefers-reduced-data)&lt;/code&gt;&lt;/h4&gt;&lt;p&gt;The notable thing here is &lt;code class=&quot;language-text&quot;&gt;not all and&lt;/code&gt;. &amp;quot;all&amp;quot; is the default media type, and it applies to both &lt;code class=&quot;language-text&quot;&gt;screen&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;print&lt;/code&gt;. You can omit it but if you add it you need to add &amp;quot;and&amp;quot; in between it and the media &lt;em&gt;feature&lt;/em&gt; (which is the part between parentheses).&lt;/p&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;not&lt;/code&gt; is how you can negate a media query. For example, &lt;code class=&quot;language-text&quot;&gt;@media not print {...}&lt;/code&gt; would apply everywhere except print.&lt;/p&gt;&lt;p&gt;It&amp;#x27;s worth noting that &lt;code class=&quot;language-text&quot;&gt;not&lt;/code&gt; applies to the entire media query, so we&amp;#x27;re really testing for `not (all and (prefers-reduced-data: reduce)).&lt;/p&gt;&lt;p&gt;With &lt;code class=&quot;language-text&quot;&gt;all&lt;/code&gt; being the default, what we&amp;#x27;re really checking here for is &amp;quot;not (prefers-reduced-data)&amp;quot; but that&amp;#x27;s invalid notation until supports for Media Queries level 4 lands. If you use &lt;code class=&quot;language-text&quot;&gt;not&lt;/code&gt;, for now you always need to add the media type as well.&lt;/p&gt;&lt;p&gt;Here&amp;#x27;s how this resolves:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;no support: still false, since the browser doesn&amp;#x27;t understand it&lt;/li&gt;&lt;li&gt;support but off: true (its the negation of it being on)&lt;/li&gt;&lt;li&gt;support but on: false&lt;/li&gt;&lt;/ul&gt;&lt;h4 id=&quot;combined&quot;&gt;Combined&lt;/h4&gt;&lt;p&gt;When a browser interprets the entire media query only one of them has to be true for the entire media query to apply. So lets see the results for these in all three situations: no support, support but off and support and on.&lt;/p&gt;&lt;div class=&quot;tablewrapper&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;No support&lt;/th&gt;&lt;th&gt;Support &amp;amp; off&lt;/th&gt;&lt;th&gt;Support &amp;amp; on&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;not all and (prefers-reduced-data)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code class=&quot;language-text&quot;&gt;(prefers-reduced-data)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Result&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;false&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;true&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;For &amp;quot;No support&amp;quot;, the browser does not understand either media query so it converts both to &lt;code&gt;not all&lt;/code&gt; and you end up with &amp;quot;false&amp;quot; for both. For the other two situations it&amp;#x27;s either going to be turned on or off but in both situations one of them is going to resolve to true. In that case, CSS in that media query block will now be applied if the feature is supported, regardless of what its value is.&lt;/p&gt;&lt;h3 id=&quot;detecting-media-query-support-in-javascript&quot;&gt;Detecting media query support in JavaScript&lt;/h3&gt;&lt;p&gt;We can use the same media query in JavaScript using the &lt;code class=&quot;language-text&quot;&gt;window.matchMedia&lt;/code&gt; API:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; isSupported &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;not all and (prefers-reduced-data), (prefers-reduced-data)&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matches&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;window.matchMedia returns an object with a &amp;quot;matches&amp;quot; boolean property that is either true or false. For more on the API, check out the &lt;a href=&quot;https://polypane.app/blog/the-complete-guide-to-css-media-queries/#using-media-queries-in-javascript&quot;&gt;using media queries in JavaScript&lt;/a&gt; section of my guide on media queries.&lt;/p&gt;&lt;p&gt;After I shared the above out on Twitter, &lt;a href=&quot;https://twitter.com/mathias/status/1412433744930258950&quot;&gt;Mathias pointed out a different method&lt;/a&gt;.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; query &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;(prefers-reduced-data)&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; resolvedMediaQuery &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;query&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;media&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; isSupported &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; query &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; resolvedMediaQuery&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;window.matchMedia&lt;/code&gt; API also returns a &amp;quot;media&amp;quot; property, which is the normalized and resolved string representation of the query you tested. If matchMedia encounters something it doesn&amp;#x27;t understand, that changed to &amp;quot;not all&amp;quot;, and if it does support the query it will return that, regardless of if it matches (you can use the matches property for that).&lt;/p&gt;&lt;p&gt;So by comparing your input to the media, you either get:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;No support&lt;/strong&gt;:
&amp;#x27;(prefers-reduced-data)&amp;#x27; === &amp;#x27;not all&amp;#x27; which is false.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Support&lt;/strong&gt;:
&amp;#x27;(prefers-reduced-data)&amp;#x27; === &amp;#x27;(prefers-reduced-data)&amp;#x27; which is true.&lt;/p&gt;&lt;h4 id=&quot;which-one-to-use&quot;&gt;Which one to use?&lt;/h4&gt;&lt;p&gt;What I like about the first option, with the complex media query, is that all the logic happens inside CSS. I also like how you get a boolean, and don&amp;#x27;t have to do string comparison.&lt;/p&gt;&lt;p&gt;The second can be a little bit easier to understand at a glance, but you need to make sure that your query input is the same as the browser normalizes it.&lt;/p&gt;&lt;p&gt;For example, if you test &lt;code class=&quot;language-text&quot;&gt;(prefers-reduced-data )&lt;/code&gt; (notice the space), that would resolve &amp;quot;matches&amp;quot; to true in supported browsers because the white space is not important, but comparing the normalized media query would return false, since that normalization has removed that extra space. So string comparison can be tricky depending on your input.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Edit: Thomas Steiner &lt;a href=&quot;https://twitter.com/tomayac/status/1418192170691989508&quot;&gt;pointed out&lt;/a&gt; you can check for &lt;code class=&quot;language-text&quot;&gt;&amp;#x27;resolvedMediaQuery&amp;#x27; !== &amp;#x27;not all&amp;#x27;&lt;/code&gt; instead to avoid the issue of normalization. Clever!&lt;/em&gt;&lt;/p&gt;&lt;h3 id=&quot;when-to-use-this&quot;&gt;When to use this?&lt;/h3&gt;&lt;p&gt;We&amp;#x27;re set to get &lt;a href=&quot;https://polypane.app/blog/the-complete-guide-to-css-media-queries/#upcoming-media-query-features&quot;&gt;a whole lot of new media features&lt;/a&gt; in the coming years, like &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;prefers-contrast&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;screen-spanning&lt;/code&gt; and more.&lt;/p&gt;&lt;p&gt;While transitioning to all browsers supporting this, you&amp;#x27;ll often want to turn on extra features for browsers that support it without causing issues in older browsers since the new default might not always be the best experience in older browsers. With this media feature you can split the behavior in older browsers without support for newer browsers with support.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href=&quot;https://kilianvalkhof.com/2021/web/detecting-media-query-support-in-css-and-javascript/&quot;&gt;Kilian&amp;#x27;s personal blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 6.2: HTML validation, robots.txt support, RTL emulation and more]]></title><description><![CDATA[In Polypane 6.2 we focused on improving the app performance and consistency, particularly around updating, pane resizing, tab handling and…]]></description><link>https://polypane.app/blog/polypane-6-2-html-validation-robots-txt-support-rtl-emulation-and-more/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-6-2-html-validation-robots-txt-support-rtl-emulation-and-more/</guid><pubDate>Wed, 14 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In Polypane 6.2 we focused on improving the app performance and consistency, particularly around updating, pane resizing, tab handling and dark mode.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;What&amp;#x27;s Polypane?&lt;/strong&gt; Polypane is a web browser for developers, designers and anyone that works on web projects. It shows sites in multiple fully synced &lt;em&gt;panes&lt;/em&gt; and has tons of features that help with responsive design, accessibility and overall site quality.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;We still added a fair few new features, including some that many of you have been requesting. Here&amp;#x27;s everything new in Polypane 6.2:&lt;/p&gt;&lt;h2 id=&quot;html-validation&quot;&gt;HTML validation&lt;/h2&gt;&lt;p&gt;The source panel in Polypane now automatically validates your HTML for you. A lot of you have been asking for this, and now it&amp;#x27;s here!&lt;/p&gt;&lt;p&gt;The HTML validation in Polypane is 100% local so you&amp;#x27;re not uploading your HTML source (potentially with user data!) to an online validator, and we check the generated source (which the source panel also displays) so you can check the HTML generated by frameworks as well.&lt;/p&gt;&lt;img alt=&quot;HTML validation of this page&quot; src=&quot;/blogs/polypane-6-2/htmlvalidation.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem 0;display:block;max-width:100%&quot;/&gt;&lt;p&gt;For any of the issues you can hover over the element to highlight the elements in all panes. The source panel itself will also scroll to the issue in the HTML and highlight it. Clicking the element takes you to the Elements panel so you can fix the issue.&lt;/p&gt;&lt;h2 id=&quot;toybox-systems-integration&quot;&gt;Toybox systems integration&lt;/h2&gt;&lt;p&gt;We&amp;#x27;ve been in contact with the folks that built &lt;a href=&quot;https://www.toyboxsystems.com/&quot;&gt;Toybox systems&lt;/a&gt; for a while now and a few months ago we set out to create an integration between Toybox Systems and Polypane. Today, we release it!&lt;/p&gt;&lt;p&gt;Toybox System is a bug reporting tool that makes it really easy to take a screenshot of a part of the page and then share a message with your team. The integration in Polypane lets you create screenshots, drop pins and leave comments and inspect everyone else&amp;#x27;s comments right inside a pane.&lt;/p&gt;&lt;img alt=&quot;Toybox Systems overview&quot; src=&quot;/blogs/polypane-6-2/toybox.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;We&amp;#x27;re very excited about this integration! It makes Polypane an even better tool for QA, since you find issues much faster with Polypane, and now report them super fast using Toybox Systems.&lt;/p&gt;&lt;p&gt;This is the first of a few integrations we plan on releasing. If there are other tools you&amp;#x27;d like to see integrated into Polypane, let us know!&lt;/p&gt;&lt;h2 id=&quot;robotstxt-support&quot;&gt;Robots.txt support&lt;/h2&gt;&lt;p&gt;The Meta panel now shows your site&amp;#x27;s robots.txt file, ordered by user agent. If you have a robots meta tag, we also show that here so you get the full overview.&lt;/p&gt;&lt;img alt=&quot;Robots.txt overview&quot; src=&quot;/blogs/polypane-6-2/robotstxt.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem 0 2rem 1rem;display:block;max-width:33%;float:right&quot;/&gt;&lt;p&gt;Polypane automatically checks if the current page is blocked for each user agent and if you have settings that aren&amp;#x27;t supported by that user-agent.&lt;/p&gt;&lt;p&gt;As with all other entries in the Meta panel, you can copy each Robots.txt declaration and we&amp;#x27;ll automatically format it correctly for you.&lt;/p&gt;&lt;h3 id=&quot;other-meta-panel-improvements&quot;&gt;Other meta panel improvements&lt;/h3&gt;&lt;p&gt;The social media previews in the Meta panel have always had support for the light and dark themes of different social media (provided they had one, looking at you LinkedIn) but you had to switch the theme of the entire browser to see them. We&amp;#x27;ve now added a toggle to the previews so you don&amp;#x27;t have to do that anymore.&lt;/p&gt;&lt;img alt=&quot;Toggle for social media previews&quot; src=&quot;/blogs/polypane-6-2/toggle.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;We&amp;#x27;ve also improved the accuracy of the Twitter, Facebook and Google previews.&lt;/p&gt;&lt;p&gt;Now that Safari 15 is going to support multiple theme colors, Polypane has been updated to show these in a list together with their media value. Clicking the color preview now copies the color.&lt;/p&gt;&lt;img alt=&quot;Robots.txt overview&quot; src=&quot;/blogs/polypane-6-2/themecolor.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;Lastly, we&amp;#x27;ve improved many of the checks and warnings in the Meta panel. We now warn about canonical urls that dont have the right format, viewports that limit the user, missing alt attributes and incorrect formatting for image URLs.&lt;/p&gt;&lt;h2 id=&quot;rtl-emulation&quot;&gt;RTL emulation&lt;/h2&gt;&lt;img alt=&quot;RTL emulation&quot; src=&quot;/blogs/polypane-6-2/rtl.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem 0 2rem 1rem;display:block;max-width:33%;float:right&quot;/&gt;&lt;p&gt;Most of the web is in English, a language that reads from left-to-right. But there are many languages that you read from right-to-left, like Arabic, Hebrew, Farsi and Urdu. Websites in these languages can be given an RTL (right-to-left) direction that tells the browser to render everything in that reading mode. It flips the text-alignment as well as moves the position of markers and other browser-native things.&lt;/p&gt;&lt;p&gt;For people developing bidirectional websites, switching between LTR and RTL often involved editing the source in devtools, updating a cookie or updating the code elsewhere. With the new RTL emulation in Polypane, doing this takes a single click.&lt;/p&gt;&lt;p&gt;Even if you don&amp;#x27;t create bidirectional websites, you can also use this to check if your logical properties are configured correctly. Properties like &lt;code class=&quot;language-text&quot;&gt;margin-inline-end&lt;/code&gt; will automatically flip from the right-side to the left-side when switching from LTR to RTL rendering.&lt;/p&gt;&lt;h2 id=&quot;message-bus&quot;&gt;Message bus&lt;/h2&gt;&lt;p&gt;As a result of our work on supporting Web Components we&amp;#x27;ve been working with a few beta testers to built a new system for developers to communicate between panes, the Polypane Message Bus.&lt;/p&gt;&lt;p&gt;With this message bus you can send and handle messages between panes, letting you implement your own syncing logic where Polypane can&amp;#x27;t, like for canvas-based websites (like games) or web components with a closed root.&lt;/p&gt;&lt;p&gt;The message bus is very lightweight while unlocking a whole new way for developers and QA to test their sites across viewports and emulated devices. We can&amp;#x27;t wait to see what you&amp;#x27;ll do with it!&lt;/p&gt;&lt;img alt=&quot;Polypane Message Bus examples&quot; src=&quot;/blogs/polypane-6-2/polybus.jpg&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;Check out the &lt;a href=&quot;/docs/message-bus/&quot;&gt;documentation on the Message Bus&lt;/a&gt; for the API specification.&lt;/p&gt;&lt;h2 id=&quot;other-features&quot;&gt;Other features&lt;/h2&gt;&lt;h3 id=&quot;rewritten-update-logic&quot;&gt;Rewritten update logic&lt;/h3&gt;&lt;p&gt;The updating logic in Polypane hasn&amp;#x27;t been touched in a fair few releases and had bugs that prevented some users from automatically updating. For 6.2 we completely rewrote our updating logic. If you experienced issues updating those should be gone from 6.2 onwards.&lt;/p&gt;&lt;h3 id=&quot;disable-csp-content-security-policy-headers&quot;&gt;Disable CSP (Content-security-policy) headers&lt;/h3&gt;&lt;p&gt;Polypane does not touch CSP headers in default mode. Unfortunately that means that with very strict CSP settings, certain Polypane functionality is also blocked from running. If this happens on one of your sites, you can now disable CSP in the Edit menu.&lt;/p&gt;&lt;h3 id=&quot;new-devices&quot;&gt;New devices&lt;/h3&gt;&lt;p&gt;We added new Android devices (based on popularity) and a new UHD (4K) preset. If you&amp;#x27;re missing a device you want Polypane to emulate, please let us know!&lt;/p&gt;&lt;h3 id=&quot;live-reload-improvements&quot;&gt;Live reload improvements&lt;/h3&gt;&lt;p&gt;Live reload now automatically ignores dotfolders (it already ignored dotfiles) and will ignore any custom query parameters when hot reloading CSS files. This will cause updates to be more performant and CSS updates in particular to happen faster.&lt;/p&gt;&lt;h3 id=&quot;outline-panel-warnings&quot;&gt;Outline panel warnings&lt;/h3&gt;&lt;p&gt;We&amp;#x27;ve greatly expanded the number and type of warnings we give in the outline panel, as well as add more support for outlines created with aria attributes.&lt;/p&gt;&lt;p&gt;For the Landmarks overview, we&amp;#x27;ll now warn about missing-but-expected element, elements of which we expect just one but see multiple, and when landmarks are nested in other landmarks in an unexpected way.&lt;/p&gt;&lt;p&gt;The Links overview now warns you about empty content or href attributes that point to using links for JS logic.&lt;/p&gt;&lt;p&gt;The Focus order overview incorrectly ignored summary elements, but now reports them in the overview.&lt;/p&gt;&lt;p&gt;For the Image overview we made the &lt;strong&gt;first step towards helping you create better alt text&lt;/strong&gt;. Polypane will now warn you when you use redundant language in your alt text, like &amp;quot;image of...&amp;quot;.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Of course after implementing that last feature, we promptly found (and fixed) an image on our own site with exactly that alt text!&lt;/em&gt;&lt;/p&gt;&lt;h3 id=&quot;color-contrast-checker&quot;&gt;Color contrast checker&lt;/h3&gt;&lt;p&gt;We&amp;#x27;ve improved the color contrast checker under the hood, making it more accurate and implementing an updated design that makes it easier to see which element is checked. We also fixed an issue where some sites didn&amp;#x27;t allow you to copy the suggestion on click.&lt;/p&gt;&lt;h3 id=&quot;quality-of-life-improvements&quot;&gt;Quality-of-life improvements&lt;/h3&gt;&lt;p&gt;There&amp;#x27;s many other Quality-of-life improvements in this release. Interacting with tabs is now more similar to other browsers, the performance of pane resizing has drastically improved, you can right-click a single pane to reload just that pane, we improved the performance of animations across the application and much more.&lt;/p&gt;&lt;p&gt;Check the changelog below for the full list of updates, and of course every new and improved feature has been added to &lt;a href=&quot;/docs/&quot;&gt;the documentation&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;get-polypane-62&quot;&gt;Get Polypane 6.2&lt;/h2&gt;&lt;p&gt;Polypane is available for Windows, Mac (with versions for Intel and M1) and Linux (.deb or AppImage).&lt;/p&gt;&lt;p&gt;Polypane automatically updates on Mac and Windows. Linux users need to download the new version from
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt;. You can find the Mac and Windows versions on that page too.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Try it for free&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;full-changelog&quot;&gt;Full Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;New Features&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; HTML validation in the Source panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Toybox Systems integration&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Robots.txt support in Meta panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; RTL emulation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Disable CSP option&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; New Samsung and Redmi devices and UHD presets&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Polypane Message Bus&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Rewritten update logic&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Significant improvement to pane resize performance&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta Panel previews can now be toggled between light and dark mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel warns about incorrectly formatted canonical urls&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel warns about viewports that limit scaling&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel supports multiple theme colors and displays their media attribute&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel click a theme color to copy it&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel checks for missing image alt text&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel checks image url formatting&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel rendering of Twitter preview&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel rendering of Facebook preview&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated Electron&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated accessibility rules&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated Google Fonts list&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Live reload now ignored all dotfolders&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Live reload ignores query params when injecting CSS (Thanks Winston!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Color contrast labels have updated design&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Color contrast checking can now detect contrast issues for floated elements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Color contrast can now copy colors regardless of site settings&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Source panel now includes doctype&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel Headings now includes aria-role headings&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel Landmarks now warn about missing elements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel Landmarks now warn about duplicate elements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel Landmarks now warn about illegal nesting&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel Links now warn about href or content being empty&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel Focus order now supports summary elements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel Images warns about redundant text in the alt attribute&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel shows messages when no elements can be found&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; DOM Treemap devtools extension added (Thanks Christian!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Support for web component syncing&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Clearer active state for inspect button in dark mode (Thanks John!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Add &amp;#x27;reload and &amp;#x27;reload this pane&amp;#x27; options to context menu&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel now supports complex specificity calculations&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Improve consistency of colors in dark mode UI&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Pane load performance improvements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Improve help text for undocked devtools in Devtools panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Animation performance across the app&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Double click or middle mouse click the tab bar to open a new tab&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Click sync for inputs in labels now syncs correct state&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Webvitals logic updated, CLS now live-updates&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Hover tooltip now shows font weight (Thanks Stephan!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Clarify wording in a11y panel (Thanks Roel!)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Middle mouse clicking a tab now closes it without first focusing it&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Element normalization causing issues with Svelte updating (Thanks Richard!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Overview screenshot on Windows had incorrect dimensions&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; &amp;#x27;open with Polypane&amp;#x27; for HTML files&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Touch emulation toggling applies immediately&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Outline Panel Focus elements now match other outlines.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Design issue with viewport/device size toggle&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; CSS button in address bar opened the wrong panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Aspect ratios no longer sort largest first&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Resolve syntax error when emulating a user agent&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Reset Window dimensions on launch if launching on different screen configuration (Thanks Claudia!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Resolve issue in Outline panel when sites have images without SRC attribute&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel color editor can now set opacity again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel height of add attribute form now correct&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; &amp;#x27;nodeName of undefined&amp;#x27; error message&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Meta panel now supports objects in oEmbed&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; opening URLs from browser extension on Linux&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Release notes overlay displays release notes again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; overflow issue in a11y panel with large text size (Thanks Hidde!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Ctrl + needed shift to zoom in (Thanks Alex!)&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Fixing contrast issues, on your own site and elsewhere]]></title><description><![CDATA[Insufficient text contrast is the most common accessibility issue on websites today. According to the  WebAIM Million report for 2021 , 86.…]]></description><link>https://polypane.app/blog/fixing-contrast-issues-on-your-own-site-and-elsewhere/</link><guid isPermaLink="false">https://polypane.app/blog/fixing-contrast-issues-on-your-own-site-and-elsewhere/</guid><pubDate>Tue, 08 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Insufficient text contrast is the most common accessibility issue on websites today. According to the &lt;a href=&quot;https://webaim.org/projects/million/#contrast&quot;&gt;WebAIM Million report for 2021&lt;/a&gt;, 86.4% of home pages world wide have low contrast text. What&amp;#x27;s worse, this number has been increasing the past three years.&lt;/p&gt;&lt;p&gt;Polypane makes it really easy to fix these color contrast issues, with our algorithm that finds contrast issues and automatically suggests the nearest color with enough contrast. That&amp;#x27;s really helpful for all the (awesome, amazing and good looking) people building sites with Polypane, but we realized we could use the same code that powers our algorithm and just, well, &lt;strong&gt;fix all the contrast issues on any site you visit&lt;/strong&gt;.&lt;/p&gt;&lt;h2 id=&quot;we-built-a-browser-extension&quot;&gt;We built a browser extension&lt;/h2&gt;&lt;p&gt;It&amp;#x27;s called &amp;quot;fix contrast&amp;quot; and it&amp;#x27;s available, for free, for Chrome, Firefox, Edge, Brave, Vivalvi and hopefully soon for Opera and Safari as well.&lt;/p&gt;&lt;p&gt;It does exactly what you expect it to do: it fixes contrast issues on sites you visit, automatically. The same way the suggested colors work in Polypane, except now we also apply them.&lt;/p&gt;&lt;p&gt;It does this while preserving the design of the website. All it does it bump the contrast for the elements that need it, leaving the rest alone.&lt;/p&gt;&lt;p&gt;Here&amp;#x27;s what the plugin looks like:&lt;/p&gt;&lt;img alt=&quot;The Fix Contrast settings&quot; src=&quot;https://fixa11y.com/_assets/images/ui.png&quot; class=&quot;imgshadow&quot; margin:=&quot;&quot; display:=&quot;&quot; maxwidth:=&quot;&quot;/&gt;&lt;p&gt;You can pick between &amp;quot;Medium&amp;quot; (corresponds to WCAG AA) and &amp;quot;High&amp;quot; (WCAG AAA) settings, or even pick your own preferences if those aren&amp;#x27;t enough.&lt;/p&gt;&lt;p&gt;The extension will do the rest: calculate color contrast depending on color, opacity, background color and font size, and updates the colors of any elements that need it.&lt;/p&gt;&lt;p&gt;Lastly, it can also change the background color if you want it to, for example when we can&amp;#x27;t increast or decrease the text color any further (it&amp;#x27;s already fully white or fully black), but that&amp;#x27;s optional.&lt;/p&gt;&lt;h3 id=&quot;download-for-your-browser&quot;&gt;Download for your browser&lt;/h3&gt;&lt;p&gt;You can find download links and more information on &lt;a href=&quot;https://fixa11y.com&quot;&gt;FixA11y.com&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;With 9 our of 10 websites having color contrast issues, this will &lt;strong&gt;make the web a more accessible place&lt;/strong&gt; by fixing an issue for users directly, without having to wait on site authors to resolve their issues. We hope you&amp;#x27;ll want to use it, and share it with other people for which it would be useful.&lt;/p&gt;&lt;p&gt;As it stands, the extension is available in English and Dutch, and we would love help getting it translated into other languages. If that&amp;#x27;s something you want to help it, please let us know!&lt;/p&gt;&lt;p&gt;We also announced the Fix Contrast extension over at &lt;a href=&quot;https://a11yproject.com/posts/2021-06-07-fixing-contrast-issues-on-your-own-site-and-elsewhere/&quot;&gt;The A11y Project&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;try-out-polypane&quot;&gt;Try out Polypane&lt;/h2&gt;&lt;p&gt;At Polypane, we want to make the web a more accessible place. We believe we can make that happen with tooling that doesn&amp;#x27;t just tell people what&amp;#x27;s wrong, but also tells them how to fix it.&lt;/p&gt;&lt;p&gt;If you want to read about our accessibility tooling, read our evergreen article &lt;a href=&quot;/blog/find-and-fix-accessibility-issues-with-polypane/&quot;&gt;Find and fix accessibility issues with Polypane&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;This philosophy influences all the choices we make in the application, and the result is that people are coached to making better websites at the point where they&amp;#x27;re at, without needing to stop working to learn elsewhere.&lt;/p&gt;&lt;p&gt;If you want to make better websites with a tool that helps you improve your web development workflow and the quality of your websites, &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;start a Polypane trial&lt;/a&gt;!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[A11y tooling in Polypane (video)]]></title><description><![CDATA[On May 25th Kilian Valkhof (the creator of Polypane) joined the Twitch channel of  Stephanie Eckles  to walk through most of the…]]></description><link>https://polypane.app/blog/a-11-y-tooling-in-polypane/</link><guid isPermaLink="false">https://polypane.app/blog/a-11-y-tooling-in-polypane/</guid><pubDate>Mon, 07 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;On May 25th Kilian Valkhof (the creator of Polypane) joined the Twitch channel of &lt;a href=&quot;https://www.twitch.tv/5t3phdev&quot;&gt;Stephanie Eckles&lt;/a&gt; to walk through most of the accessibility options in Polypane. Check out the recording below:&lt;/p&gt;&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom:56.25%;position:relative;height:0;overflow:hidden&quot;&gt; &lt;div style=&quot;position:relative;width:100%;padding-top:56.25%&quot;&gt; &lt;iframe src=&quot;https://www.youtube.com/embed/PZz91b62WT8&quot; title=&quot;YouTube video player&quot; frameBorder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot; style=&quot;position:absolute;top:0;left:0;width:100%;height:100%&quot;&gt;&lt;/iframe&gt; &lt;/div&gt; &lt;/div&gt;&lt;p&gt;If you prefer reading, check out our evergreen article on &lt;a href=&quot;/blog/find-and-fix-accessibility-issues-with-polypane/&quot;&gt;finding and fixing accessibility issues in Polypane&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 6.1: Readability, Content Chaos and rewritten event sync engine]]></title><description><![CDATA[Polypane 6.1 adds two new debug tools and a much more performant, completely rewritten interaction syncing engine along with numerous…]]></description><link>https://polypane.app/blog/polypane-6-1-readability-content-chaos-and-rewritten-event-sync-engine/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-6-1-readability-content-chaos-and-rewritten-event-sync-engine/</guid><pubDate>Tue, 01 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 6.1 adds two new debug tools and a much more performant, completely rewritten interaction syncing engine along with numerous smaller improvements and bug fixes.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;What&amp;#x27;s Polypane?&lt;/strong&gt; Polypane is a web browser for developers, designers and anyone that works on web projects. It shows sites in multiple fully synced &lt;em&gt;panes&lt;/em&gt; and has tons of features that help with responsive design, accessibility and overall site quality.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;readability-debug-tool&quot;&gt;Readability debug tool&lt;/h2&gt;&lt;p&gt;The readability debug tool will calculate how difficult each sentence on your page is. Darker, redder sentences are harder to understand while lighter, greener sentences are easier to read.&lt;/p&gt;&lt;p&gt;We calculate this using the Automated Readability Index (ARI), which works well for most western, European languages. For pages in Arabic it uses the Automatic Arabic Readability Index (AARI). If you know of other languages that have a Readability Index algorithm, please let us know!&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/doc-img/overlays/readability.png&quot; alt=&quot;Polypane screenshot of the docs page with Readability active&quot;/&gt;&lt;/p&gt;&lt;p&gt;This is a really neat way to check which of your sentences might be a little on the complex sites and should be rewritten.&lt;/p&gt;&lt;h2 id=&quot;content-chaos-debug-tool&quot;&gt;Content chaos debug tool&lt;/h2&gt;&lt;p&gt;The Content chaos debug tool will randomly halve, double or triple the content of each text node on your page. This is a perfect way to test if your layout wont break when there is unexpected text content (such as much longer titles for things than were used in the design, or languages that take significant more or less space).&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/doc-img/overlays/contentchaos.png&quot; alt=&quot;Polypane screenshot of the docs page with Content Chaos active&quot;/&gt;&lt;/p&gt;&lt;h2 id=&quot;rewritten-interaction-event-sync-engine&quot;&gt;Rewritten interaction event sync engine&lt;/h2&gt;&lt;p&gt;Polypane is the only browser that syncs &lt;strong&gt;all&lt;/strong&gt; your user interactions out of the box: scrolling, clicking, keyboard input, form events, typing and hovers. Making this feature performant is a difficult problem, since you need the same thing to happen at the same time across all panes.&lt;/p&gt;&lt;p&gt;In 6.1 we have completely rewritten our syncing engine (bringing it up to the third engine we&amp;#x27;ve built for this). We were able to take out an intermediate component that improves performance a lot and at the same time is able to more accurately sync interaction events across panes.&lt;/p&gt;&lt;p&gt;In particular, you&amp;#x27;ll notice a higher frame rate for scrolling and animations on hover are much smoother across panes.&lt;/p&gt;&lt;h3 id=&quot;about-browsersync&quot;&gt;About Browsersync&lt;/h3&gt;&lt;p&gt;Starting in Polypane 6.1, we will automatically disable the built-in syncing when we detect Browsersync with &lt;code class=&quot;language-text&quot;&gt;ghostMode&lt;/code&gt; turned on.&lt;/p&gt;&lt;p&gt;Browsersync has always been slightly slower than Polypane&amp;#x27;s internal syncing, and what was essentially happening was that Browsersync was continuously resetting the scroll position after Polypane had updated it, leading to a very janky experience.&lt;/p&gt;&lt;p&gt;Polypane has been showing a warning but unfortunately not many people are aware of the option to turn off &lt;code class=&quot;language-text&quot;&gt;ghostMode&lt;/code&gt;, or even realise they have Browsersync running in their project in the first place. That&amp;#x27;s why we decided it was better to instead disable the scroll syncing in Polypane, even though it is more performant.&lt;/p&gt;&lt;img alt=&quot;Image overview outline panel&quot; src=&quot;/blogs/polypane-6-1/imagepanel.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem 0 2rem 1rem;display:block;width:330px;max-width:100%;float:right&quot;/&gt;&lt;h2 id=&quot;images-overview-in-outline-panel&quot;&gt;Images overview in outline panel&lt;/h2&gt;&lt;p&gt;The online panel now gives you a list of all the images on a page along with their current source, alt text, title, shown dimensions, aspect ratio and actual dimensions when they differ from the shown dimensions.&lt;/p&gt;&lt;p&gt;When the alt text is missing we&amp;#x27;ll show a warning, and you can right-click any image to save it to disk.&lt;/p&gt;&lt;p&gt;Like the node tooltip, we&amp;#x27;ll only show the actual size when it differs from the shown dimensions, and we only show the aspect ratio if it&amp;#x27;s not the same as the pixel value.&lt;/p&gt;&lt;h2 id=&quot;smaller-improvements&quot;&gt;Smaller improvements&lt;/h2&gt;&lt;p&gt;Polypane inlines stylesheets to enable access to them from the elements panel. We&amp;#x27;ve made this optional which can be
slightly faster, at the expense of not showing all the styles in the elements panel. Starting in 6.1 we also rewrite
inlined stylesheet so that linked resources (like background images) work correctly.&lt;/p&gt;&lt;p&gt;Polypane now includes the Angular DevTools in the selection of devtools extensions.&lt;/p&gt;&lt;p&gt;We updated our color handling throughout the application making it much more performant. This is most noticable when editing a color
in the Elements panel.&lt;/p&gt;&lt;p&gt;It&amp;#x27;s now no longer possible to navigate to a Facebook, Twitter or Instagram URL in Polypane. We did this &lt;del&gt;as a productivity measure&lt;/del&gt;
because these sites have server security settings that make Electron applications (of which Polypane is one) crash. We could
disable the security settings for these sites but we would rather wait for Electron to be fixed, so we&amp;#x27;re keeping a close eye on that.&lt;/p&gt;&lt;p&gt;Logging in with Google was broken in Polypane 6 but it now works again.&lt;/p&gt;&lt;p&gt;Read through the full changelog to see the other improvements made.&lt;/p&gt;&lt;h2 id=&quot;get-polypane-61&quot;&gt;Get Polypane 6.1&lt;/h2&gt;&lt;p&gt;Polypane will automatically update on Mac and Windows. Linux users need to download the new version from
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; and if you&amp;#x27;re on Mac and Windows but don&amp;#x27;t want to wait on the update popup, find
your download there as well.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a free 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Get it here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;full-changelog&quot;&gt;Full Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;New features&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Readability debug tool&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Content chaos testing debug tool (Thanks Rik!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Interaction syncing engine rewritten to v3&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Images overview in outline panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Option to disable inlining stylesheets&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Angular DevTools now available in the devtools extensions installer&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Pane load performance improvements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Remove jank when animating hover styles&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Clicks are not synced when they create a new tab (when cmd or ctrl is pressed)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Support shorthand notation in combination with custom properties for hover syncing&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Prevent Polypane from opening urls that are known to cause crashes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Inlined stylesheets no longer overwrite background images&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Increase opacity for unfocused scrollbar (Thanks Sam!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Form elements now use the Polypane accent color&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Improve performance of color picker in elements panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Upgrade Chromium version&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Better color consistency for dark mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline Link checking now ignores javascript, blob and data links&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Polypane shows a warning when a site wants Location API access but there is no Google API key (Thanks Eric!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Mode switcher shortcut is changed so cmd + m for minimize works (Thanks Charlie!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Scroll syncing is now disabled when Browsersync with ghostMode is detected&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt; Fixes &lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Log in with Google works again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Fix auto reloading not starting immediately&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; CSS injection in Live reload for Default mode (Thanks Winston!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Disabling hover sync also blocked showing the target url on hover&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Copy button for empty description was missing (Thanks Charlie!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Alignment issues in the Outline panel on Mac&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Editing text nodes in elements panel sometimes didn&amp;#x27;t work&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent tooltip overlay misalignment on some sites&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent duplicate inlining of stylesheets&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Polypane console can now print &amp;#x27;null&amp;#x27; messages&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Escape HTML in attributes in overlay tooltip&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Missing rel=&amp;quot;noopener&amp;quot; warning was sometimes shown incorrectly&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Replace panes button for custom workspaces now replaces panes again (Thanks Sam!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel not always showing background image declarations&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Show correct version number in getting started page&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Device testing is not enough]]></title><description><![CDATA[When you get started with responsive design, you wouldn't be wrong to think it's all about devices. Questions like "which size to use for…]]></description><link>https://polypane.app/blog/device-testing-is-not-enough/</link><guid isPermaLink="false">https://polypane.app/blog/device-testing-is-not-enough/</guid><pubDate>Thu, 27 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When you get started with responsive design, you wouldn&amp;#x27;t be wrong to think it&amp;#x27;s all about devices. Questions like &amp;quot;which size to use for mobile&amp;quot; quickly come up, and most testing is done on developers&amp;#x27; own devices. &amp;quot;Does it look good on my iPhone? Does it look good on my Samsung Galaxy Tab?&amp;quot;&lt;/p&gt;&lt;p&gt;But reality is different.&lt;/p&gt;&lt;h2 id=&quot;device-sizes-are-not-browser-sizes&quot;&gt;Device sizes are not browser sizes&lt;/h2&gt;&lt;p&gt;In the last 30 days, this website was shown on 485 unique devices, but &lt;strong&gt;well over 3000 unique browser sizes&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;The browser size is not the same as device size, &lt;strong&gt;even on mobile and tablets&lt;/strong&gt;. But browser size is what your site is actually shown at.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;If you only test device sizes you miss the in-between sizes your real visitors use.&lt;/strong&gt; On mobile, different browsers have different viewport heights. On tablet a browser might be shown at any size in split view. And on desktop, many people simply don&amp;#x27;t run their browser full screen all the time.&lt;/p&gt;&lt;h2 id=&quot;you-need-a-browser-size-wall&quot;&gt;You need a browser size wall&lt;/h2&gt;&lt;p&gt;Good responsive design doesn&amp;#x27;t care about devices, and neither do your website visitors. So whatever tool you use to test responsive designs should not force you to only use device sizes. Unfortunately, most only support devices.&lt;/p&gt;&lt;p&gt;Device sizes are not browser sizes. Testing only devices makes no sense.&lt;/p&gt;&lt;p&gt;To prove this to you, we built a tool that gives you an overview of all the browser sizes your real visitors use:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/responsive-website-test/&quot;&gt;&lt;img src=&quot;/og-custom/responsivewebsitetest.png&quot; alt=&quot;This is your browser size wall&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Connect with it to your Google Analytics and we&amp;#x27;ll show you an overview of the actual browser sizes used by your visitors in the last 30 days. You&amp;#x27;ll quickly see how many different sizes your site is being shown at, and how much variance there is even on mobile sizes.&lt;/p&gt;&lt;p&gt;We&amp;#x27;re only showing you the top 100 most used browser sizes, since scrolling through hundreds, let alone thousands of them is is not great (believe us, we tried).&lt;/p&gt;&lt;p&gt;Optimizing your site for just a few devices is a losing strategy, and doesn&amp;#x27;t fit how real people experience your website.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/responsive-website-test/&quot;&gt;Check out your browser size wall&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;match-reality-by-using-polypane&quot;&gt;Match reality by using Polypane&lt;/h2&gt;&lt;p&gt;Checking just devices will have you missing all the in-between sizes that your real users use. You need a different model if you want to build sites that work for &lt;strong&gt;all&lt;/strong&gt; your users. You don&amp;#x27;t need devices, but &lt;em&gt;panes&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Panes in Polypane are freeform, and you can add however many you want. You can size them in many different ways:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. Yes, you can select from any of our 25+ devices (with full emulation)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Our devices are divided into separate categories and are always up to date with full emulation and the ability to switch between device size and viewport size.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. Base them on on your @media query breakpoints&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Polypane parses your CSS as the page loads and extracts all the breakpoints from your CSS media queries. With a single click you can get an overview of all the sizes the site has been styled for, or you can add them one by one.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. Built-in and downloadable pane workspaces based on CSS framework sizes&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;CSS frameworks like Bootstrap and Tailwind come with a set of built-in media queries. We have ready-made overviews for the 11 most used CSS frameworks.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. Drag to resize any pane on screen!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Panes in Polypane are freeform. If you need one to be a little big, grab the edge and resize it.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;But we have one more way:&lt;/strong&gt; take the browser size wall one step further and create your own Polypane workspace from the sizes your actual visitors use the most.&lt;/p&gt;&lt;h3 id=&quot;create-your-own-browser-size-workspace&quot;&gt;Create your own browser size workspace&lt;/h3&gt;&lt;p&gt;After you checked your &lt;a href=&quot;/responsive-website-test/&quot;&gt;browser size wall&lt;/a&gt;, you&amp;#x27;ll want to get that info into Polypane. Use our create workspace tool to create a workspace based on the browser sizes used by your visitors.&lt;/p&gt;&lt;div style=&quot;margin-top:2rem;text-align:center&quot;&gt;&lt;svg style=&quot;margin:0 auto;display:block&quot; width=&quot;137&quot; height=&quot;60&quot; viewBox=&quot;0 0 137 60&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;defs&gt;&lt;linearGradient id=&quot;sqgradient&quot; gradientTransform=&quot;rotate(45)&quot;&gt;&lt;stop offset=&quot;0&quot; stop-color=&quot;rgb(44, 130, 173)&quot; stop-opacity=&quot;1&quot;&gt;&lt;/stop&gt;&lt;stop offset=&quot;1&quot; stop-color=&quot;rgb(103, 178, 111)&quot; stop-opacity=&quot;1&quot;&gt;&lt;/stop&gt;&lt;/linearGradient&gt;&lt;/defs&gt;&lt;rect width=&quot;53&quot; height=&quot;60&quot; rx=&quot;8&quot; fill=&quot;url(#sqgradient)&quot;&gt;&lt;/rect&gt;&lt;rect x=&quot;60&quot; width=&quot;43&quot; height=&quot;50&quot; rx=&quot;8&quot; fill=&quot;url(#sqgradient)&quot;&gt;&lt;/rect&gt;&lt;rect x=&quot;110&quot; width=&quot;27&quot; height=&quot;37&quot; rx=&quot;8&quot; fill=&quot;url(#sqgradient)&quot;&gt;&lt;/rect&gt;&lt;/svg&gt;&lt;p&gt;&lt;a href=&quot;/create-workspace/&quot;&gt;Create your own browser size workspace&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The best sizes to use are the sizes your own visitors use&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 id=&quot;add-a-little-random-to-your-panes&quot;&gt;Add a little random to your panes&lt;/h3&gt;&lt;p&gt;Even when you&amp;#x27;ve done all of that, you still won&amp;#x27;t get to the hundreds or even thousands of unique sizes and of course, you don&amp;#x27;t have to check them &lt;em&gt;all&lt;/em&gt;. But we have one last neat trick up our sleeve.&lt;/p&gt;&lt;p&gt;With &lt;code class=&quot;language-text&quot;&gt;Shift ctrl n&lt;/code&gt; you can slightly tweak the size of all the panes on your screen. Do this a couple of times and you&amp;#x27;ve checked effectively all variations.&lt;/p&gt;&lt;h3 id=&quot;whats-next-try-polypane&quot;&gt;What&amp;#x27;s next? Try Polypane.&lt;/h3&gt;&lt;p&gt;Device sizes are not enough, and you want a responsive design tool that doesn&amp;#x27;t force you to use only devices.&lt;/p&gt;&lt;p&gt;With panes in Polypane, you can use your own CSS breakpoints, your visitors sizes, freeform sizes and yes, even devices. Test your site in all the hundreds or thousands of ways real people experience your site.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://dashboard.polypane.app/register/&quot;&gt;Start a free trial today&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 6: Peek, Webvitals, new simulators & Chromium 91]]></title><description><![CDATA[Polypane 6 is now available! It's another packed release with new features, simulators, performance improvements and a new version of…]]></description><link>https://polypane.app/blog/polypane-6-peek-webvitals-new-simulators-chromium-91/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-6-peek-webvitals-new-simulators-chromium-91/</guid><pubDate>Wed, 12 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 6 is now available! It&amp;#x27;s another packed release with new features, simulators, performance improvements and a new version of Chromium powering it all. Read on to learn about all the cool new things we have for you.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;What&amp;#x27;s Polypane?&lt;/strong&gt; Polypane is a web browser for developers, designers and anyone that works on web projects. It shows sites in multiple fully synced &lt;em&gt;panes&lt;/em&gt; and has tons of features that help with responsive design, accessibility and overal site quality.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;polypane-is-two-years-old-🥳&quot;&gt;Polypane is two years old 🥳&lt;/h2&gt;&lt;p&gt;Polypane launched two years ago on May 14th. 32 releases, 18 Chromium versions and 5 major Polypane versions further we&amp;#x27;re now at Polypane 6.&lt;/p&gt;&lt;p&gt;It&amp;#x27;s insane to look back at the now 32 releases we made. Polypane has truly become something I couldn&amp;#x27;t have imagined back then and it&amp;#x27;s all thanks to your support and suggestions. So thank you, and on to the next 2, 5, 10 years of Polypane!&lt;/p&gt;&lt;h2 id=&quot;polypane-peek-the-fastest-way-to-inspect-elements-ever&quot;&gt;Polypane peek: the fastest way to inspect elements ever&lt;/h2&gt;&lt;p&gt;Polypane peek is a deceptively simple feature, but one that will transform how you use the browser.&lt;/p&gt;&lt;p&gt;Whenever you press &lt;code class=&quot;language-text&quot;&gt;alt&lt;/code&gt; (or &lt;code class=&quot;language-text&quot;&gt;option&lt;/code&gt;), Polypane will highlight the element under your cursor and show an tooltip with a bunch of info.&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-6/polypane-peek.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;p&gt;Find out font details, margin sizes and other element info with a single button press. Once you get used to it there&amp;#x27;s no going back.&lt;/p&gt;&lt;p&gt;And if you do want to dig in, click the element and you&amp;#x27;re inspecting it in the Polypane element inspector, same as ever.&lt;/p&gt;&lt;h2 id=&quot;web-vitals-overview&quot;&gt;Web vitals overview&lt;/h2&gt;&lt;p&gt;Web vitals are becoming an important part of website performance, so we&amp;#x27;ve implemented web vitals monitoring for all panes.
Turn the web vitals overview on by going to the application menu in the top right and checking &amp;quot;Show Webvitals Status&amp;quot;.&lt;/p&gt;&lt;img alt=&quot;Webvitals for panes overview&quot; src=&quot;/blogs/polypane-6/webvitals.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;A green dot means every Web Vital scores &amp;quot;Good&amp;quot;, an orange rectangle means that a web vital needs improvement (and we&amp;#x27;ll show which) and lastly a red triangle means that this page in this pane scores &amp;quot;Poor&amp;quot; for a specific web vital.&lt;/p&gt;&lt;p&gt;Hover over the button to get an overview of the web vitals and your score. This is Polypane&amp;#x27;s first foray into performance tooling and notifications, and we&amp;#x27;re eager to hear what you think and what you want to see next!&lt;/p&gt;&lt;h2 id=&quot;astigmatism-simulators&quot;&gt;Astigmatism simulators&lt;/h2&gt;&lt;p&gt;Astigmatism is most easily explained as a blurring and ghosting of the vision, but only in a single direction. According to Wikipedia, between 30% and 60% of adults in Europe and Asia have some form of astigmatism, from mild to severe.&lt;/p&gt;&lt;p&gt;When we learned about it we thought it would be a good addition to our growing list of simulators, so we researched how astigmatism works and created simulators that map as close as we could to how people experience astigmatism.&lt;/p&gt;&lt;img alt=&quot;Screenshot of astigmatism overview&quot; src=&quot;/doc-img/overlays/astigmatism.jpg&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;We&amp;#x27;ve added two Astigmatism simulators to our Debug tools: horizontal and vertical astigmatism, which emulate the blurring in a horizontal and vertical direction respectively.&lt;/p&gt;&lt;h2 id=&quot;meta-panel-improvements&quot;&gt;Meta panel improvements&lt;/h2&gt;&lt;p&gt;All meta values in the Meta panel now come with a copy button that copies the fully formed HTML string for you. For missing values it copies a template for you to fill in, or will fill it in for you with the right content value.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;This follows our philosophy of not just pointing out what&amp;#x27;s wrong, but also how to improve it.&lt;/strong&gt; It might be a small feature, but we spend quite some time thinking about the right defaults.&lt;/p&gt;&lt;h2 id=&quot;chromium-91&quot;&gt;Chromium 91&lt;/h2&gt;&lt;p&gt;Polypane now runs Chromium 91, with support for color-gamut emulation, a huge performance increase for devtools and support for container queries.&lt;/p&gt;&lt;p&gt;Polypane has experimental support turned on for a number of new features like @scroll-timeline, container queries and prefers-reduced-data. This way you get to try out and experiment with these features before they become generally available in browsers. For example, here&amp;#x27;s a demo using @scroll-timeline to change the background color as you scroll, using only CSS:&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-6/scroll.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;h2 id=&quot;bug-fixes&quot;&gt;Bug fixes&lt;/h2&gt;&lt;p&gt;Unfortunately, bugs happen. In Polypane 6 we&amp;#x27;ve solved a few big ones. We&amp;#x27;re really grateful to everyone that helped find and debug these issues with us.&lt;/p&gt;&lt;p&gt;If any of these held you back from trying Polypane and you want to give it another go, please reach out and we&amp;#x27;ll restart your trial.&lt;/p&gt;&lt;h3 id=&quot;unfocusable-devtools-on-mac&quot;&gt;Unfocusable devtools on Mac&lt;/h3&gt;&lt;p&gt;Refocusing docked devtools on Mac didn&amp;#x27;t always work or if it did, keyboard input wouldn&amp;#x27;t be accepted. The underlying bug is now fixed across all Electron apps after we coordinated with the Electron team.&lt;/p&gt;&lt;h3 id=&quot;browser-extension-on-windows&quot;&gt;Browser extension on Windows&lt;/h3&gt;&lt;p&gt;The browser extension (that lets you open links from your browser straight into Polypane) did not work with Polypane 5.1 on Windows. This happened due to a change in the way we handle command line flags that didn&amp;#x27;t account for the fact that Windows treats them the same as &amp;quot;open requests&amp;quot; from other applications.&lt;/p&gt;&lt;p&gt;Both the CLI options and the browser extension now work again.&lt;/p&gt;&lt;h3 id=&quot;post-calls-being-overwritten-by-gets&quot;&gt;POST calls being overwritten by GETs&lt;/h3&gt;&lt;p&gt;The navigation sync feature in Polypane gave panes a timeout before forcing a new URL, and this didn&amp;#x27;t account for POST requests that took longer than a few seconds.&lt;/p&gt;&lt;p&gt;Polypane now keeps track of POST requests and will wait until they are done before checking if navigation sync is required.&lt;/p&gt;&lt;h3 id=&quot;style-caching-in-the-elements-panel&quot;&gt;Style caching in the Elements Panel&lt;/h3&gt;&lt;p&gt;For performance reasons we only parsed the styles for a pane during load, so if you resized a pane afterwards and new styling would be applied due to media queries, those wouldn&amp;#x27;t be shown until you reloaded.&lt;/p&gt;&lt;p&gt;Thanks to the performance improvements in Chromium 91 and rewritten logic for style parsing this is now fast enough to get updated styles on-demand, even for sites with significant amounts of CSS.&lt;/p&gt;&lt;h2 id=&quot;other-updates&quot;&gt;Other updates&lt;/h2&gt;&lt;p&gt;Each Polypane release comes with large updates but also with smaller features. Here&amp;#x27;s some of the smaller features, but be sure to scroll through the full changelog to find all updates.&lt;/p&gt;&lt;h3 id=&quot;updated-tooltip&quot;&gt;Updated tooltip&lt;/h3&gt;&lt;p&gt;Now that the tooltip and element highlighter is so easy to activate, we&amp;#x27;ve also improved the tooltip. For one, it will now stay in view much better than previous versions, taking into account all sides of the pane.&lt;/p&gt;&lt;img alt=&quot;New tooltip design&quot; src=&quot;/blogs/polypane-6/tooltip.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;As space allows, we show the dimensions right inside the highlighted content, padding and margin areas. Inside the tooltip, we&amp;#x27;ve added the intrinsic size for images and videos, so you can quickly check if the right version is being used, and we streamlined the tooltip when the &lt;code class=&quot;language-text&quot;&gt;alt&lt;/code&gt; attribute and accessible name are the same.&lt;/p&gt;&lt;h3 id=&quot;class-suggestions-in-the-elements-panel&quot;&gt;Class suggestions in the Elements panel&lt;/h3&gt;&lt;p&gt;When you edit classes in the Elements panel, Polypane suggests classes from your stylesheets and the page. Select classes with the arrow keys or mouse, and press enter or click to add them.&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-6/classeditor.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;h3 id=&quot;css-style-properties-and-html-attributes-suggestions-in-the-elements-panel&quot;&gt;CSS Style properties and HTML attributes suggestions in the Elements panel&lt;/h3&gt;&lt;p&gt;As you add CSS style properties and HTML attributes the Elements panel will suggest appropriate values for you: all the CSS style properties supported by Chromium and the HTML attributes that are appropriate for the current element.&lt;/p&gt;&lt;h3 id=&quot;support-for-permission-requests&quot;&gt;Support for permission requests&lt;/h3&gt;&lt;p&gt;Polypane now shows permission requests, like for notification, audio and location, that you can accept or deny per URL. You can choose to remember this setting.&lt;/p&gt;&lt;img alt=&quot;Permission request&quot; src=&quot;/blogs/polypane-6/permission.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;h3 id=&quot;web-components-update&quot;&gt;Web components update&lt;/h3&gt;&lt;p&gt;In 5.1.0 we added support for web components across our various Panels, and in 6.0.0 we&amp;#x27;re expanding that support also to our syncing functionality. For open web components, hovers, clicks, input and keyboard events are now synced across all panes.&lt;/p&gt;&lt;h3 id=&quot;re-applying-debug-tools&quot;&gt;Re-applying debug tools&lt;/h3&gt;&lt;p&gt;There&amp;#x27;s now a re-apply button in the debug tools popover so you can quickly recheck for example color contrasts or overflowing issues as you work through them and the page auto-updates.&lt;/p&gt;&lt;p&gt;We really needed this ourselves and its a big quality-of-life feature we hope you&amp;#x27;ll enjoy.&lt;/p&gt;&lt;h3 id=&quot;easily-scroll-in-the-horizontal-and-vertical-layout&quot;&gt;Easily scroll in the horizontal and vertical layout&lt;/h3&gt;&lt;p&gt;You can now use the &lt;code class=&quot;language-text&quot;&gt;home&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;end&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;page up&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;page down&lt;/code&gt; keys to quickly scroll through the horizontal and vertical layouts rather than using your mouse, the scrollbar, &lt;code class=&quot;language-text&quot;&gt;spacebar&lt;/code&gt; + click to drag or scroll wheel/two-finger scroll.&lt;/p&gt;&lt;h3 id=&quot;live-css-panel-now-gives-smarter-suggestions&quot;&gt;Live CSS Panel now gives smarter suggestions&lt;/h3&gt;&lt;p&gt;The element selector in the Live CSS panel lets you quickly get a list of CSS selectors to use to target the selected element. But some elements simply don&amp;#x27;t have a lot of classes or associated CSS selectors. To still give useful suggestions here Polypane now also takes parent elements into account when it can&amp;#x27;t find enough element-specific selectors.&lt;/p&gt;&lt;h3 id=&quot;best-practices-in-accessibility-panel&quot;&gt;Best practices in Accessibility panel&lt;/h3&gt;&lt;p&gt;We now split out best practices in the Accessibility panel for when you only want to check for WCAG issues.&lt;/p&gt;&lt;h3 id=&quot;spell-checking-support&quot;&gt;Spell checking support&lt;/h3&gt;&lt;p&gt;The &amp;quot;Edit content&amp;quot; debug tool now has added spell-checking support. Spelling mistakes will be highlighted, and you can right-click them to see a list of suggestions or add the current word to your dictionary. Spell check works in all the languages your current operating system supports.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Fun fact: we implemented this feature after an automated spam bot emailed us we misspelled the word &amp;quot;woah&amp;quot; on our website. Obviously, we did no misspell the word &amp;quot;Woah&amp;quot;.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;get-polypane-6&quot;&gt;Get Polypane 6&lt;/h2&gt;&lt;p&gt;Polypane will automatically update on Mac and Windows. Linux users need to download the new version from
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; and if you&amp;#x27;re on Mac and Windows but don&amp;#x27;t want to wait on the update popup, find
your download there as well.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a free 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Get it here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;full-changelog&quot;&gt;Full Changelog&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;New features&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Polypane peek: Press &lt;code class=&quot;language-text&quot;&gt;alt&lt;/code&gt; to get the info for the element under the cursor&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Support for permission requests&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Webvitals overview per pane&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Sync events for open webcomponents&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Astigmatism Simulators&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Suggested classes, CSS properties and HTML attributes in Element panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Copy Meta attributes and suggestions from Meta panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Color gamut emulation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Container Queries support&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Reload debug tool options&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Home/End, PageUp/PageDown shortcuts for horizontal and vertical layouts (Thanks Jens!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Tooltip for images and videos now show intrinsic size&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Tooltip and Element panel now show aspect ratio&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Live CSS panel generates selectors based on parent elements when needed&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Spell checking in the Edit Content Debug Tool&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Update to Chromium 91&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Improvements&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Faster app launch&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Faster page loads&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Show dimensions in Element overlay&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Show Margin and padding sizes in the Element overlay&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Edit Panel tabs are now in more logical order&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; The &amp;#x27;default&amp;#x27; workspace panel is now the first selected one&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Support for SVG elements in Console&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Booleans are styled correctly in the Console&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Updated ruleset for Accessibility panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Accessibility panel shows optional best practices (Thanks Erik!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Inspect SVG elements from the Accessibility Panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Alignments improved in pane headers&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Prevent additional fetch of document happening on load&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Added explanations to pane options&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Console popups are now off by default&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Console popups now filter out console.debug messages by default&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Split debug messages in Console panel, hide by default&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Improved hover performance&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Cleaner license flow&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Prevent pages from reloading during a POST request (Thanks Urs!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Show a clearer warning when &lt;a href=&quot;https://polypane.app/docs/other-tools/#using-polypane-with-browsersync&quot;&gt;Polypane detects browser-sync&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Tooltip will now stay in view for left and bottom bounds&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Emulation toggles now have an info tooltip to explain their function&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Show a warning for links where a &lt;code class=&quot;language-text&quot;&gt;rel&lt;/code&gt; is missing but needed&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Support data urls for favicons and meta panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Updated list of Google Fonts&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Updated Discord preview rendering&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Fixes&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent focus from being removed from pages during load&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent devtools on mac from becoming unfocusable&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Launching Polypane from browser extension on Windows now works again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent Element panel crash for element with multiple child text nodes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent styling overwrites for Polypane tooltip&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Bug where focus pane would remain zoomed in&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Bug where zoom would reset to 100 upon clearing&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Closing the app on Mac didn&amp;#x27;t work with active Live Reloading (Thanks Mike!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Zoom to fit now works on Windows again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Resize handle was overlapping header menus&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Slack preview no longer crashes when site contains errors&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Polypane no longer tries to test mailto and tel links&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Overview screenshot now matches the current browser theme&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent stale styling overview for resized panes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; &amp;#x27;Paste and go&amp;#x27; context menu (Thanks John!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Sometimes overview screenshot used the wrong layout&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Don't you forget about me: overlooked breakpoints in responsive design.]]></title><description><![CDATA[We get it, there's infinite breakpoints you need to test on and only so much hours in a day, so some breakpoints just get a little more…]]></description><link>https://polypane.app/blog/overlooked-breakpoints-in-responsive-design/</link><guid isPermaLink="false">https://polypane.app/blog/overlooked-breakpoints-in-responsive-design/</guid><pubDate>Fri, 23 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We get it, there&amp;#x27;s infinite breakpoints you need to test on and only so much hours in a day, so some breakpoints just get a little more attention than others. You focus most of your time on the devices you have.&lt;/p&gt;&lt;p&gt;At Polypane we see and test a lot of websites and we&amp;#x27;ve noticed two size ranges that don&amp;#x27;t seem to get as much attention:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Between 320px and 375px wide.&lt;/li&gt;&lt;li&gt;Between 930px and 990px wide.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Read on to learn why they&amp;#x27;re overlooked, and why they&amp;#x27;re still important.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Testing breakpoints in Polypane is really easy: we automatically detect the breakpoints of your page and create viewports for them, so you get the perfect overview of what you optimize for.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;between-320px-and-375px&quot;&gt;Between 320px and 375px&lt;/h2&gt;&lt;p&gt;For the longest time, mobile phones were 320px wide. But that changed a couple of years ago when first Android and then Apple phones became larger and larger, and slowly 375px became the minimum size people use to test with.&lt;/p&gt;&lt;p&gt;But 320px wide is still important! There&amp;#x27;s still plenty of people around using an older Android or iPhone SE (the model based on an iPhone 5), iPads and other devices can show sites at 320px in split mode, and people can still resize their browser on desktop as well.&lt;/p&gt;&lt;p&gt;More importantly though, 320px is an accessibility requirement. The WCAG success criterion 1.4.10, &amp;quot;Reflow&amp;quot;, indicates that at 320 CSS pixels wide you should not have a horizontal scroll bar.&lt;/p&gt;&lt;p&gt;That&amp;#x27;s not because WCAG is concerned about small phones particularly, but because it&amp;#x27;s a &amp;quot;reasonable minimum size that authors can achieve&amp;quot; (The &amp;quot;author&amp;quot; in this situation is you, the developer). Specifically, 320px wide is what you get when you zoom in by 400% on a desktop browser that&amp;#x27;s 1280px wide. That zooming in helps people with low vision.&lt;/p&gt;&lt;p&gt;So next time you check on one of the mobile viewports in Polypane, check the &amp;quot;small android&amp;quot; viewport as well to make sure there&amp;#x27;s no scroll bars and no breaking&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;If you do end up with a scrollbar at 320px wide, the quickest way to find the element is to turn on layout debugging in Polypane. That highlights in red all the elements causing the scrollbar.&lt;/p&gt;&lt;/blockquote&gt;&lt;div style=&quot;position:relative;width:100%;max-width:100%;padding-top:45.2%&quot;&gt;&lt;video src=&quot;/blogs/polypane-3-3/overflow.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;position:absolute;top:0px;left:0px;width:100%;max-width:100%;height:100%&quot;&gt;&lt;/video&gt;&lt;/div&gt;&lt;h2 id=&quot;between-930px-and-990px&quot;&gt;Between 930px and 990px&lt;/h2&gt;&lt;p&gt;Between 930px and 990px is a sort of no man&amp;#x27;s land. Too wide for mobile phones and tablets in portrait mode, but too narrow for tablets in landscape mode and desktops, it sits right in the middle.&lt;/p&gt;&lt;p&gt;And so often this is the most awkward size, where sites haven&amp;#x27;t gone from a one or two column layout to a wider layout yet and you end up with elements that seem too large or too wide.&lt;/p&gt;&lt;p&gt;But its also the size where we most often see layout bugs appear, where not-quite mobile/tablet and desktop breakpoints don&amp;#x27;t quite line up and the layout is broken right in the middle of them.&lt;/p&gt;&lt;p&gt;It&amp;#x27;s also a very common width for an unmaximized browser on a regular desktop, and if you have for example a Galaxy tab in split mode with a 320px sidebar what&amp;#x27;s left is ...960px!&lt;/p&gt;&lt;p&gt;So it&amp;#x27;s worth the effort switching to Polypane&amp;#x27;s focus mode and quickly scale between 930px and 990px to see if there&amp;#x27;s some weird jumping around happening.&lt;/p&gt;&lt;img alt=&quot;Screenshot of the two breakpoint sizes side by side&quot; src=&quot;/blogs/overlooked/workspace.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;h2 id=&quot;polypane-workspace&quot;&gt;Polypane workspace&lt;/h2&gt;&lt;p&gt;A cool thing in Polypane is that you can &lt;a href=&quot;/docs/workspace-management/#importing-and-exporting&quot;&gt;import (and export) workspaces&lt;/a&gt; with predefined pane sizes. So we made a workspace with these two sizes for you:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/blogs/overlooked/overlooked-breakpoints-sizes.ppws&quot;&gt;Overlooked breakpoint sizes workspace&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Download it, import it into Polypane and check your site!&lt;/p&gt;&lt;h2 id=&quot;checking-all-sizes-impossible&quot;&gt;Checking all sizes, impossible?&lt;/h2&gt;&lt;p&gt;There&amp;#x27;s no denying that the amount of screen sizes we need to adapt sites for is always growing. So much so that it feels like you might not be able to check every size. Especially if you need to go through it one by one.&lt;/p&gt;&lt;p&gt;Luckily there&amp;#x27;s strategies you can use to keep your site more flexible. For one, sticking to some &lt;a href=&quot;/blog/responsive-design-ground-rules/&quot;&gt;ground rules&lt;/a&gt; like only using media queries using min-width makes it much easier to reason about your styling, but you can also use modern CSS like &lt;code class=&quot;language-text&quot;&gt;calc()&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;clamp()&lt;/code&gt; to give elements a minimum, ideal and maximum size and then hand it off to the browser to sort it out.&lt;/p&gt;&lt;p&gt;Still, you&amp;#x27;re gonna have to validate your site at a bunch of different screen sizes.&lt;/p&gt;&lt;p&gt;For that, Polypane is by far the easiest.&lt;/p&gt;&lt;p&gt;It syncs everything you do across viewports so you only have to do it once (scrolling, clicking, typing and even hovering!) while testing all screen sizes at once.&lt;/p&gt;&lt;p&gt;Start a free trial with the link below!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How to find broken links with Polypane]]></title><description><![CDATA[Broken links, or "dead links", on your website are links that go to a URL that doesn't work. Sometimes this is because the
site you're…]]></description><link>https://polypane.app/blog/how-to-find-broken-links-with-polypane/</link><guid isPermaLink="false">https://polypane.app/blog/how-to-find-broken-links-with-polypane/</guid><pubDate>Mon, 12 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Broken links, or &amp;quot;dead links&amp;quot;, on your website are links that go to a URL that doesn&amp;#x27;t work. Sometimes this is because the
site you&amp;#x27;re linking to has gone offline or has a server error, sometimes it&amp;#x27;s because there is a spelling mistake in your link. Detecting these
is difficult: you don&amp;#x27;t click on each url on each page every time you make a change, since that simply would take too
much time.&lt;/p&gt;&lt;p&gt;Waiting for your visitors to tell you about broken links is also not a great strategy. Sending them to a URL that doesn&amp;#x27;t
work and then waiting for them to tell you is not a great user experience, and very few visitors will take the effort to
notify you. Additionally, a page that has broken links is an indicator for search engines that the content is probably
outdated or low quality.&lt;/p&gt;&lt;p&gt;With Polypane, you can check for broken links automatically and detect not just broken links but also unneeded redirects.
Before we show you how to check for broken links, first a short primer:&lt;/p&gt;&lt;h2 id=&quot;types-of-broken-links&quot;&gt;Types of broken links&lt;/h2&gt;&lt;p&gt;Roughly there are two types of broken links, those with a 4xx status code and those with a 5xx status code.&lt;/p&gt;&lt;p&gt;A 400 status code means &lt;em&gt;you&lt;/em&gt; made an error.&lt;/p&gt;&lt;p&gt;A 500 status code means &lt;em&gt;the server&lt;/em&gt; made an error.&lt;/p&gt;&lt;p&gt;For example, a &amp;quot;404 not found&amp;quot; means that while the server got and understood your requests, the thing you tried to find
was not there. A &amp;quot;500 internal server error&amp;quot; means there was an error in the code of the server that it couldn&amp;#x27;t recover from.&lt;/p&gt;&lt;p&gt;Those two are the most important, but if you&amp;#x27;re checking for broken links there are a few others you might encounter in
the wild. While this isn&amp;#x27;t an exhaustive list, they&amp;#x27;re the ones you&amp;#x27;ll see most often.&lt;/p&gt;&lt;h3 id=&quot;4xx-errors-aka-you-messed-up&quot;&gt;4xx errors, a.k.a. &amp;quot;You messed up&amp;quot;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;400 Bad Request&lt;/strong&gt; There was something wrong with the request, like an error in the request syntax.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;401 Unauthorized/403 Forbidden&lt;/strong&gt; Both can be used to indicate a user does not have the rights to access this link, for example because they&amp;#x27;re not logged in yet.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;404 Not Found&lt;/strong&gt; as mentioned, this means the URL doesn&amp;#x27;t exist.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;405 Method not Allowed&lt;/strong&gt; Some URLS can only be accessed with a GET or a POST, but you used a different method.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;410 Gone&lt;/strong&gt; Like a 404, but explicity communicates that there &lt;em&gt;was&lt;/em&gt; a resource and it&amp;#x27;s now been removed.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;429 Too Many Requests&lt;/strong&gt; Some servers might rate limit how often you can open a URL to prevent abuse, they can use this status code.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;451 Unavailable for Legal Reasons&lt;/strong&gt; When a URL is not available because of some legal demand. &amp;quot;Fun&amp;quot; fact: the error code is a reference to the novel &lt;em&gt;Fahrenheit 451&lt;/em&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;5xx-errors-aka-we-messed-up&quot;&gt;5xx errors, a.k.a. &amp;quot;We messed up&amp;quot;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;500 Internal Server Error&lt;/strong&gt; As mentioned, the server crashed while trying to respond.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;501 Not Implemented&lt;/strong&gt; Usually used to indicate something will eventually be implemented.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;502 Bad Gateway&lt;/strong&gt; When the server is used as a proxy or gateway, but it got a bad response from the server it was proxying too. For example when you run Nginx as a proxy for a Django, Rails or Express.js server, and that server is down.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;503 Service Unavailable&lt;/strong&gt; Usually sent when the server is over capacity (too many requests, not enough memory, etc.)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There&amp;#x27;s (much) more error codes than just these (like &lt;code class=&quot;language-text&quot;&gt;418 I&amp;#x27;m a teapot&lt;/code&gt;, look it up), but they&amp;#x27;re the ones you see most often &amp;quot;in the wild&amp;quot;.&lt;/p&gt;&lt;h3 id=&quot;3xx-status-codes-look-elsewhere&quot;&gt;3xx status codes: &amp;quot;Look elsewhere&amp;quot;&lt;/h3&gt;&lt;p&gt;When you start testing for broken links you&amp;#x27;ll soon find URLs returning a code in the 3xx range. Those are used to indicate
a resource has moved, either temporarily or permanently. While not a big issue (the URLs still work) these are nice to fix, as
you don&amp;#x27;t know if the redirects will be available forever, and there is a (tiny) performance cost because your browser
needs to send a second request to the correct URL.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;301 Moved Permanently&lt;/strong&gt; Used to indicate that the resource has moved to this new location forever. Due to the way the spec was written, a 301 can switch from a POST to a GET.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;302 Found&lt;/strong&gt; Used to indicate that the resource is now moved elsewhere. While this one is still in widespread use, you should really use either 303 or 307.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;303 See Other&lt;/strong&gt; Replaces 302 specifically in the situations where you can GET the resource elsewhere.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;304 Not Modified&lt;/strong&gt; If the resource hasn&amp;#x27;t changed, your browser can safely get it from the Cache for a faster turnaround.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;307 Temporary redirect&lt;/strong&gt; Same as 302 Found but more explicit in its intent. You can not change the HTTP Method (so a POST stays a POST).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;308 Permanent redirect&lt;/strong&gt; Same as 301 Moved Permanently but more explicit in its intent. You can not change the HTTP Method (so a POST stays a POST).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Some of these are a little vague and seem to overlap, because some details do not really have a material effect on how your browser behaves.&lt;/p&gt;&lt;p&gt;In practice, you&amp;#x27;ll see &lt;strong&gt;301&lt;/strong&gt; and &lt;strong&gt;302&lt;/strong&gt; the most, though I assume that will slowly switch over to &lt;strong&gt;307&lt;/strong&gt; and &lt;strong&gt;308&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;With that little primer out of the way, lets discover how to find and fix broken links in Polypane.&lt;/p&gt;&lt;h2 id=&quot;broken-links-in-the-outline-panel&quot;&gt;Broken links in the Outline panel&lt;/h2&gt;&lt;p&gt;When you open a page in Polypane, the Outline panel parses it to find all the links on the page. To head to the Outline panel,
first open the side panel (with ctrl/cmd shift +p, or by clicking the side panel button in the header), going to &amp;quot;Info&amp;quot; and then to
the &amp;quot;Outline&amp;quot; tab. By default, Polypane shows the list of headers, but click the dropdown to switch to &amp;quot;links&amp;quot;. Make sure &amp;quot;Show issues&amp;quot; is checked.&lt;/p&gt;&lt;img alt=&quot;Outline panel overview&quot; src=&quot;/blogs/brokenlinks/outline.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;The links are shown in
order with their accessible text content and the URL they go to, this is a great overview to check if all your links have
names that make sense (and that they&amp;#x27;re not all just &amp;quot;Read more&amp;quot;).&lt;/p&gt;&lt;p&gt;At the same time, Polypane is checking each URL to detect which status code is returned.&lt;/p&gt;&lt;p&gt;When it&amp;#x27;s done, it will prefix the status to each URL:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;White text on a red background is a big issue, like a broken link.&lt;/li&gt;&lt;li&gt;Red text is a minor issue, like a redirect or server issue.&lt;/li&gt;&lt;li&gt;A checkmark means everything is okay (we got a 200 status code).&lt;/li&gt;&lt;li&gt;A question mark means we couldn&amp;#x27;t verify a url because it was blocked or returned a 429 status code.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;fixing-big-issues&quot;&gt;Fixing big issues&lt;/h3&gt;&lt;p&gt;Obviously, fixing broken links (those with a 404) are highest priority:&lt;/p&gt;&lt;img alt=&quot;Example of the broken links&quot; src=&quot;/blogs/brokenlinks/brokenlinks.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;Find out why a url is now offline and where it was moved too (old urls not properly redirecting happens more often than
you think), find a suitable alternative or remove the link from your page altogether.&lt;/p&gt;&lt;h3 id=&quot;fixing-minor-issues&quot;&gt;Fixing minor issues&lt;/h3&gt;&lt;p&gt;Server issues are big problems but usually not something you can directly do something about (unless it happens on your server!)
If the server error comes from a third party website, be kind and let them know which URLs are broken (or point them to Polypane. ;)&lt;/p&gt;&lt;p&gt;It shouldn&amp;#x27;t be a high priority to fix 301 or 302 (or 307/308) but usually it&amp;#x27;s an easy fix. A really common one is the
link not ending in a &lt;code class=&quot;language-text&quot;&gt;/&lt;/code&gt;, but the server automatically adding one to all URLs.&lt;/p&gt;&lt;p&gt;For example, the &amp;quot;articles&amp;quot; link in the main navigation on Smashing Magazine is missing that &lt;code class=&quot;language-text&quot;&gt;/&lt;/code&gt;:&lt;/p&gt;&lt;img alt=&quot;Example of an unneeded redirect&quot; src=&quot;/blogs/brokenlinks/301.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;The actual URL is &lt;code class=&quot;language-text&quot;&gt;/articles/&lt;/code&gt;, with the &lt;code class=&quot;language-text&quot;&gt;/&lt;/code&gt; at the end. When they add that &lt;code class=&quot;language-text&quot;&gt;/&lt;/code&gt; in the HTML, the redirect is solved.&lt;/p&gt;&lt;p&gt;Not all redirects can be solved however, as some might be contextual. The links to our dashboard for example might
redirect you to log in, and otherwise to the main account overview.&lt;/p&gt;&lt;h2 id=&quot;other-issues-with-links&quot;&gt;Other issues with links&lt;/h2&gt;&lt;p&gt;There are two other issues that the Outline panel will highlight: not using HTTPS and missing a &lt;code class=&quot;language-text&quot;&gt;rel=&amp;quot;noopener&amp;quot;&lt;/code&gt; link.&lt;/p&gt;&lt;h3 id=&quot;not-using-https&quot;&gt;Not using HTTPS&lt;/h3&gt;&lt;p&gt;Using HTTPS makes the web more secure and more private, but it&amp;#x27;s an easy mistake to link to the HTTP version of a URL
since it usually forwards to HTTPS anyway.&lt;/p&gt;&lt;p&gt;It&amp;#x27;s such an easy mistake, the offical website of the White House made it right in the middle of their homepage (this has since been fixed):&lt;/p&gt;&lt;img alt=&quot;Screenshot of the whitehouse.gov website with the link to Twitter circled&quot; src=&quot;/blogs/brokenlinks/nohttps.jpg&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;img alt=&quot;That same link with a &amp;#x27;no-https&amp;#x27; badge in the Outline panel&quot; src=&quot;/blogs/brokenlinks/nohttps2.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;Any URL that does not use HTTPS will have a &amp;quot;non-HTTPS&amp;quot; badge visible. For example, the link to
&lt;a href=&quot;https://latinotype.com&quot;&gt;Latinotype&lt;/a&gt; in the &lt;a href=&quot;https://smashingmagazine.com&quot;&gt;SmashingMagazine footer&lt;/a&gt; is using HTTP, despite
both sites supporting HTTPS:&lt;/p&gt;&lt;img alt=&quot;Example of the &amp;#x27;no HTTPS&amp;#x27; badge&quot; src=&quot;/blogs/brokenlinks/nohttps.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;h3 id=&quot;using-target_blank-without-relnoopener&quot;&gt;Using &lt;code class=&quot;language-text&quot;&gt;target=&amp;quot;_blank&amp;quot;&lt;/code&gt; without &lt;code class=&quot;language-text&quot;&gt;rel=&amp;quot;noopener&amp;quot;&lt;/code&gt;&lt;/h3&gt;&lt;p&gt;When you add &lt;code class=&quot;language-text&quot;&gt;target=&amp;quot;_blank&amp;quot;&lt;/code&gt; to open it in in a new tab, you are actually giving the page you opened access to your
window object, which is a security risk. You can prevent this by adding &lt;code class=&quot;language-text&quot;&gt;rel=&amp;quot;noopener&amp;quot;&lt;/code&gt; to the same link.&lt;/p&gt;&lt;p&gt;Firefox since version 79 and Chrome since 88 have added this to URLs by default, but users using older browser like
Edge Legacy or Internet Explorer are still at risk, so Polypane warns you about this issue too.&lt;/p&gt;&lt;img alt=&quot;Example of the missing rel warning&quot; src=&quot;/blogs/brokenlinks/rel.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;We show a warning for URL that uses &lt;code class=&quot;language-text&quot;&gt;target=&amp;quot;_blank&amp;quot;&lt;/code&gt; but does not have a &lt;code class=&quot;language-text&quot;&gt;rel=&amp;quot;noopener&amp;quot;&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;rel=&amp;quot;noreferrer&lt;/code&gt; attribute.&lt;/p&gt;&lt;h2 id=&quot;try-it-for-yourself&quot;&gt;Try it for yourself&lt;/h2&gt;&lt;p&gt;Polypane is available with a 14 day free trial, enough time to check all the pages on your site. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Start a trial now&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 5.1: Web components support]]></title><description><![CDATA[Polypane 5.1 introduces support for web components across the application, many improvements to the Outline panel and Contrast checker…]]></description><link>https://polypane.app/blog/polypane-5-1-web-components-support/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-5-1-web-components-support/</guid><pubDate>Thu, 01 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 5.1 introduces support for web components across the application, many improvements to the Outline panel and Contrast checker. There an updates to the Chromium version, Google fonts list and accessibility ruleset.&lt;/p&gt;&lt;h2 id=&quot;web-component-support&quot;&gt;Web component support&lt;/h2&gt;&lt;p&gt;Polypane now has support for web components throughout the application: you can reach into them with the element inspector, inspect and edit them in the Elements panel and all the outline panel lists like headings, links and focus order support web components too.&lt;/p&gt;&lt;p&gt;Because web components are basically engineered to be as isolated from the rest of the page this was quite a lot of work, but it&amp;#x27;s an important part of the modern web.&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-5-1/webcomponents.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;Video showing the elements panel inspecting and editing inside web components&lt;/video&gt;&lt;h2 id=&quot;outline-panel-updates&quot;&gt;Outline panel updates&lt;/h2&gt;&lt;p&gt;As mentioned, all overviews now support web components, so you might see a different list compared to Polypane 5 if you use web components.&lt;/p&gt;&lt;p&gt;The outline panel Heading overview has additional warnings for a missing &lt;code class=&quot;language-text&quot;&gt;h1&lt;/code&gt; element and empty, hidden or presentational headings are badged for context.&lt;/p&gt;&lt;p&gt;The Links checker now supports links that are missing a protocol (starting a link with &lt;code class=&quot;language-text&quot;&gt;//&lt;/code&gt; uses the same protocol as the current page) or contain &lt;code class=&quot;language-text&quot;&gt;./&lt;/code&gt; somewhere in the url.&lt;/p&gt;&lt;h2 id=&quot;contrast-checker-updates&quot;&gt;Contrast checker updates&lt;/h2&gt;&lt;p&gt;The contrast checker debug tool has been updated to provide less false positives (where the calculated contrast ratio shows as 1) and labels now stick to elements if they&amp;#x27;re fixed or sticky.&lt;/p&gt;&lt;h2 id=&quot;new-performance-options-and-notification&quot;&gt;New performance options and notification&lt;/h2&gt;&lt;p&gt;Polypane now warns you if your site has an excessive amount of CSS. We defined that at 10.000 unique rule sets (a rule set is a css selector and all its properties together). At 10K unique rule sets/selectors, Polypane has to do a lot of work in parsing all the CSS to provide the features we do. In the future we might disable certain features in Polypane to keep everything performant.&lt;/p&gt;&lt;p&gt;The performance options now have a clear all button to quickly reset all options, and a &amp;quot;keep in first pane&amp;quot; option so you can disable resource intensive features across panes but keep them visible in one of them.&lt;/p&gt;&lt;h2 id=&quot;get-polypane-51&quot;&gt;Get Polypane 5.1&lt;/h2&gt;&lt;p&gt;Polypane updates automatically on both Mac and Windows. Linux users need to download the new version from
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a free 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register/&quot;&gt;Get it here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;full-changelog&quot;&gt;Full changelog&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Full support for Web components in Element inspector&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Full support for Web components in Outline panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Performance warning for sites with 10K+ CSS selectors&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Added CSS Stacking Context devtools extension&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Inspect element in Chromium devtools from the Elements panel (Thanks Roel!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Heading overview gives warnings for empty, hidden and presentational headings&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Heading overview gives warning if there is no h1 on the page&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Performance options have a reset button and a &amp;quot;keep in first pane&amp;quot; option&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; More performant scroll sync for sites with smooth scrolling enabled&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Contrast checker shows less false positives&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Contrast checker labels stick to fixed elements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated Chromium to 89.0.4389.90&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Breakpoint panels warning limit changed from 16 to 20&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated Google Fonts list&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Links panel can now check links with &amp;quot;./&amp;quot; in them&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Links panel can now check links without a protocol&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Facebook preview rendering improved for sites without og:image&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Twitter preview rendering improved for sites without twitter:image&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Keyboard focus styling across the app&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated accessibility panel ruleset&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Errors messages consistency in the Meta panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Tab order in Pane header&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Reference image now takes visible rulers into account&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Polypane console panel now uses same fonts as devtools console (Thanks Lars!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Reloading devtools extensions now always forces a redownload&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Automatically open Chromium devtools when switching to the devtools panel and there is just one pane&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Prevent caret from changing position when editing style and attributes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Move Twitter preview to the top of the Social previews&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Added support for clamp() in style editor&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Node tooltip rendering consistency&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Icon and tab alignment in the header&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Rendering of inspect button right click menu&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Rename Header overview to Heading overview (Thanks Roel!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel now shows doctype&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Address bar can no longer get cleared when you&amp;#x27;re typing in it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Context menu now has copy option for selected text&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Installed devtools extensions on Windows sometimes caused app not to load (Thanks Michael!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Crash when console popup couldn&amp;#x27;t be rendered (Thanks Fabio!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Context menu in Chromium devtools was not visible&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Many typos (Thanks Roel!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Full layout on Mac and Windows showed white bar at the bottom (Thanks Bjoern!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Display DOM tree for pages without a doctype&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; 1px overlap of buttons in menus causing flickering (Thanks Niels!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Flyout menus on windows were broken (Thanks Warren!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Error when loading Polypane with layout debugging active (Thanks Sam!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Deleting attributes from elements panel didn&amp;#x27;t work&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Updating numbers in a calc() sometimes resulted in NaN&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Tota11y is no longer loaded twice after navigation in SPA&amp;#x27;s&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Overview screenshot sometimes generated empty image (Thanks Darius!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Reference image no longer renders behind website&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; issue where reload in subframes caused main URL to update&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Checking webpage quality in 5 minutes with Polypane]]></title><description><![CDATA[In this article we'll check the quality of a web page in about 5 minutes, from meta info to accessibility. Polypane has many features that…]]></description><link>https://polypane.app/blog/checking-webpage-quality-in-5-minutes-with-polypane/</link><guid isPermaLink="false">https://polypane.app/blog/checking-webpage-quality-in-5-minutes-with-polypane/</guid><pubDate>Mon, 29 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In this article we&amp;#x27;ll check the quality of a web page in about 5 minutes, from meta info to accessibility. Polypane has many features that make it easy to see different parts of your site, inspect them for issues and it will even tell you how to improve any issues it finds.&lt;/p&gt;&lt;p&gt;Because Polypane is completely made for building and testing websites all the tools are easily accessible. You won&amp;#x27;t need to dig into the browser devtools, have your site be publicly accessible or wait for a spot on slow online tools. Just open Polypane, type in the URL (even localhost) of the page you want to check and go!&lt;/p&gt;&lt;p&gt;Here&amp;#x27;s 5 topics that each will take you a minute to check:&lt;/p&gt;&lt;h2 id=&quot;minute-1-visual-issues&quot;&gt;Minute 1: visual issues&lt;/h2&gt;&lt;p&gt;First we&amp;#x27;ll take a look at how things ...look. By checking our page across different screen sizes we get a quick overview of any glaring visual issues.&lt;/p&gt;&lt;h3 id=&quot;quick-overview&quot;&gt;Quick overview&lt;/h3&gt;&lt;p&gt;We&amp;#x27;ll begin with a spot check to make sure that there is nothing obviously broken.&lt;/p&gt;&lt;img alt=&quot;Most used sizes worldwide highlighted in the panel&quot; src=&quot;/blogs/5mintest/mostusedsizes.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:min(100%, 40rem)&quot;/&gt;&lt;h4 id=&quot;1-switch-to-the-most-used-sizes-worldwide-workspace&quot;&gt;1. Switch to the &amp;quot;Most used sizes worldwide&amp;quot; workspace.&lt;/h4&gt;&lt;p&gt;Open &lt;a href=&quot;/docs/intro-to-panel/&quot;&gt;the side panel&lt;/a&gt;, then switch to &lt;a href=&quot;/docs/workspace-management/&quot;&gt;workspaces&lt;/a&gt;, &lt;a href=&quot;/docs/workspace-management/#default-workspaces&quot;&gt;default&lt;/a&gt; and select the &amp;quot;Most used sizes worldwide&amp;quot; workspace.&lt;/p&gt;&lt;h4 id=&quot;2-scroll-through-them-to-see-if-everything-renders-correctly&quot;&gt;2. Scroll through them to see if everything renders correctly.&lt;/h4&gt;&lt;p&gt;You only need to scroll in a single pane, all the other panes will follow. You can always &lt;a href=&quot;/docs/global-zoom/&quot;&gt;zoom out&lt;/a&gt; to get all the panes in one overview by dragging the slider in the top right of the application.&lt;/p&gt;&lt;h4 id=&quot;3-check-for-hidden-overflow-issues&quot;&gt;3. Check for hidden overflow issues&lt;/h4&gt;&lt;p&gt;Press &lt;code class=&quot;language-text&quot;&gt;ctrl + d&lt;/code&gt; (or &lt;code class=&quot;language-text&quot;&gt;cmd + d&lt;/code&gt; on macOS) to turn on &lt;a href=&quot;/docs/layout-debugging/&quot;&gt;Layout debugging&lt;/a&gt;. This draws boxes around all your elements so you can fix layout issues easily, but it also checks the entire page for elements that are too wide and cause an unprofessional looking horizontal scrollbar. If you have elements like that, Layout debugging will make them bright red.&lt;/p&gt;&lt;img alt=&quot;Layout debugging preview&quot; src=&quot;/blogs/5mintest/layoutdebugging.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:min(100%, 40rem)&quot;/&gt;&lt;h3 id=&quot;drilling-down-a-bit&quot;&gt;Drilling down a bit&lt;/h3&gt;&lt;p&gt;We just checked the most used sizes worldwide, but it&amp;#x27;s also important to check the sizes our site is actually optimized for. Polypane automatically detects all the &lt;a href=&quot;/docs/breakpoints/&quot;&gt;CSS Breakpoints&lt;/a&gt; that a web page uses and creates panes for that. We&amp;#x27;ll switch to that and redo the layout spot check again.&lt;/p&gt;&lt;img alt=&quot;Breakpoint button and its context menu&quot; src=&quot;/blogs/5mintest/breakpoints.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem 0 2rem 2rem;display:block;float:right;max-width:min(100%, 40rem)&quot;/&gt;&lt;h4 id=&quot;1-switch-to-breakpoint-panes-in-the-header&quot;&gt;1. Switch to breakpoint panes in the header.&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Tip: right click the icon for an overview of all breakpoints.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This will use the sizes your website is optimised for. Get a warning that there&amp;#x27;s too many? That&amp;#x27;s something to look into, there&amp;#x27;s probably ways to combine them in your CSS and simplify your styling. Click &amp;quot;simplified breakpoints&amp;quot; in the warning and use that instead: it will take all your breakpoints and create 5 screen sizes that span the range of your CSS breakpoints.&lt;/p&gt;&lt;h4 id=&quot;2-scroll-through-them-to-see-if-everything-renders-correctly-1&quot;&gt;2. Scroll through them to see if everything renders correctly.&lt;/h4&gt;&lt;p&gt;Again, scroll in any of the panes to scroll in all of them, and adjust the global zoom level as needed.&lt;/p&gt;&lt;h4 id=&quot;3-turn-on-layout-debugging&quot;&gt;3. Turn on layout debugging.&lt;/h4&gt;&lt;p&gt;Scroll through the page again. Red areas highlight elements causing horizontal scrolling.&lt;/p&gt;&lt;p&gt;That was minute one. We now have a global overview of how our layout is performing at different sizes and whether there are any layout issues we should definitely look into.&lt;/p&gt;&lt;h2 id=&quot;minute-2-meta-information&quot;&gt;Minute 2: Meta information&lt;/h2&gt;&lt;p&gt;Meta information is the information search engines like Google and social media like Twitter and Facebook use to display information about your site. So it&amp;#x27;s pretty important. But unfortunately that information is hard to see in a browser. Typos are quickly made and only discovered when it&amp;#x27;s already too late.&lt;/p&gt;&lt;p&gt;Polypane can &lt;a href=&quot;/docs/meta-information/&quot;&gt;check the meta information&lt;/a&gt; of any page. That includes pages that aren&amp;#x27;t even available publicly yet, like your localhost.&lt;/p&gt;&lt;h3 id=&quot;lets-check-the-meta-info&quot;&gt;Let&amp;#x27;s check the meta info.&lt;/h3&gt;&lt;p&gt;Open the side panel again and go to the Info tab, then the Meta tab.&lt;/p&gt;&lt;img alt=&quot;Meta overview of this page as shown in Polypane&quot; src=&quot;/blogs/5mintest/metapanel.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:min(100%, 40rem)&quot;/&gt;&lt;p&gt;The top part of the panel shows you a quick overview of the meta info. Check the following things:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Is there a favicon?&lt;/li&gt;&lt;li&gt;Do the title and description have typos?&lt;/li&gt;&lt;li&gt;Are the title and description too long or too short? Don&amp;#x27;t worry, we&amp;#x27;ll tell you when this is the case.&lt;/li&gt;&lt;li&gt;Do we have a language, charset and canonical URL set?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Is something missing or giving warnings? Consider adding or fixing these for better SEO.&lt;/p&gt;&lt;h3 id=&quot;drilling-down-a-bit-on-the-meta-info&quot;&gt;Drilling down a bit on the meta info&lt;/h3&gt;&lt;p&gt;From here, click open the various items like &amp;quot;Open graph tags&amp;quot;, &amp;quot;Twitter tags&amp;quot; et cetera. We&amp;#x27;re going for speed so just check if there&amp;#x27;s a warning icon somewhere. These indicate duplicates or other issues and you should make sure to remove or fix them (keeping the one with the right value.)&lt;/p&gt;&lt;h4 id=&quot;social-media-previews&quot;&gt;Social media previews&lt;/h4&gt;&lt;p&gt;The social media previews in Polypane are pixel-perfect so you can be sure that they render correctly (even if your site isn&amp;#x27;t on the right domain yet!). Lets go over what to check:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Do Twitter and Facebook have a nice, large image?&lt;/li&gt;&lt;li&gt;Does the image fit everywhere, or are some parts cut off?&lt;/li&gt;&lt;li&gt;Check for typos in the Twitter and Facebook titles and descriptions.&lt;/li&gt;&lt;li&gt;Is the Facebook description visible? If not, your title is too long. This can also be intentional, but be sure to check!&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;img src=&quot;/blogs/polypane-2-1/previews.png&quot; alt=&quot;social media previews for Doka&quot;/&gt;&lt;/p&gt;&lt;p&gt;All the other social media (Slack, LinkedIn, Discord and Telegram) use the values from Twitter and Facebook so if those look good, then the others will too.&lt;/p&gt;&lt;h2 id=&quot;minute-3-take-a-sip-of-water-and-check-your-console&quot;&gt;Minute 3: take a sip of water and check your console&lt;/h2&gt;&lt;p&gt;After all, it&amp;#x27;s important to stay hydrated.&lt;/p&gt;&lt;p&gt;We&amp;#x27;re going to stay in the Side panel for this one. Let&amp;#x27;s switch to the &lt;a href=&quot;/docs/console/&quot;&gt;Console tab&lt;/a&gt; in the side panel under Edit. How does it look? Does it have a lot of messages? Are there any warnings (with a yellow background and a warning sign) or errors (with a red background and an error sign)?&lt;/p&gt;&lt;p&gt;Ideally this tab would be completely empty, but sometimes there are still &lt;code class=&quot;language-text&quot;&gt;console.log&lt;/code&gt;s around the code, or third party JS sends some debugging information. They don&amp;#x27;t do harm but if you can, you should get rid of them.&lt;/p&gt;&lt;p&gt;If there&amp;#x27;s warnings or errors however, those can have unintended consequences or even cause your site to stop working. That&amp;#x27;s something to fix.&lt;/p&gt;&lt;h2 id=&quot;minute-4-seo-and-links&quot;&gt;Minute 4: SEO and links&lt;/h2&gt;&lt;p&gt;Real quick, take a look at the address bar. Are you using &lt;strong&gt;HTTPS&lt;/strong&gt;? Great, then let&amp;#x27;s continue.&lt;/p&gt;&lt;p&gt;If not, do something about that: HTTPS websites are more secure and HTTPS increases your visitors privacy. As a bonus: using HTTPS makes you rank better in many search engines!&lt;/p&gt;&lt;h3 id=&quot;inspect-the-page-structure&quot;&gt;Inspect the page structure&lt;/h3&gt;&lt;p&gt;Time to open the &lt;a href=&quot;/docs/outline-panel/&quot;&gt;Outline panel&lt;/a&gt; under Info, because we&amp;#x27;re going to check the page structure to see if there are any issues.&lt;/p&gt;&lt;img alt=&quot;Outline of all headers on this page&quot; src=&quot;/blogs/5mintest/headers.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem 0 2rem 2rem;display:block;float:right;max-width:min(100%, 22rem)&quot;/&gt;&lt;h4 id=&quot;first-pass-see-any-issues-in-this-panel-fix-those&quot;&gt;First pass: See any issues in this panel? Fix those.&lt;/h4&gt;&lt;p&gt;The Outline panel opens to the headings panel by default, which shows you the hierarchy and content of all headings. Are there any warnings visible, like skipped levels? Or do you see headings that are missing text or have text you don&amp;#x27;t expect? Polypane shows the &lt;em&gt;accessible name&lt;/em&gt; here, which is what assistive technologies read out as the title.&lt;/p&gt;&lt;h4 id=&quot;second-pass-does-the-general-flow-of-the-headings-make-sense-to-you-and-do-the-headings-themselves-make-sense&quot;&gt;Second pass: Does the general flow of the headings make sense to you? And do the headings themselves make sense?&lt;/h4&gt;&lt;p&gt;If they don&amp;#x27;t make sense on their own, consider rewriting them. Most users of assistive technologies use headings to go through your page and they&amp;#x27;re also the most valuable parts of your page for search engines. When it comes to headings, you have to make the words count.&lt;/p&gt;&lt;div style=&quot;clear:both&quot;&gt;&lt;/div&gt;&lt;h3 id=&quot;check-for-issues-with-links&quot;&gt;Check for issues with links&lt;/h3&gt;&lt;img alt=&quot;Outline of all links on this page&quot; src=&quot;/blogs/5mintest/links.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem 0 2rem 2rem;display:block;float:right;max-width:min(100%, 22rem)&quot;/&gt;&lt;p&gt;Click the drop down in the top right of the outline panel to switch to &lt;a href=&quot;/docs/outline-panel/#links&quot;&gt;Links&lt;/a&gt;. Take another sip of water while Polypane checks &lt;strong&gt;all the URLs on your page&lt;/strong&gt;. Done? Great, let&amp;#x27;s go through them.&lt;/p&gt;&lt;h4 id=&quot;1-are-there-any-broken-links&quot;&gt;1. Are there any broken links?&lt;/h4&gt;&lt;p&gt;Problematic errors, like a 404 or a 500 get a red background and are things you definitely want to fix.&lt;/p&gt;&lt;h4 id=&quot;2-check-the-list-for-badges-and-warnings&quot;&gt;2. Check the list for badges and warnings.&lt;/h4&gt;&lt;p&gt;Polypane warns you for some issues when it comes to links, like when they&amp;#x27;re missing, well, a link, or when they don&amp;#x27;t use HTTPS. Are there any warnings visible?&lt;/p&gt;&lt;h4 id=&quot;3-are-there-any-other-links-that-dont-have-a-checkmark&quot;&gt;3. Are there any other links that don&amp;#x27;t have a checkmark?&lt;/h4&gt;&lt;p&gt;These are almost all redirect issues (HTTP status codes that start with a &amp;quot;3&amp;quot;). They&amp;#x27;re not super problematic but are nice to fix. Most of them will likely need a &amp;quot;/&amp;quot; added to the end.&lt;/p&gt;&lt;h2 id=&quot;minute-5-last-but-absolutely-not-least-accessibility&quot;&gt;Minute 5: Last but &lt;em&gt;absolutely&lt;/em&gt; not least: Accessibility&lt;/h2&gt;&lt;p&gt;Accessibility is the bedrock of a good website. Without it, nothing else you do will matter. It&amp;#x27;s at the core of a good user experience, good SEO and even performance. And Polypane brings the tools to make sure everything is in order.&lt;/p&gt;&lt;img alt=&quot;Part of the HTML5 Document Outline on this page&quot; src=&quot;/blogs/5mintest/outline.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem 0 2rem 2rem;display:block;float:right;max-width:min(100%, 22rem)&quot;/&gt;&lt;h3 id=&quot;check-the-document-outline&quot;&gt;Check the document outline&lt;/h3&gt;&lt;p&gt;We already checked a few accessibility issues by making sure our headings look good, but lets switch to &amp;quot;&lt;a href=&quot;/docs/outline-panel/#document-outline&quot;&gt;Document outline&lt;/a&gt;&amp;quot; in the Outline panel. This shows your site using the HTML5 document outline algorithm. What we&amp;#x27;re looking for here is if it makes sense in general. The HTML5 document outline combines landmarks (elements like &lt;code class=&quot;language-text&quot;&gt;nav&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;main&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;aside&lt;/code&gt;) with headings. Does this look good, is anything highlighted, indented incorrectly, missing content or have weird titles?&lt;/p&gt;&lt;h3 id=&quot;run-an-automated-accessibility-test&quot;&gt;Run an automated accessibility test&lt;/h3&gt;&lt;p&gt;Automated accessibility tests don&amp;#x27;t guarantee your page is accessible but they&amp;#x27;re a good start. So switch to the &lt;a href=&quot;/docs/accessibility-panel/&quot;&gt;Accessibility panel&lt;/a&gt;, run a test (maybe take a sip of water again) and see if there&amp;#x27;s issues that crop up. The tests Polypane runs are a combination of WCAG and best practices.&lt;/p&gt;&lt;p&gt;Don&amp;#x27;t have any issues? Click the button, you earned it. (Click it again).&lt;/p&gt;&lt;p&gt;Did you find issues? No problem! We identified them so now we can fix them. Note especially the Critical and Serious issues, those are the ones you want to start with. Common issues here are images with missing &lt;code class=&quot;language-text&quot;&gt;alt&lt;/code&gt; attributes and color contrast issues.&lt;/p&gt;&lt;p&gt;Missing alt attributes are usually an easy fix. Go over them and if an image is decorative add an empty &lt;code class=&quot;language-text&quot;&gt;alt&lt;/code&gt; attribute (&lt;code class=&quot;language-text&quot;&gt;alt=&amp;quot;&amp;quot;&lt;/code&gt;) to indicate it&amp;#x27;s decorative. Otherwise, make sure to add a description that explains the content of the image so that it makes sense for people that can&amp;#x27;t see it.&lt;/p&gt;&lt;h3 id=&quot;contrast-issues&quot;&gt;Contrast issues&lt;/h3&gt;&lt;p&gt;For contrast issues though, we&amp;#x27;ll switch over to a more convenient view. Pick a pane (it&amp;#x27;s easiest if you pick one of the larger ones), click the &lt;a href=&quot;/docs/debug-tools/&quot;&gt;Debug Tools&lt;/a&gt; icon (&lt;img src=&quot;/blogs/5mintest/debugtools.png&quot; alt=&quot;debug tools icon&quot;/&gt;)and select the &lt;a href=&quot;/docs/debug-tools/#contrast-checker&quot;&gt;Contrast checker&lt;/a&gt; debug tool. That will go through your page and test all your text for contrast issues, then show a red label for any text without enough contrast.&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-5/copy-color.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;Previewing a color contrast suggestion and clicking it to copy the color value.&lt;/video&gt;&lt;p&gt;Note down any elements with a red label. If they show a little arrow (➜) it means Polypane has a suggestion. It has determined the closest color that does have enough contrast and you can copy it with a single click. Easier than going back to your designer or trying out different colors one by one!&lt;/p&gt;&lt;h3 id=&quot;focus-order&quot;&gt;Focus order&lt;/h3&gt;&lt;p&gt;The focus order of your page is the order in which keyboard users tab through your page and is a reflection of your page structure. In Polypane, you can visualize this using the focus order outline. To do that, we go back to the Outline panel and this time select &amp;quot;Focus order&amp;quot; in the dropdown. Check the list to see if there&amp;#x27;s not any highlighted issues, then click the &amp;quot;Show Overlay&amp;quot; button next to the list.&lt;/p&gt;&lt;img alt=&quot;Focus overview overlay&quot; src=&quot;/blogs/polypane-5/focus.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:min(100%, 40rem)&quot;/&gt;&lt;p&gt;This will draw a line from each focusable element to the next in the order that they get focused. Take a look. Does it flow nicely from left to right (for latin scripts), top to bottom? That&amp;#x27;s good! If it jumps around a lot, especially up and down, that&amp;#x27;s potentially confusing. See if there is a way to simplify that by improving your HTML structure.&lt;/p&gt;&lt;p&gt;Of course, these together do not 100% guarantee the accessibility of your web page, but they&amp;#x27;re a couple of different aspects that give you a good idea of how much work there is to do.&lt;/p&gt;&lt;h2 id=&quot;youre-done&quot;&gt;You&amp;#x27;re done!&lt;/h2&gt;&lt;p&gt;With those last checks, you&amp;#x27;re done! You did a complete page quality check in five minutes! (Maybe a little more? who&amp;#x27;s counting anyway)&lt;/p&gt;&lt;p&gt;Take a sip of water and look at the issues you found. Do you need to look more closely at any of them? If not, &lt;a href=&quot;#&quot;&gt;scroll back up&lt;/a&gt; and start over with the next page. ;)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 5: Console popups, performance and focus overview]]></title><description><![CDATA[Polypane 5 is out with new ways to see your console messages, new performance settings and a new focus order overview. It has a new Chromium…]]></description><link>https://polypane.app/blog/polypane-5-console-popups-performance-and-focus-overview/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-5-console-popups-performance-and-focus-overview/</guid><pubDate>Thu, 04 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 5 is out with new ways to see your console messages, new performance settings and a new focus order overview. It has a new Chromium version (89), many performance improvements, updated UI elements and new debug tools.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Polypane is the browser for developing responsive, fast &amp;amp; accessible websites. It has powerful devtools, multiple synced viewports, over 25 debug tools, device emulation, built-in live-reloading and much more. &lt;a href=&quot;/&quot;&gt;More about Polypane&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;console-improvements&quot;&gt;Console improvements&lt;/h2&gt;&lt;p&gt;In Polypane 4 we introduced the &lt;a href=&quot;/docs/console/&quot;&gt;unified console&lt;/a&gt;, a single console for all your panes that smartly combines console messages and that sends console commands to all panes.&lt;/p&gt;&lt;p&gt;In Polypane 5 we&amp;#x27;re bringing the console out of the panel.&lt;/p&gt;&lt;p&gt;Each pane now shows you how many errors, warnings and logs were sent to the console, and new console messages are shown as popups.&lt;/p&gt;&lt;p&gt;With the stats overview you see where console messages come from.&lt;/p&gt;&lt;p&gt;The console message popups are fully interactive just like the ones in the console itself. Hover and click elements to highlight and inspect them, and objects are fully inspectable.&lt;/p&gt;&lt;p&gt;And on the off-chance that you accidentally send a lot of messages to the console (it happens to all of us!), pressing &lt;code class=&quot;language-text&quot;&gt;esc&lt;/code&gt; will quickly hide them all.&lt;/p&gt;&lt;p&gt;We&amp;#x27;ve also improved the rendering of console messages. Polypane now supports &lt;strong&gt;CSS styling in console messages&lt;/strong&gt;: prefix the part of a text that you want to style with &lt;code class=&quot;language-text&quot;&gt;%c&lt;/code&gt;, and add a second string with CSS. Polypane will then apply the CSS styling to the message.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&amp;#x27;%cI am bold and lightgrey with a purple background&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&amp;#x27;font-weight:bold;color:lightgrey;background:purple&amp;#x27;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;See this in action when the &amp;quot;console.log (styled)&amp;quot; button is clicked in the video below:&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-5/console-popups.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;h2 id=&quot;performance&quot;&gt;Performance&lt;/h2&gt;&lt;p&gt;Showing a site many times is going to use more resources than showing it once, there&amp;#x27;s no way around that. So keeping performance at an acceptable level is always important for us at Polypane, and this release too we&amp;#x27;ve found many ways to speed up different aspects of our UI, from page load times to interactions in many of the panels.&lt;/p&gt;&lt;p&gt;But there is a source of performance issues we can&amp;#x27;t fix: Performance of webpages themselves.&lt;/p&gt;&lt;img alt=&quot;Performance settings&quot; src=&quot;/blogs/polypane-5/perf.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem 0 2rem 1rem;display:block;max-width:100%;float:right&quot;/&gt;&lt;p&gt;So we build a performance settings panel to help. Simply put, some CSS and HTML Elements are more taxing than others. Turning them off has a big impact on performance. The performance settings allow you to quickly disable CSS and HTML that is particularly heavy, like CSS animations, or video elements.&lt;/p&gt;&lt;p&gt;The impact of this is really noticable, so we recommend you experiment with this when you notice any performance issues.&lt;/p&gt;&lt;p&gt;Find the Performance settings in the new App Settings menu in the top right of Polypane. The icon of which will show a small gauge when active.&lt;/p&gt;&lt;h2 id=&quot;focus-order-overview&quot;&gt;Focus Order overview&lt;/h2&gt;&lt;p&gt;In the past few releases we&amp;#x27;ve really expanded the &lt;a href=&quot;/docs/outline-panel/&quot;&gt;outline panel&lt;/a&gt; with new headers, links and landmarks overviews.&lt;/p&gt;&lt;p&gt;In 5 we&amp;#x27;re adding a &lt;strong&gt;focus order overview&lt;/strong&gt;. All elements on the page that you can focus with the keyboard, in the order that you tab through them.&lt;/p&gt;&lt;p&gt;Like the other overviews, there are warnings for issues:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Positive tabindex are better avoided.&lt;/li&gt;&lt;li&gt;Any element can be made keyboard focusable by adding &lt;code class=&quot;language-text&quot;&gt;tabindex=0&lt;/code&gt;, but 99% of the time you should probably use a &lt;code class=&quot;language-text&quot;&gt;button&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;a&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;We&amp;#x27;ll also highlight any tabindex values.&lt;/p&gt;&lt;p&gt;This focus order overview also has an overlay to visually follow the tab order in your site to see if it makes sense.&lt;/p&gt;&lt;img alt=&quot;Focus overview overlay&quot; src=&quot;/blogs/polypane-5/focus.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;h2 id=&quot;disable-images-debug-tool&quot;&gt;Disable images debug tool&lt;/h2&gt;&lt;p&gt;We added a new debug tool that disables all images and background images.&lt;/p&gt;&lt;p&gt;This is perfect to verify your layout doesn&amp;#x27;t break when images can&amp;#x27;t be loaded, but also when you&amp;#x27;re &lt;strong&gt;testing email newsletters&lt;/strong&gt;, since many email applications hide images by default.&lt;/p&gt;&lt;img alt=&quot;Disable Images debug tool&quot; src=&quot;/blogs/polypane-5/disable-images.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;h2 id=&quot;ui-updates&quot;&gt;UI updates&lt;/h2&gt;&lt;h3 id=&quot;node-tooltip-redesign&quot;&gt;Node tooltip redesign&lt;/h3&gt;&lt;p&gt;We&amp;#x27;ve improved the node tooltip so the information is now more clearly laid out. It will also show you when an element is keyboard focusable.&lt;/p&gt;&lt;img alt=&quot;Node tooltip screenshot&quot; src=&quot;/blogs/polypane-5/node-tooltip.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;h3 id=&quot;adjusting-text-size&quot;&gt;Adjusting text size&lt;/h3&gt;&lt;p&gt;Many of you have asked for adjustable text sizing in the Polypane interface and you can now do that by going to &amp;quot;Adjust text size&amp;quot; in the View menu. Adjust the text size for the entire interface, or just for the panel. Let us know if this works for you, or if you need more fine-grained control.&lt;/p&gt;&lt;img alt=&quot;Adjust text settings panel&quot; src=&quot;/blogs/polypane-5/adjust-text.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;h3 id=&quot;panel-updates&quot;&gt;Panel updates&lt;/h3&gt;&lt;p&gt;We&amp;#x27;ve updated &lt;strong&gt;the Accessibility panel&lt;/strong&gt; with new rules and now display associated WCAG success criteria for issues.&lt;/p&gt;&lt;p&gt;Along with the focus order outline, &lt;strong&gt;The Outline panel&lt;/strong&gt; has improvements for links and headings.  we now highlight non-https links, empty &lt;code class=&quot;language-text&quot;&gt;href&lt;/code&gt; attributes and support testing relative urls as well. The header outline will now warn you for duplicate header content.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The Meta panel&lt;/strong&gt; features improved rendering for Facebook, Slack, LinkedIn and Discord and updated warnings for missing favicons and other content.&lt;/p&gt;&lt;p&gt;The A11y tab in &lt;strong&gt;the Elements panel&lt;/strong&gt; now highlights if an element is keyboard focusable and has an improved color contrast indicator. When adding new items in the style or attributes tab the value input will automatically size to fit your content.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The Browse panel&lt;/strong&gt; mutes audio on pages when it&amp;#x27;s not visible.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The Live CSS panel&lt;/strong&gt; has two new options to format your CSS using Prettier, and to clear the CSS.&lt;/p&gt;&lt;p&gt;In &lt;strong&gt;the Workspace panel&lt;/strong&gt; Choose to append workspaces instead of replacing your current set of panes.&lt;/p&gt;&lt;h3 id=&quot;isolated-panes-are-now-the-default&quot;&gt;Isolated panes are now the default&lt;/h3&gt;&lt;p&gt;Since Polypane 2 we&amp;#x27;ve supported two types of rendering: the default panes with a shared context, and isolated panes that run in their own context.&lt;/p&gt;&lt;p&gt;Isolated panes had some significant benefits, like emulation options and devtools extensions support. In Polypane 5 this has now become the default mode, and the old mode is now available as &amp;quot;legacy mode&amp;quot; in the edit menu. A few things are still faster in this mode, but for the vast majority of people, the new default is the way to go.&lt;/p&gt;&lt;p&gt;New users will get isolated panes by default, existing users will keep the mode they&amp;#x27;ve been using (though we suggest switching to the new default!)&lt;/p&gt;&lt;h2 id=&quot;pane-header-improvements&quot;&gt;Pane header improvements&lt;/h2&gt;&lt;p&gt;We&amp;#x27;ve changed the Pane header UI with some nice new options.&lt;/p&gt;&lt;img alt=&quot;debug tools&quot; src=&quot;/blogs/polypane-5/debug-tools.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem 0 2rem 1rem;display:block;max-width:100%;float:right&quot;/&gt;&lt;h3 id=&quot;pane-settings-redesigns&quot;&gt;Pane Settings redesigns&lt;/h3&gt;&lt;p&gt;Both the Debug tool settings and Emulation settings were getting very long, so we&amp;#x27;ve split them up into different tabs just like the rulers panel. They take up less space now and we have more room to introduce new features.&lt;/p&gt;&lt;h3 id=&quot;number-inputs-improvements&quot;&gt;Number inputs improvements&lt;/h3&gt;&lt;p&gt;Individual pane zoom levels are now shown as a percentage instead of a multiplier, and all inputs in the pane header and across Polypane now support using modifier keys when increasing or decreasing values.&lt;/p&gt;&lt;p&gt;Use the arrow keys or scrollwheel to go up or down by 1, but hold &lt;code class=&quot;language-text&quot;&gt;shift&lt;/code&gt; and you change the value by 10, &lt;code class=&quot;language-text&quot;&gt;cmd/ctrl&lt;/code&gt; will change by 100 and alt will change by &lt;code class=&quot;language-text&quot;&gt;.1&lt;/code&gt;.&lt;/p&gt;&lt;h3 id=&quot;hiding-the-pane-settings-when-there-is-no-space&quot;&gt;Hiding the pane settings when there is no space&lt;/h3&gt;&lt;p&gt;When panes get too narrow, for example when zooming out, Polypane will hide the pane icons behind a menu button. You can still access them, but they no longer overlap other panes or the close button.&lt;/p&gt;&lt;h2 id=&quot;other-updates&quot;&gt;Other updates&lt;/h2&gt;&lt;h3 id=&quot;chromium-89&quot;&gt;Chromium 89&lt;/h3&gt;&lt;p&gt;Polypane now runs Chromium 89, bringing some cool new features like &lt;code class=&quot;language-text&quot;&gt;aspect-ratio&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;@scroll-timeline&lt;/code&gt; support.&lt;/p&gt;&lt;h3 id=&quot;color-contrast-checker&quot;&gt;Color contrast checker&lt;/h3&gt;&lt;p&gt;Click the suggested color in the color contrast checker debug tool tooltips to copy it to your clipboard.&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-5/copy-color.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;&lt;/video&gt;&lt;h3 id=&quot;new-cli-options&quot;&gt;New CLI options&lt;/h3&gt;&lt;p&gt;Polypane now has two new CLI options:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;--reload&lt;/code&gt; will reload the current page in an open Polypane. If Polypane hasn&amp;#x27;t started, it will just load.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;-g&lt;/code&gt; will launch Polypane without focusing the window.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Combine both to reload in Polypane without focusing the application.&lt;/p&gt;&lt;h3 id=&quot;updates-from-401-402-and-403&quot;&gt;Updates from 4.0.1, 4.0.2 and 4.0.3&lt;/h3&gt;&lt;p&gt;There were a few updates in 4.0.2 and 4.0.3 that we didn&amp;#x27;t officially announce, so we&amp;#x27;ll mention them here as well: Polypane now has a &lt;strong&gt;custom Big Sur icon&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Polypane also has a &lt;strong&gt;universal build&lt;/strong&gt; so it runs extra fast on new Apple M1 machines.&lt;/p&gt;&lt;p&gt;In 4.0.2 we added &lt;strong&gt;automated link checking&lt;/strong&gt; for all links on a page so it&amp;#x27;s really easy to find broken links and redirects.&lt;/p&gt;&lt;p&gt;Polypane&amp;#x27;s view source panel now &lt;strong&gt;formats your source code using Prettier&lt;/strong&gt;. There is a new debug tool that &lt;strong&gt;shows unneeded scrollbars&lt;/strong&gt;, particularly useful for developers on Mac.&lt;/p&gt;&lt;p&gt;Check out the full release notes for these versions here: &lt;a href=&quot;/blog/polypane-4-unified-console-dom-tree-in-elements-panel/#401-changelog&quot;&gt;4.0.1&lt;/a&gt;, &lt;a href=&quot;/blog/polypane-4-unified-console-dom-tree-in-elements-panel/#402-changelog&quot;&gt;4.0.2&lt;/a&gt; and &lt;a href=&quot;/blog/polypane-4-unified-console-dom-tree-in-elements-panel/#403-changelog&quot;&gt;4.0.3&lt;/a&gt;.&lt;/p&gt;&lt;img alt=&quot;Big Sur icon&quot; src=&quot;/blogs/polypane-5/bigsur.jpg&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;h2 id=&quot;get-polypane-5&quot;&gt;Get Polypane 5&lt;/h2&gt;&lt;p&gt;Polypane will automatically update on Mac and Windows. Linux users need to download the new version from
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; and if you&amp;#x27;re on Mac and Windows but don&amp;#x27;t want to wait on the update popup, find
your download there as well.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Don&amp;#x27;t have Polypane yet? There is a free 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Get it here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;full-changelog&quot;&gt;Full Changelog&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Console message popups&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Disable Images placeholder&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Chromium 89&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Performance settings panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Resize the text in the entire UI/panel (Thanks many people!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Isolate pane mode is now the default mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Focus order outline and visual overlay&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; CSS styling support in console messages&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Click a color contrast suggestion to copy it to clipboard&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Polypane &lt;code class=&quot;language-text&quot;&gt;--reload&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;-g&lt;/code&gt; CLI commands (Thanks Mike!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; All number inputs now support modifier keys when increasing/decreasing&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; &amp;quot;r&amp;quot; shortcut to reload&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Global settings panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Disable Hardware acceleration option&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Added more Angular and Vue.js devtools&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; New design for element selector tooltip&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Element selector tooltip shows if element is keyboard focusable&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; More consistent hover syncing&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Support outlining SVG elements in layout debugging&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; empty panes message hides instantly when switching tabs&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Theme switching now changes color-scheme internally as well&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Use more optimized version of React&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Add copy image location and save image context menu items&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Screenshots now use emulation settings (Thanks Rik!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Vertical resizing now takes ruler height into account&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Context menu for inspect element button in header now displays shortcuts&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Split devtools shortcuts to open elements panel/chrome devtools and inspect elements/inspect elements in devtools&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Browser-sync live reloading no longer prevents load event (Thanks Rik!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated A11y.css and fix A11y.css counters&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Pane header icons hide when panes gets too small&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Tabs for pane options and pane debug tools&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Touch toggle now switches between &amp;quot;pointer&amp;quot; and &amp;quot;touch&amp;quot;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; &amp;quot;Online&amp;quot; network setting is now called &amp;quot;No Throttling&amp;quot;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Pane zoom is now done in percentages (Thanks Rik!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel link checking now shows loading indicators&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel link checking now supports relative URLs&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel link checking now shows badge for non-https links&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel link checking now shows badge for empty href attributes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: Removed &amp;quot;H1 should be first heading&amp;quot; rule&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Outline panel: Added rule for headers with duplicate content&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Browse panel is now muted when not visible (Thanks Mico!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Browse panel is now more secure&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: adding new values now auto size to fit content&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: A11y tab improvements: clearer contrast warning, information about keyboard focus&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Workspaces: Support appending workspaces and breakpoint panes (Thanks Sam!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Slack, Linkedin and Discord meta preview rendering improvements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Facebook social media preview style updates&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel: Highlight missing favicon in Meta panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Source panel HTML formatting is much faster now&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Live CSS Panel now has buttons for code formatting and clearing.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Accessibility panel has updated rule set&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Accessibility panel now shows related WCAG success criteria (Thanks Dave!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Info pane: Performance improvements for large HTML files (Thanks Andrew!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; New &amp;quot;Open location&amp;quot; menu item (Thanks Jacob!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; macOS shortcuts not being released when closing the Polypane window&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Height of panes in horizontal mode did not fit in certain situations (Thanks Sam!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Support multi-line text content editing in Elements panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Show CSRF warning for Ruby on Rails in Legacy mode (Thanks Bob!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; issue where two panes would end up having the same id&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where CSS on &amp;lt;html&amp;gt; element was being overwritten&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where vertical guides would overwrite horizontal guides&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; You no longer need to move out of a pane and back in to trigger chromium devtools inspection&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Horizontal overflow issue in Meta panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Deleting devtools extensions works again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Scroll to element on hover now works in default mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where the placeholdifier debug tool did not apply to top level elements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Opening URLs from the command line&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; prevent crash when opening &lt;code class=&quot;language-text&quot;&gt;about:blank&lt;/code&gt; through browser extensions (Thanks Michael!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent error on pages with missing doctypes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Element panel now shows all styles again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent error when hovering color contrast label&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Re-apply emulation settings after new iframes get added to a document&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[How Maurits Meester combines front-end development with beer]]></title><description><![CDATA[Maurits is a freelance front-end developer and co-founder of  Brouwerij Victorie , a brewery in Amsterdam with a gorgeous website. We spoke…]]></description><link>https://polypane.app/blog/how-maurits-meester-combines-front-end-development-with-beer/</link><guid isPermaLink="false">https://polypane.app/blog/how-maurits-meester-combines-front-end-development-with-beer/</guid><pubDate>Tue, 09 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Maurits is a freelance front-end developer and co-founder of &lt;a href=&quot;https://www.brouwerijvictorie.nl/&quot;&gt;Brouwerij Victorie&lt;/a&gt;, a brewery in Amsterdam with a gorgeous website. We spoke with him about beer (naturally), e-commerce and Henri&amp;#x27;s, a Sass design toolbelt.&lt;/em&gt;&lt;/p&gt;&lt;h3 id=&quot;hey-maurits-can-you-tell-us-about-yourself&quot;&gt;Hey Maurits, can you tell us about yourself?&lt;/h3&gt;&lt;img src=&quot;/blogs/victorie/maurits.png&quot; alt=&quot;Photo of Maurits&quot; style=&quot;float:left;margin-right:1rem;border-radius:100%;height:200px;shape-outside:circle(50%)&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;My name is Maurits, 33 years old and have been an entrepreneur / freelancer since the beginning of my professional career. I’m that old skool developer that can tell you about supporting Internet Explorer 6 back in the days, that’s how old I am.&lt;/p&gt;&lt;p&gt;After owning and running an agency with 10+ employees, I decided almost two years ago to &lt;a href=&quot;https://e-mmer.nl/&quot;&gt;start freelancing again&lt;/a&gt; and do what I like best, developing solutions for end customers and clients. You can find me on &lt;a href=&quot;https://twitter.com/mmeester&quot;&gt;Twitter&lt;/a&gt; and &lt;a href=&quot;https://github.com/mmeester&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;My main field of expertise is e-commerce development, on a freelance basis as a Magento 2 and Shopware 6 developer. Shopware 6 lets me develop Headless e-commerce solutions with Vue.js. (Sorry Kilian, I don’t hate React, I just like Vue.js better.) I’ve created a few extensions which are available &lt;a href=&quot;https://store.shopware.com/en/e-mmer-interactive.html&quot;&gt;via the Shopware ecosystem&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;My preference of working is desktop down, instead of the popular mobile first approach. I think this has grown from working with designers that embraced this approach. I have a strong belief in hiding elements from the desktop size down instead of starting with a minimalistic design on mobile and adding experience to the page on desktop.&lt;/p&gt;&lt;h3 id=&quot;what-were-you-looking-to-improve-in-your-workflow-that-made-you-search-out-a-tool-like-polypane&quot;&gt;What were you looking to improve in your workflow that made you search out a tool like Polypane?&lt;/h3&gt;&lt;p&gt;I have to say I wasn’t looking for workflow improvement, I just happened to know Kilian and saw his awesome product. One of the key challenges with the software of Polypane is that you don’t know what you’re missing until you try it.&lt;/p&gt;&lt;h3 id=&quot;what-did-you-use-before&quot;&gt;What did you use before?&lt;/h3&gt;&lt;p&gt;I normally just use Chrome development tools and emulate screens in that. One of the things you start to realize using Polypane is the amount of time you spent on resizing or emulating screens.&lt;/p&gt;&lt;p&gt;Besides the manual steps you need to take, I catch myself on being lazy and tending to forget to have a final check across multiple devices. &lt;strong&gt;Polypane solved that by becoming a part of my development to deploy process and always being the final check before deploying.&lt;/strong&gt;&lt;/p&gt;&lt;h3 id=&quot;how-was-it-for-you-to-get-started-with-polypane-and-how-do-you-use-it&quot;&gt;How was it for you to get started with Polypane and how do you use it?&lt;/h3&gt;&lt;p&gt;I’m still figuring out all the possibilities Polypane has to offer. Right now I use it to check my work on many screen sizes at once, With the experience I have, I’m pretty aware of the output my code will bring on smaller screens.&lt;/p&gt;&lt;p&gt;But Polypane is much more than a window resizer, the meta info displayed in the sidebar, the a11y features make it easy to improve your website in a glance and have your site optimized and ready to ship. Better websites in less time, that’s what Polypane brings you.&lt;/p&gt;&lt;h3 id=&quot;tell-us-about-henris-what-do-you-use-it-for&quot;&gt;Tell us about Henri&amp;#x27;s, what do you use it for?&lt;/h3&gt;&lt;p&gt;At one of my previous companies a few of my coworkers created &lt;a href=&quot;https://www.henris.style/&quot;&gt;Henri&amp;#x27;s&lt;/a&gt;, (with a special shout out to Sil van Diepen who has done most of the work on this great library.) Henris is a modern Sass Tool belt that makes creating fluid web pages easy.&lt;/p&gt;&lt;p&gt;Henris is based on a “grid philosophy” and provides the tools to easily create a &amp;quot;&lt;a href=&quot;https://joshwcomeau.com/css/pixel-perfection/#pixel-pretty-close&quot;&gt;pixel-pretty-close&lt;/a&gt;&amp;quot; version of the designer&amp;#x27;s vision. All of this probably feels really abstract so let’s use an example to clarify this approach:&lt;/p&gt;&lt;p&gt;Your designer loves working on a big canvas, let’s say 1920px by 1080px. They want to create a fluid full width experience for everyone so they design everything full width on 1920x1080. But a lot of our users don’t have these huge desktop screens and instead use small screens or, more likely, tablet or mobile devices so we need to have a tool that makes your design fluid.&lt;/p&gt;&lt;p&gt;This is where Henri&amp;#x27;s comes in, together with the designer we decide to work on an old-fashioned column kind of design, but instead of working on a 12 column grid we are using a 24 column grid without gaps, just because no one likes gaps right? Your designer starts being creative, designs an awesome page at 1920px width and now it’s time to implement his awesome design on your end-users small screen.&lt;/p&gt;&lt;p&gt;Working on a 1920px design means one column is 80px. Let’s say you have the following headings designed, what will be the translation to grid sizes?&lt;/p&gt;&lt;div class=&quot;henristable&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Designed on 1920px&lt;/th&gt;&lt;th&gt;Grid size&lt;/th&gt;&lt;th&gt;Translates to&lt;/th&gt;&lt;th&gt;On 1440px&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;em&gt;Heading 1&lt;/em&gt;&lt;/td&gt;&lt;td&gt;80px&lt;/td&gt;&lt;td&gt;1 grid&lt;/td&gt;&lt;td&gt;4,167vw&lt;/td&gt;&lt;td&gt;60px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;em&gt;Heading 2&lt;/em&gt;&lt;/td&gt;&lt;td&gt;60px&lt;/td&gt;&lt;td&gt;0.75 grid&lt;/td&gt;&lt;td&gt;3,125vw&lt;/td&gt;&lt;td&gt;45px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;em&gt;Heading 3&lt;/em&gt;&lt;/td&gt;&lt;td&gt;52px&lt;/td&gt;&lt;td&gt;0.65 grid&lt;/td&gt;&lt;td&gt;2,70vw&lt;/td&gt;&lt;td&gt;39px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;em&gt;Heading 4&lt;/em&gt;&lt;/td&gt;&lt;td&gt;40px&lt;/td&gt;&lt;td&gt;0.5 grid&lt;/td&gt;&lt;td&gt;2,08vw&lt;/td&gt;&lt;td&gt;30px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;em&gt;Heading 5&lt;/em&gt;&lt;/td&gt;&lt;td&gt;32px&lt;/td&gt;&lt;td&gt;0.4 grid&lt;/td&gt;&lt;td&gt;1,6668vw&lt;/td&gt;&lt;td&gt;24px&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;The great thing about this approach is your font will scale with all screen sizes and has the same word wrapping when changing your screen size.&lt;/p&gt;&lt;p&gt;But as you can see and probably notice things will get critical on smaller screens like phones. Let’s say you are watching the page on a device with a width of 375px, this means your H5 will have a font-size of 6,255px which is close to unreadable and not the style you would probably want.&lt;/p&gt;&lt;p&gt;In the past we used to have an explicit sass function to solve the min and max font-sizes, but the new css &lt;code class=&quot;language-text&quot;&gt;clamp()&lt;/code&gt; function is a much more elegant solution to the problem.&lt;/p&gt;&lt;p&gt;Henri&amp;#x27;s offers a bunch of other convenient tools, you can find out all about those on the website &lt;a href=&quot;https://www.henris.style/&quot;&gt;henris.style&lt;/a&gt; and &lt;a href=&quot;https://docs.henris.style/&quot;&gt;the docs&lt;/a&gt;.&lt;/p&gt;&lt;img src=&quot;/blogs/victorie/brouwerijvictorie.png&quot; alt=&quot;Brouwerij Victorie website at three different screen sizes&quot; class=&quot;imgshadow&quot;/&gt;&lt;h3 id=&quot;can-you-tell-us-about-brouwerij-victorie&quot;&gt;Can you tell us about Brouwerij Victorie?&lt;/h3&gt;&lt;p&gt;In March of 2020, when the whole pandemic started in the Netherlands me and two friends decided to continue with our plans of starting a brewery: Brouwerij Victorie. With our first range of three beers, a Blond, Saison and Neipa we started a complete new and unknown adventure. Selling beers is something completely different from building websites. Our beers are made for people like ourselves, the creative industry. In the near future we want to have more explicit beers that serve this audience better.&lt;/p&gt;&lt;p&gt;Starting during Covid forced us to think differently and instead of using traditional channels we&amp;#x27;re selling it through our own e-commerce platform &lt;a href=&quot;https://www.brouwerijvictorie.nl/&quot;&gt;brouwerijvictorie.nl&lt;/a&gt;, built with Shopware and Nuxt.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;As a special for Polypane users in The Netherlands, get our beer with the special discount code &amp;quot;friendsofPolypane&amp;quot; for 10% off.&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Kilian: How awesome is that! I highly recommend Brouwerij Victorie&amp;#x27;s beers. &lt;a href=&quot;https://www.brouwerijvictorie.nl/product/1ed91aedbf2343cda84f7b5caf58170b&quot;&gt;Half Blond&lt;/a&gt; if you prefer a fresh blonde style beer and &lt;a href=&quot;https://www.brouwerijvictorie.nl/product/2d9684ea34274d5ab7fdf6be31d1cea0&quot;&gt;One Hit Wonder&lt;/a&gt; (a saison) if you like to sit with a beer a little longer. And I look forward to trying &lt;a href=&quot;https://www.brouwerijvictorie.nl/product/129fc8619e3f4bc1ba7c610a77d4a880&quot;&gt;Juicy You&lt;/a&gt;, which is a fruity IPA. They also have a &lt;a href=&quot;https://www.brouwerijvictorie.nl/product/01a94216eb70497ba68093e16c9c71a0&quot;&gt;mix box&lt;/a&gt; so you can try them all.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;okay-back-to-web-dev-again-what-results-did-you-see-with-polypane&quot;&gt;Okay, back to web dev again. What results did you see with Polypane?&lt;/h3&gt;&lt;p&gt;Being a freelancer I can say that this tool really helps, even if I don&amp;#x27;t really see that returned in hours saved. What I do notice is that everything I work on ends up looking better. You end up with higher quality output because of that different way of thinking about web development you get using Polypane.&lt;/p&gt;&lt;p&gt;I also frequently share screenshots made in Polypane with product owners so they can see the responsive design in one overview.&lt;/p&gt;&lt;h3 id=&quot;whats-next-for-you&quot;&gt;What&amp;#x27;s next for you?&lt;/h3&gt;&lt;p&gt;At the moment I’m optimizing the website of our Brewery, we want to have better accessibility and better SEO, so Polypane is really helpful in discovering those pain points. In 2021 we want to introduce two new beers, become a sustainable brand and move our beers from traditional glass bottles to cans, which have a lower carbon footprint and are easier to recycle.&lt;/p&gt;&lt;p&gt;Like every other developer I don’t stop learning, with Vue3 and Vite coming up I would like to build an application completely relying on those new frameworks. I’m trying to be active in the communities I like, but sometimes find it hard to keep up with everything. You can find me on &lt;a href=&quot;https://twitter.com/mmeester&quot;&gt;Twitter&lt;/a&gt; and &lt;a href=&quot;https://github.com/mmeester&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Thanks Maurits for this interview! Henri&amp;#x27;s looks cool and I have nothing against Vue either ;) Go check out the Brouwerij Victorie site for some cool UI elements and responsive design inspiration. If you&amp;#x27;re in the Netherlands and like beer, I really recommend you give their beers a try.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Faking container queries with CSS Grid]]></title><description><![CDATA[Container queries are an (hopefully) upcoming feature in CSS that will let you create responsive designs that respond to the dimensions of…]]></description><link>https://polypane.app/blog/faking-container-queries-with-css-grid/</link><guid isPermaLink="false">https://polypane.app/blog/faking-container-queries-with-css-grid/</guid><pubDate>Tue, 02 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Container queries are an (hopefully) upcoming feature in CSS that will let you create responsive designs that respond to the dimensions of their container (like a div or other HTML element) rather than the dimensions of the entire page, which we currently do with media queries.&lt;/p&gt;&lt;p&gt;This is super helpful for component-based design, since you no longer have to create different variants of a component when you need them to display slightly differently depending on where they&amp;#x27;re shown.&lt;/p&gt;&lt;p&gt;Unfortunately, container queries don&amp;#x27;t exist yet.&lt;/p&gt;&lt;p&gt;Recently this became an issue for me when Facebook updated their rich previews on desktop to be shown at three discrete widths depending on the viewport width.&lt;/p&gt;&lt;img alt=&quot;Polypane as shared on Facebook at three discrete widths&quot; src=&quot;/blogs/containerquerygrid/facebooks.png&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;That meant I had to update the previews in the Polypane side panel to show at only those three widths. The side panel can be sized independent of the viewport though, so media queries were not an option. Because they used discrete widths, I also couldn&amp;#x27;t use auto sizing to let the preview grow along with the width of the side panel. I needed container queries.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Note: this has since been updated/reverted (or I was in some A/B testing group) but the technique I came up with was useful enough to still write an article about.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;With CSS Grid and some trickery I managed to implement this in a way that looks very close to container queries.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Just to note: real container queries would let you do significantly more than having three discrete widths so this is in no way a full replacement. But it&amp;#x27;s useful enough that I think it&amp;#x27;s a technique to know about.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;defining-the-problem&quot;&gt;Defining the problem&lt;/h2&gt;&lt;p&gt;The problem we&amp;#x27;re trying to solve is this: depending on the width of the viewport, the rich previews on Facebook are either 500, 590 or 680 pixels wide. In Polypane, we want to show the largest version that fits in the sidebar.&lt;/p&gt;&lt;p&gt;We can&amp;#x27;t use the viewport width, since the width of the sidebar is independent of it. And we can&amp;#x27;t use a fluid width combined with a max-width, since we need it to snap to those three sizes so it acts just like Facebook.&lt;/p&gt;&lt;p&gt;If we look at those three widths we see that from 500 pixels, the width increases by 90 pixels each time. This will come of use later.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Getting the preview exactly right might feel pedantic, but I want the Social media previews in Polypane to be &lt;strong&gt;pixel perfect&lt;/strong&gt; as well as &lt;strong&gt;character perfect&lt;/strong&gt;, so you can be sure that what you see in Polypane is what people see on social media sites.&lt;/p&gt;&lt;br/&gt;This is something not even the official validators of Facebook, Twitter and LinkedIn do. In fact, they all use outdated designs that no longer match with the actual sites, making Polypane the only place that matches with reality. That takes a lot of work, but it&amp;#x27;s totally worth it.&lt;/blockquote&gt;&lt;h2 id=&quot;css-grid&quot;&gt;CSS Grid&lt;/h2&gt;&lt;p&gt;Admittedly I haven&amp;#x27;t done a lot with CSS Grid yet so I am by no means a pro. I usually default to Flexbox as it fits most of the things I need to design. Here&amp;#x27;s how I decide whether to use CSS Grid or Flexbox:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Do I have a bunch of elements that I need to lay out? Then I use Flexbox&lt;/li&gt;&lt;li&gt;Do I have a bunch of areas that I need to put elements in? Then I use CSS Grid.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;And in this case, the area should be leading, which led me (along with some help from the Fronteers Slack) to see if I could get CSS Grid for my solution. In CSS Grid you can define a set of areas in two dimensions (though we only need one dimension for this example) so that&amp;#x27;s what we&amp;#x27;ll do.&lt;/p&gt;&lt;h2 id=&quot;setup&quot;&gt;Setup&lt;/h2&gt;&lt;p&gt;We begin with setting up a wrapper for our Facebook preview to live in:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;wrapper&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;preview&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Facebook Preview&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And some CSS that will set up the grid in the wrapper, and then position the preview inside it:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.wrapper&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 680px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;grid-template-columns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 500px &lt;span class=&quot;token function&quot;&gt;repeat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;auto-fill&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 90px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.preview&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;grid-column&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1 / -1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What we&amp;#x27;ve done here is set up a CSS grid that&amp;#x27;s at most 680 pixels wide (the widest our preview should get), has one column that&amp;#x27;s 500px width (the smallest our preview should get) and then a &amp;quot;repeat()&amp;quot; function that adds columns of 90 pixels wide as long as they fit, which is what the &lt;code class=&quot;language-text&quot;&gt;auto-fill&lt;/code&gt; function does.&lt;/p&gt;&lt;p&gt;Then, for our preview, we set &lt;code class=&quot;language-text&quot;&gt;grid-column&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;1 / -1&lt;/code&gt;. What this means is &lt;em&gt;this element goes from the first grid line from the start (1), to the first grid line from the end (-1)&lt;/em&gt;. This essentially means it will always occupy all grid areas regardless of how many grid areas there are.&lt;/p&gt;&lt;p&gt;Here&amp;#x27;s a live, resizable preview you can try and see what happens. The white dotted lines indicate the borders of the grid areas (drag the bottom right corner):&lt;/p&gt;&lt;div style=&quot;resize:horizontal;background:#fff;border:2px solid rgb(30, 30, 63);padding:1rem;overflow:hidden;position:relative;margin-left:auto;margin-right:auto;border-radius:4px;box-shadow:inset rgba(20, 40, 50, 0.05) 0px 4px 4px, inset rgba(20, 40, 50, 0.05) 0px 1px 10px, inset rgba(20, 40, 50, 0.08) 0px 20px 30px&quot;&gt;&lt;div class=&quot;wrapper&quot; style=&quot;position:relative;display:grid;max-width:680px;grid-template-columns:500px repeat(auto-fill, 90px);justify-content:center;margin:0 auto&quot;&gt;&lt;div class=&quot;preview&quot; style=&quot;grid-row:1 / 2;grid-column:1 / -1;background:rgba(0, 70, 150, 1);font-weight:bold;color:#fff;height:300px;display:grid;place-items:center;border-radius:3px&quot;&gt;Preview&lt;/div&gt;&lt;div class=&quot;gridLine&quot; style=&quot;grid-row:1 / 2;grid-column:1 / 2;border-right:1px dotted #fff8;height:300px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;gridLine&quot; style=&quot;grid-row:1 / 2;grid-column:2 / 3;border-right:1px dotted #fff8;height:300px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;If you look closely, you can see that it &lt;strong&gt;doesn&amp;#x27;t actually work&lt;/strong&gt;: while the Facebook preview snaps to 680px and 590px wide, it doesn&amp;#x27;t go to our 500px width. This is because &lt;code class=&quot;language-text&quot;&gt;repeat()&lt;/code&gt; always shows at least one column. I initially thought this would be at least zero.&lt;/p&gt;&lt;p&gt;So how do we fix that?&lt;/p&gt;&lt;h2 id=&quot;getting-it-just-right&quot;&gt;Getting it just right&lt;/h2&gt;&lt;p&gt;Since we now know there&amp;#x27;s always at least one column of 90 pixels, and the minimum size we want is 500px, we need the first column in our CSS Grid to be 500 - 90 = 410 pixels wide. Let&amp;#x27;s try that:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.wrapper&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 680px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;grid-template-columns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 410px &lt;span class=&quot;token function&quot;&gt;repeat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;auto-fill&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 90px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And a new live preview:&lt;/p&gt;&lt;div style=&quot;resize:horizontal;background:#fff;border:2px solid rgb(30, 30, 63);padding:1rem;overflow:hidden;position:relative;margin-left:auto;margin-right:auto;border-radius:4px;box-shadow:inset rgba(20, 40, 50, 0.05) 0px 4px 4px, inset rgba(20, 40, 50, 0.05) 0px 1px 10px, inset rgba(20, 40, 50, 0.08) 0px 20px 30px&quot;&gt;&lt;div class=&quot;wrapper&quot; style=&quot;display:grid;max-width:680px;grid-template-columns:410px repeat(auto-fill, 90px);justify-content:center;margin:0 auto&quot;&gt;&lt;div class=&quot;preview&quot; style=&quot;grid-row:1 / 2;grid-column:1 / -1;background:rgba(0, 70, 150, 1);font-weight:bold;color:#fff;height:300px;display:grid;place-items:center;border-radius:3px&quot;&gt;Preview&lt;/div&gt;&lt;div class=&quot;gridLine&quot; style=&quot;grid-row:1 / 2;grid-column:1 / 2;border-right:1px dotted #fff8;height:300px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;gridLine&quot; style=&quot;grid-row:1 / 2;grid-column:2 / 3;border-right:1px dotted #fff8;height:300px&quot;&gt;&lt;/div&gt;&lt;div class=&quot;gridLine&quot; style=&quot;grid-row:1 / 2;grid-column:3 / 4;border-right:1px dotted #fff8;height:300px&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;The preview area now snaps to 680, 590 and 500 pixels wide. We&amp;#x27;ve created a container query-like experience where depending on the available total width we snap to a set of fixed sizes.&lt;/p&gt;&lt;p&gt;As noted earlier in the article, Facebook has since reverted/updated to a fluid column that scales along with the viewport. This technique can still be useful to achieve certain effects. Maybe you want things to align on a pixel basis, or have a grid system but want to keep fixed widths within that grid.&lt;/p&gt;&lt;p&gt;If you end up using this, &lt;a href=&quot;https://twitter.com/polypane&quot;&gt;let me know on Twitter!&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Find and fix accessibility issues with Polypane]]></title><description><![CDATA[At Polypane, accessibility is one of the three core areas we focus on, along with performance and responsive design. If you're not familiar…]]></description><link>https://polypane.app/blog/find-and-fix-accessibility-issues-with-polypane/</link><guid isPermaLink="false">https://polypane.app/blog/find-and-fix-accessibility-issues-with-polypane/</guid><pubDate>Tue, 19 Jan 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;At Polypane, accessibility is one of the three core areas we focus on, along with performance and responsive design. If you&amp;#x27;re not familiar with Polypane, it&amp;#x27;s a web browser specifically for web developers. It has all sorts of tools you won&amp;#x27;t find in regular browsers that make you more effective and efficient.&lt;/p&gt;&lt;p&gt;In this article, we&amp;#x27;ll focus on a few common accessibility issues and find ways to audit and fix them in your site to make sure it&amp;#x27;s as accessible as possible.&lt;/p&gt;&lt;h2 id=&quot;live-stream-recording&quot;&gt;Live stream recording&lt;/h2&gt;&lt;p&gt;Check out this live stream by &lt;a href=&quot;https://www.twitch.tv/5t3phdev&quot;&gt;Stephanie Eckles&lt;/a&gt; where Kilian walked through most of the accessibility options in Polypane:&lt;/p&gt;&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom:56.25%;position:relative;height:0;overflow:hidden&quot;&gt; &lt;div style=&quot;position:relative;width:100%;padding-top:56.25%&quot;&gt; &lt;iframe src=&quot;https://www.youtube.com/embed/PZz91b62WT8&quot; title=&quot;YouTube video player&quot; frameBorder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot; style=&quot;position:absolute;top:0;left:0;width:100%;height:100%&quot;&gt;&lt;/iframe&gt; &lt;/div&gt; &lt;/div&gt;&lt;h2 id=&quot;does-my-text-have-enough-contrast-and-where-it-doesnt-how-do-i-fix-that&quot;&gt;Does my text have enough contrast, and where it doesn&amp;#x27;t, how do I fix that?&lt;/h2&gt;&lt;p&gt;Ideally, text contrast is dealt with during the design, unfortunately this isn&amp;#x27;t always the case. While there are plenty of places online to check a given text color and a given background (we even &lt;a href=&quot;/color-contrast/&quot;&gt;built our own free online color contrast tester&lt;/a&gt;), your web pages likely have many different colors and backgrounds. For any reasonably complex site you might not know all combinations beforehand.&lt;/p&gt;&lt;p&gt;That makes it really easy to overlook that one grey text that&amp;#x27;s normally shown on a white background, but has this one place where it&amp;#x27;s on light gray, or a dark text color with opacity that only works for certain backgrounds.&lt;/p&gt;&lt;p&gt;In Polypane, nearly all inspection of an element will do a quick contrast check for that specific element. Our algorithm determines the real text and background colors, taking into account the color, opacity and all background colors. We then merge that into the actual perceived text and background color and compare that.&lt;/p&gt;&lt;img alt=&quot;Element tooltip and element panel showing current (failing) contrast ratio&quot; src=&quot;/blogs/a11y/image9.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;We&amp;#x27;ll show the result in an element tooltip and in the elements panel alongside other information like font-family and font size. That way, the text contrast of the element you&amp;#x27;re working on is always glanceable.&lt;/p&gt;&lt;p&gt;Polypane also has a color contrast debug tool. This will go through your entire page and find all unique text + background combinations, check all of them and add labels to each element: All passing contrast pairs get a single label with the contrast, and any failing contrast gets a warning label for each instance, so you don&amp;#x27;t overlook any.&lt;/p&gt;&lt;img alt=&quot;CSS color contrast debug tool highlighting contrast issues&quot; src=&quot;/blogs/a11y/image2.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;If you have text on top of images then Polypane can&amp;#x27;t automatically determine if the background is valid. We will check against the background color, and it&amp;#x27;s good practice to make sure that has enough contrast (for when images don&amp;#x27;t load) but you can use the &lt;a href=&quot;/docs/color-picker/&quot;&gt;Eye Dropper color picker&lt;/a&gt; to compare background and foreground. Select both colors and Polypane will automatically compare them for you.&lt;/p&gt;&lt;h3 id=&quot;we-made-it-really-easy-to-find-contrast-issues-but-how-do-you-fix-them&quot;&gt;We made it really easy to find contrast issues. But how do you fix them?&lt;/h3&gt;&lt;p&gt;If you&amp;#x27;re lucky, you can use another color from your design system but if you don&amp;#x27;t have one, or this is a one-off color pair, you have to go back to your designer or use an online contrast tester and find another color yourself. A tedious and time consuming process. We can do better!&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/blogs/a11y/image12.gif&quot; alt=&quot;CSS color contrast debug tool editing colors&quot;/&gt;&lt;/p&gt;&lt;p&gt;For every failing contrast pair, Polypane calculates a text color that has enough contrast with the background, and suggests that to you for easy copying. You can even preview it just by hovering over it. (Our &lt;a href=&quot;/color-contrast/&quot;&gt;free online contrast checker&lt;/a&gt; also suggests improved colors for you)&lt;/p&gt;&lt;h2 id=&quot;how-does-my-site-look-for-people-with-visual-impairments-like-color-blindness-or-farsightedness&quot;&gt;How does my site look for people with visual impairments like color blindness or farsightedness?&lt;/h2&gt;&lt;p&gt;What about situational impairments like bright sunlight or a device with night mode?&lt;/p&gt;&lt;p&gt;Not everyone that visits your site is going to have perfect vision. In fact, a large number of your visitors will definitely have some form of visual impairment. While you can make sure to follow guidelines around minimum text size and not communicate anything just through use of colors, it can be easy to overlook an issue. The best way to get empathy is to try and simulate how other people experience your site.&lt;/p&gt;&lt;img alt=&quot;All color blindness emulators side by side&quot; src=&quot;/blogs/a11y/image8.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;h3 id=&quot;color-blindness&quot;&gt;Color blindness&lt;/h3&gt;&lt;p&gt;Between 8 and 10% of men worldwide are color blind (women much less so, at 0.5%), and they fall in three different groups: red-green color blindness, blue-yellow color blindness and full color blindness. Polypane lets you simulate all of these with our accessibility debug tools.&lt;/p&gt;&lt;p&gt;You should test with these simulators to make sure that you don&amp;#x27;t rely on just color to bring across messages. For example if you just make the border of an input field red when you make an error, you&amp;#x27;ll find that&amp;#x27;s barely noticeable, or unnoticeable with any of these simulators turned on. Rather you should provide a second non-color indicator like an error message to communicate the issue to your user.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Red-green color blindness&lt;/strong&gt; is the most common and the vast majority of people with color blindness have this. In Polypane we offer 4 different simulators: Deuteranopia, Deuteranomaly, Protanopia and Protanomaly. The -anomaly variants here are the less severe version, the -opia variants would be classified as &amp;quot;full&amp;quot; red-green color blindness.&lt;/p&gt;&lt;p&gt;As the name implies, people with this type of color blindness have difficulty seeing the difference between red and green, but also brown and orange and certain shades of blue and purple. You can see how for example the common &amp;quot;green is good, red is bad&amp;quot; coloring of elements can become an issue.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Blue-yellow color blindness&lt;/strong&gt; is much more rare, at just 0.0002% of men worldwide. The technical name for it is &amp;quot;tritanopia&amp;quot;, and tritanomaly is the less severe version. This type of color blindness makes people less sensitive to blue light, making the blue part of anything grey.&lt;/p&gt;&lt;p&gt;Lastly, &lt;strong&gt;full colorblindness&lt;/strong&gt; is the most rare at 0.00003% of men worldwide. It&amp;#x27;s proper name is &amp;quot;Achromatopsia&amp;quot;, with &amp;quot;achromatomaly&amp;quot; being the less severe version where people see some color, but it&amp;#x27;s severely dulled.&lt;/p&gt;&lt;p&gt;It&amp;#x27;s worth noting that the simulators in Polypane (and any simulator really) are approximations. Especially the less severe variants come in a range from nearly unnoticeable to close to the full thing, and so the simulator chooses a middle ground there.&lt;/p&gt;&lt;img alt=&quot;Different emulators side by side: cataracts, glaucoma, farsightedness, bright sunlight, night mode and dyslexia&quot; src=&quot;/blogs/a11y/image1.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;h3 id=&quot;blurred-vision&quot;&gt;Blurred vision&lt;/h3&gt;&lt;p&gt;So that&amp;#x27;s color blindness, but far more people worldwide have some form of farsightedness (roughly 10% world wide), which can cause screens to look blurry. This can be &amp;quot;regular&amp;quot; farsightedness, or other visual impairments that blur vision like cataracts and glaucoma.&lt;/p&gt;&lt;p&gt;Cataracts is the leading cause of blindness. It progressively clouds the lens of your eye. Glaucoma is the second most common cause of blindness and decreases your peripheral vision, followed by your central vision. It&amp;#x27;s sometimes called tunnel vision, though that&amp;#x27;s an umbrella term for a number of different impairments.&lt;/p&gt;&lt;p&gt;Using the simulators in Polypane you&amp;#x27;ll notice how difficult it is to read regular text. People with blurred vision can usually compensate for it with glasses or magnification, but it still helps to make sure that your page remains scannable. Make sure that your headers are large enough to be readable with these simulators. That will make sure your page is scannable without too much strain.&lt;/p&gt;&lt;p&gt;The Tunnelvision and Glaucoma simulators in Polypane are interactive, you can use your mouse to determine where on the page you look.&lt;/p&gt;&lt;h3 id=&quot;situational-impairments&quot;&gt;Situational impairments&lt;/h3&gt;&lt;p&gt;Not all visual impairments are physical. Some are situational as well: they only occur when you&amp;#x27;re in a certain situation. Polypane lets you simulate two of these: Bright sunlight, and night mode.&lt;/p&gt;&lt;p&gt;Screens are hard to read in bright sunlight. They get washed out, there&amp;#x27;s glare and only the largest contrast remains readable. Maybe not all sites are meant to be used in bright sunlight but if you have a mobile or responsive site, it&amp;#x27;s going to end up being shown on a screen in bright sunlight at some point. This is a good simulator to check if your nice subtle contrasts aren&amp;#x27;t too subtle.&lt;/p&gt;&lt;p&gt;Night mode on the other hand, is something that has slowly appeared in most operating systems over the past few years, on computers and mobile devices. Night mode will decrease the amount of blue in a screen at night, making screens more relaxing to your eyes and decreasing the suppression of melatonin. Melatonin is what makes you sleepy and you make more of it at the end of the day as the natural light around you dims. If you ever kept working on your computer until 2 am not feeling tired at all, suppressed melatonin is why.&lt;/p&gt;&lt;p&gt;Night modes in most operating systems are designed to prevent any issues with what&amp;#x27;s being shown on screen but if you rely on yellows to convey meaning then those might get lost when everything is slightly yellow.&lt;/p&gt;&lt;h3 id=&quot;dyslexia&quot;&gt;Dyslexia&lt;/h3&gt;&lt;p&gt;Around 5% to 10% of people worldwide have some form of dyslexia, a reading impairment. While this is not a situational impairment, it does affect how people experience your site visually.&lt;/p&gt;&lt;p&gt;Some experts suggest it might even be upward of 15% because a lot of people with reading impairments do not realise they have it. Since there is no way to compare our experience reading with anyone else&amp;#x27;s experience, it&amp;#x27;s hard to know when your experience is significantly different.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/blogs/a11y/image5.gif&quot; alt=&quot;Demo of dyslexia debug tool&quot;/&gt;&lt;/p&gt;&lt;p&gt;Some people with dyslexia describe it as seeing the letters on screen dance around, and that is what our dyslexia simulator shows. The letters in each word are jumbled and re-ordered as you look at them. They&amp;#x27;re still mostly readable, but they take more effort than usual.&lt;/p&gt;&lt;p&gt;Not everyone with dyslexia experiences reading like this and the use of the simulator is more for gaining empathy than anything else. Still if you get stuck on a jumbled word, because it&amp;#x27;s very long or the letters can form multiple words, you might consider changing it to a simpler, clearer word.&lt;/p&gt;&lt;h2 id=&quot;does-my-page-structure-make-sense-for-people-that-depend-on-it&quot;&gt;Does my page structure make sense for people that depend on it?&lt;/h2&gt;&lt;p&gt;Your page structure, like your headings and landmarks (elements like body, nav, main, aside and section) is more important than you think. Many assistive technologies, like screen readers, let users pull up a list of all your headings, landmarks or links for them to quickly go through and see if they find the section they&amp;#x27;re looking for.&lt;/p&gt;&lt;p&gt;It&amp;#x27;s important to have a logical order to your page, with headings that don&amp;#x27;t skip a level and the proper landmarks (like navigation, headers and footers). When your site is built up out of many components and templates, you might not be able to get a good overview of all the headings and their order until they&amp;#x27;re rendered on a page. Additionally, not all your landmarks might end up with a matching header.&lt;/p&gt;&lt;img alt=&quot;Outline panel showing a few untitled landmarks&quot; src=&quot;/blogs/a11y/image11.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;With the Polypane outline panel you get overviews of your headers, links, landmarks, images and the HTML5 outline. That makes it easy to see where you skip a heading level, if there&amp;#x27;s landmarks with a missing title, and if you have links that don&amp;#x27;t have a clear text or broken links.&lt;/p&gt;&lt;p&gt;There&amp;#x27;s 5 different outlines you can check:&lt;/p&gt;&lt;h3 id=&quot;headers&quot;&gt;Headers&lt;/h3&gt;&lt;p&gt;Shows all the headers currently on the page. The overview will warn you when it finds the following issues:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The H1 is not the first header&lt;/li&gt;&lt;li&gt;The page has more than one H1&lt;/li&gt;&lt;li&gt;Heading levels are skipped&lt;/li&gt;&lt;li&gt;Headings are repeated across the page&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;None of these are strict WCAG failures or spec violations but they are considered best practices. Taking care of these
will make it easier for people to use your site by skipping from heading to heading.&lt;/p&gt;&lt;h3 id=&quot;document-outline&quot;&gt;Document outline&lt;/h3&gt;&lt;p&gt;A outline using the generated HTML5 document outline algorithm. Will highlight landmarks without a clear title.&lt;/p&gt;&lt;h3 id=&quot;landmarks&quot;&gt;Landmarks&lt;/h3&gt;&lt;p&gt;Shows the HTML5 and ARIA landmarks elements (&lt;code class=&quot;language-text&quot;&gt;header&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;nav&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;section&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;footer&lt;/code&gt; et cetera) with their accessible name.
This overview will highlight issues like invalid nesting of landmarks, missing labels and when the label includes the
role of the landmark (causing it to be read twice by screen readers)&lt;/p&gt;&lt;h3 id=&quot;links&quot;&gt;Links&lt;/h3&gt;&lt;p&gt;Lists all the links on the page with their accessible name. It check the content of the link and whether it&amp;#x27;s clear
enough (and not just &amp;quot;Read more&amp;quot;).&lt;/p&gt;&lt;p&gt;Polypane also goes through all your links to check if they&amp;#x27;re still valid, or if they&amp;#x27;re broken or redirect.&lt;/p&gt;&lt;h3 id=&quot;images&quot;&gt;Images&lt;/h3&gt;&lt;p&gt;Lists all the images and gives warnings for empty alt attributes, alt attributes that start with things like &amp;quot;image&amp;quot; or
&amp;quot;picture&amp;quot; and alt attributes that mention color (as that might be information that remains unavailable to your visitors).&lt;/p&gt;&lt;h2 id=&quot;can-users-get-to-everything-on-my-pages-without-using-a-mouse&quot;&gt;Can users get to everything on my pages without using a mouse?&lt;/h2&gt;&lt;p&gt;Not everyone uses a mouse to interact with your website. People using the keyboard or assistive technologies depend on
heading and link outlines like the ones mentioned above, but also on website developers using the right elements
for interactivity and a logical tab order.&lt;/p&gt;&lt;p&gt;Keyboard users can search across your page, but are likely to use the &lt;code class=&quot;language-text&quot;&gt;tab&lt;/code&gt; key to go through interactive elements.&lt;/p&gt;&lt;p&gt;The Focus order outline and visualization in Polypane help you answer two questions.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Can non-mouse users reach everything they need to?&lt;/li&gt;&lt;li&gt;Does the tab order make sense?&lt;/li&gt;&lt;/ul&gt;&lt;img alt=&quot;Focus order on the Apple website&quot; src=&quot;/blogs/polypane-5/focus.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;h3 id=&quot;can-non-mouse-users-reach-everything-they-need-to&quot;&gt;Can non-mouse users reach everything they need to?&lt;/h3&gt;&lt;p&gt;HTML elements are interactive (like buttons and links) or not (like regular text or divs). Those regular elements can
still be made clickable with JavaScript but they can still be inaccessible using a keyboard or assistive technologies.&lt;/p&gt;&lt;p&gt;If elements are missing in the focus order list, they&amp;#x27;re not accessible to users that don&amp;#x27;t use a mouse.&lt;/p&gt;&lt;h3 id=&quot;does-the-tab-order-make-sense&quot;&gt;Does the tab order make sense?&lt;/h3&gt;&lt;p&gt;When you go through a site visually, the order tends to be clear (for western languages: left to right, top to bottom),
but the visual order is not always the same as the source order.&lt;/p&gt;&lt;p&gt;The source order however determines the focus order, and
when that&amp;#x27;s different from what people expect, they have a worse time using your site. The focus order visualization in Polypane
makes it easy to see if the order makes sense, or if it jumps up and down the page.&lt;/p&gt;&lt;p&gt;Polypane will highlight any elements that do not follow the reading order.&lt;/p&gt;&lt;h2 id=&quot;can-people-understand-my-text&quot;&gt;Can people understand my text?&lt;/h2&gt;&lt;p&gt;Even if your site may be technically accessible, the content itself can still be difficult to understand for your visitors.
We already discussed the dyslexia simulator and how you can improve your site for people with dyslexia, but what about generally
hard to read text?&lt;/p&gt;&lt;p&gt;The readability overlay will go through all the sentences on your page and score them. Harder to read sentences are darker red while
easier to read sentences are lighter green. This way you can quickly spot sentences you should rewrite or break up into smaller
sentences for better understanding.&lt;/p&gt;&lt;img alt=&quot;Readability overlay active on the Polypane docs page&quot; src=&quot;/doc-img/overlays/readability.png&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;To measure this we use either the Automated Readability Index, which works well for most Western European languages, or
the Automatic Arabic Readability Index when we detect a page written in Arabic.&lt;/p&gt;&lt;h2 id=&quot;are-my-elements-sized-correctly&quot;&gt;Are my elements sized correctly?&lt;/h2&gt;&lt;p&gt;Polypane offers three debug tools that help with checking if elements have the right size/are styled in the right way&lt;/p&gt;&lt;h3 id=&quot;small-text&quot;&gt;Small text&lt;/h3&gt;&lt;p&gt;The Small text debug tool detects elements with text smaller than 12px, and form elements with text smaller than 16px (to prevent iOS from zooming in on focus)
and shows a warning for each of them.&lt;/p&gt;&lt;img alt=&quot;tooltip showing a warning for small text&quot; src=&quot;/doc-img/overlays/smalltext.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;h3 id=&quot;small-targets&quot;&gt;Small targets&lt;/h3&gt;&lt;p&gt;The Target size cursor will change your cursor into a square that&amp;#x27;s 44 by 44 pixels, roughly the size of your thumb, and the minimum recommended space per tap target. Hover over your links to check they don&amp;#x27;t overlap other links, making it hard to click a specific link on mobile.&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-6-3/targetsize.mp4&quot; loop=&quot;&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;max-width:100%&quot;&gt;Target size cursor hovering over a number of different links showing they are far enough apart.&lt;/video&gt;&lt;h3 id=&quot;text-spacing&quot;&gt;Text Spacing&lt;/h3&gt;&lt;p&gt;The WCAG has guidelines for how text should be able to be changed by end users and still retain all info (i.e. no text is cut off or hidden): Success criterion 1.4.12. The Text spacing debug tool applies the limits described in this criterion to your page, letting you check if content becomes inaccessible.&lt;/p&gt;&lt;img alt=&quot;text spacing debug tool showing a part of the Polypane homepage&quot; src=&quot;/doc-img/overlays/forcespacing.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;h2 id=&quot;how-do-i-make-sure-i-dont-have-any-code-quality-issues-in-my-site-and-are-the-things-i-did-to-improve-accessibility-actually-helping&quot;&gt;How do I make sure I don&amp;#x27;t have any code quality issues in my site and are the things I did to improve accessibility actually helping?&lt;/h2&gt;&lt;p&gt;There&amp;#x27;s no denying that accessibility is a large field. This article has already mentioned contrast issues, different visual and situational impairments and document structure but that&amp;#x27;s only scratching the surface. There&amp;#x27;s many things that can negatively affect someone&amp;#x27;s experience on your site, like missing alt attributes for images, links without text, and not defining a page language to name just a tiny few. It would be nice if you didn&amp;#x27;t need to go through a huge checklist for every page, but could just surface the issues. In Polypane there&amp;#x27;s multiple ways to do that: through our built-in accessibility panel and two debug tools, A11y.css and Tota11y.&lt;/p&gt;&lt;img alt=&quot;a11y.css showing some issues on the React website&quot; src=&quot;/blogs/a11y/image13.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;A11y.css is a CSS file that highlights possible risks and mistakes in your page. Mostly for accessibility, but also for mistakes that can cause accessibility issues like a missing charset. It can be a little in-your-face because it draws thick borders around anything it thinks you should check, even for things that are on purpose (like empty alt attributes for decorational images)&lt;/p&gt;&lt;img alt=&quot;Tota11y showing issues on the Vue.js website&quot; src=&quot;/blogs/a11y/image6.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;Tota11y by Khan academy on the other hand, is a collection of a few different tools. There is a tool to list headings and landmarks (and highlight any order violations), find contrast issues (though not as thorough as the color contrast checker built into Polypane) and highlight any links, images or label that can cause issues (due to missing content, and missing or empty &lt;code class=&quot;language-text&quot;&gt;alt&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt; attributes).&lt;/p&gt;&lt;img alt=&quot;Accessibility panel showing issues on the Svelte.dev website&quot; src=&quot;/blogs/a11y/image4.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;Lastly, Polypane comes with its own Accessibility panel that can run an accessibility check based on the popular Axe ruleset. When you run a test, Polypane analyses your entire page and lists all issues in four separate categories: critical, serious, moderate and minor.&lt;/p&gt;&lt;p&gt;The critical and serious issues are the really important ones to fix. Critical issues are things like missing alt texts for images and wrong use of ARIA.&lt;/p&gt;&lt;p&gt;You can expand each found issue to get more information on which elements are affected by it and the specific problem with each element.&lt;/p&gt;&lt;p&gt;It&amp;#x27;s important for us that these errors are actionable: that they don&amp;#x27;t just tell you what&amp;#x27;s wrong, but also give you suggestions and advice on how to deal with them. For images with missing alt attributes for example, we explain the difference between content and presentational images, and for color contrast issues we&amp;#x27;ll suggest a color that does have enough contrast.&lt;/p&gt;&lt;p&gt;From the accessibility panel you can click on any element and show it in the element inspector, where you can usually fix the issue by updating the attributes or styling. Once you&amp;#x27;ve done that, copy it over to your source and the issue is resolved!&lt;/p&gt;&lt;p&gt;Interestingly when building the accessibility panel and checking many different websites with it it was more common to see ARIA being misused as a problem rather than lack of ARIA being the issue: accessibility is a complicated topic and it&amp;#x27;s easy to think you&amp;#x27;re doing the right thing while actually making it a little harder. Personal knowledge and manual testing are invaluable, but automated tests provide an excellent spot check.&lt;/p&gt;&lt;h2 id=&quot;does-my-site-work-well-on-smaller-screens&quot;&gt;Does my site work well on smaller screens?&lt;/h2&gt;&lt;p&gt;There&amp;#x27;s already &lt;a href=&quot;https://polypane.app/blog/responsive-design-ground-rules/&quot;&gt;plenty written about responsive design&lt;/a&gt; but it&amp;#x27;s also an important accessibility concern. For one, causing a horizontal scrollbar on screens of 320 pixels wide is not allowed according to WCAG rule 1.4.10. And on wider screens, while not a violation, it can look pretty jarring and confusing.&lt;/p&gt;&lt;p&gt;Finding the cause of horizontal overflows can be a real pain, since most of the time it&amp;#x27;s not immediately clear which element is causing it. You end up randomly deleting elements in the dev tools in the hope of finding the element. That&amp;#x27;s a lot of tedious work.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/blogs/a11y/image10.gif&quot; alt=&quot;Polypane highlighting element that causes horizontal scrolling&quot;/&gt;&lt;/p&gt;&lt;p&gt;Polypane detects whether a pane has a horizontal scrollbar (or has potential for a horizontal scrollbar due to using 100vw for a width) and shows a warning. When you click the warning Polypane will turn on the &amp;quot;layout debugging&amp;quot; debug tool. The Layout debugging tool colors the overflow-causing elements in red so you can find and fix them, for example by making sure the parent element has an overflow:hidden, or by making sure your content fits the available space.&lt;/p&gt;&lt;img alt=&quot;Reachability debug tool showing how easy parts of a screen are to reach&quot; src=&quot;/blogs/a11y/image7.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;Even though a mobile screen is smaller than your desktop, with screen sizes increasing it becomes harder to reach all parts of the screen easily when holding your phone in one hand. With the reachability debug tool we show which parts of the screen are easier or harder to reach when holding the phone in your hand (right hand or left hand).&lt;/p&gt;&lt;p&gt;Holding your phone in one hand, the bottom part of the screen tends to be easier to reach than the top so depending on your site, placing important items at the bottom of the screen could actually be more user-friendly. Placing items at the bottom of the screen is very common in apps, and we&amp;#x27;re seeing more websites and web apps migrating to this pattern too.&lt;/p&gt;&lt;h2 id=&quot;how-do-i-make-sure-my-site-works-well-for-users-that-prefer-dark-colors-or-dont-deal-well-with-motion&quot;&gt;How do I make sure my site works well for users that prefer dark colors or don&amp;#x27;t deal well with motion?&lt;/h2&gt;&lt;p&gt;Dark mode, while trendy, is also a potential accessibility help for people that find bright computer screens painful or straining to look at. A good dark mode can be a good look alternative to something like inverted colors (a feature on macOS) or force colors (a feature in Edge and on Windows, that forces all your colors to a specified palette, commonly with light text on a black background).&lt;/p&gt;&lt;img alt=&quot;Polypane showing light and dark mode side by side&quot; src=&quot;/blogs/a11y/image3.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;p&gt;To test and implement your dark mode, with &amp;quot;prefers-color-scheme: dark&amp;quot;, you can switch your entire operating system to dark mode, dive deep into the browser dev tools (settings menu, more tools, rendering, scroll down, pick &amp;quot;dark&amp;quot; in the emulation dropdown) or in Polypane, you can pop open the options dropdown and click &amp;quot;dark&amp;quot; to switch to dark mode for a single pane, so it&amp;#x27;s easy to see it side-by-side with your light design.&lt;/p&gt;&lt;h3 id=&quot;prefers-reduced-motion&quot;&gt;Prefers reduced motion&lt;/h3&gt;&lt;p&gt;Similarly, people with vestibular disorders can experience discomfort with movement on websites, like large animations and transitions. For them, the &amp;quot;prefers-reduced-motion: reduce&amp;quot; media query can be a solution. When that is set, it&amp;#x27;s important to tone down animations and transitions. You don&amp;#x27;t need to disable all animation (though that works, too) but try to make it less swoosh and more subtle fade. Similarly, if you have smooth scrolling turned on, that&amp;#x27;s a huge movement, so make sure &amp;quot;scroll-behaviour&amp;quot; is set to &amp;quot;auto&amp;quot;, not to &amp;quot;smooth&amp;quot;.&lt;/p&gt;&lt;p&gt;Testing this in Polypane is straightforward: open the options menu and switch the prefers-reduced-motion option to &amp;quot;reduce&amp;quot;. Now you can test it on its own, or side by side with your regular website.&lt;/p&gt;&lt;p&gt;I hope this gives you a taste of the type of accessibility issues you can encounter, how to deal with them and the ways Polypane tries to make them easier to resolve. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Polypane has a free trial&lt;/a&gt; that gets you running your first accessibility audit within 5 minutes of signing up.&lt;/p&gt;&lt;p&gt;&lt;em&gt;This article was adapted from &amp;quot;&lt;a href=&quot;https://www.sitepoint.com/how-to-find-fix-common-website-accessibility-issues/&quot;&gt;How to Find &amp;amp; Fix Common Website Accessibility Issues&lt;/a&gt;&amp;quot;, first posted on SitePoint.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Debug your visual hierarchy with the squint test]]></title><description><![CDATA["The squint test" is a method to get a feel for the visual hierarchy of your page and the name is quite literally what you're supposed to do…]]></description><link>https://polypane.app/blog/debug-your-visual-hierarchy-with-the-squint-test/</link><guid isPermaLink="false">https://polypane.app/blog/debug-your-visual-hierarchy-with-the-squint-test/</guid><pubDate>Fri, 11 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;quot;The squint test&amp;quot; is a method to get a feel for the visual hierarchy of your page and the name is quite literally what you&amp;#x27;re supposed to do. When
you squint your eyes and move away from your screen a little you distort your vision to the point where you can no longer focus on the page but can still make out the large areas and colors in your design. In other words, you only &lt;strong&gt;see the visual hierarchy&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;When you&amp;#x27;re designing or building a website, it can be easy to focus in on the details. &lt;em&gt;Is everything precisely aligned
to the grid? Are you using the exact right font-size and colors? Is this the right border-radius?&lt;/em&gt; But when you focus on the details, the
major hierarchy of your website can get away from you.&lt;/p&gt;&lt;p&gt;The squint test is a quick way to check if your page is still on the right track because it hides those details and lets
you focus on the larger patterns in your page.&lt;/p&gt;&lt;h3 id=&quot;what-to-look-for-when-doing-the-squint-test-️♀️&quot;&gt;What to look for when doing the squint test 🕵️‍♀️&lt;/h3&gt;&lt;p&gt;When you do the squint test there&amp;#x27;s a few question you&amp;#x27;re trying to answer:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Is the primary focus of the page clear?&lt;/strong&gt;&lt;br/&gt;
Most pages have one primary focus. One thing they want users to do or one topic. When squinting, is the primary call to action
or primary point of focus still recognizable, and is it clear what the primary focus is?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Are relationships between elements clear?&lt;/strong&gt;&lt;br/&gt;
Most visual elements have some sort of relationship with others, like titles and text below it, or the header and the logo.
When you squint, is it still clear that they belong together, or is the spacing causing elements to look separate?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Which elements stand out? (and should they stand out?)&lt;/strong&gt;&lt;br/&gt;
Elements with tons of contrast or color stand out more than others. When you squint these elements gain more prominence
compared to when you see them with &amp;quot;noisy&amp;quot; text around it. Are these elements the one you want to have stand out?&lt;/p&gt;&lt;p&gt;Another important step for this question is to distinguish between foreground elements and background elements. Are
background element like dividers and backgrounds more prominent than the primary focus of the page?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Is the page still recognizable?&lt;/strong&gt;&lt;br/&gt;
Can you still find the logo, are the colors used recognizable as your brand and consistent with the rest of your site?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;If an element is interactive, is that still clear when squinting?&lt;/strong&gt;&lt;br/&gt;
You don&amp;#x27;t want people to have to hunt for buttons and other interactive elements. When squinting, can you still detect
whether a link is clickable? If you&amp;#x27;re just using an &lt;span style=&quot;text-decoration:underline&quot;&gt;underline&lt;/span&gt; that might
get lost when blurring, but if you also have a &lt;span style=&quot;color:blue&quot;&gt;different color&lt;/span&gt; then it&amp;#x27;s
still clear.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Are elements that look the same when squint actually related?&lt;/strong&gt;&lt;br/&gt;
A common usability concept is &amp;quot;things that look the same are the same&amp;quot;. And when they&amp;#x27;re not that leads to confusion.
Are the elements on the page that look the same, also similar in behavior? If not, you might want to make sure they look
different too.&lt;/p&gt;&lt;h3 id=&quot;the-squint-test-without-squinting-&quot;&gt;The squint test ...without squinting 👀&lt;/h3&gt;&lt;p&gt;If you keep squinting while checking your design for all those points you&amp;#x27;ll end up with quite a headache.&lt;/p&gt;&lt;p&gt;Polypane has two debug tools that can help you do the same tests, &lt;strong&gt;no squinting required&lt;/strong&gt;.&lt;/p&gt;&lt;h4 id=&quot;far-sightedness-emulation&quot;&gt;Far-sightedness emulation&lt;/h4&gt;&lt;p&gt;The Far-sightedness emulation blurs the page you&amp;#x27;re looking at to emulate what people with far-sightedness see.&lt;/p&gt;&lt;p&gt;When you squint your eyes you also can&amp;#x27;t bring the page in focus making this an ideal substitute for the squint test
without needing to physically squint.&lt;/p&gt;&lt;p&gt;Turn on the emulation and scroll through your site, taking note of the questions above and seeing where improvements can be made.&lt;/p&gt;&lt;img alt=&quot;Far-sightedness in Polypane&quot; src=&quot;/blogs/squint-test/farsightedness.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;h4 id=&quot;placeholdifier-debug-tool&quot;&gt;Placeholdifier debug tool&lt;/h4&gt;&lt;p&gt;But even a blurred page can give you physical discomfort when looking at it for too long, since your eyes will
keep trying to get the page into focus.&lt;/p&gt;&lt;p&gt;With the Placeholdifier debug tool every element stays sharp but text and images become solid blocks of color. With this you
take away the focus on the actual words and imagery and are left with the general layout and hierarchy.&lt;/p&gt;&lt;img alt=&quot;Console panel&quot; src=&quot;/blogs/squint-test/placeholdifier.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;h4 id=&quot;run-them-side-by-side&quot;&gt;Run them side by side&lt;/h4&gt;&lt;p&gt;With Polypane, you can also show these two debug tools side by side. Because each highlights some issue more than the other,
checking a page in both at the same time lets you see the entire overview in one go.&lt;/p&gt;&lt;img alt=&quot;Console panel&quot; src=&quot;/blogs/squint-test/side-by-side.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto;display:block;max-width:100%&quot;/&gt;&lt;h3 id=&quot;try-it-yourself-🤩&quot;&gt;Try it yourself 🤩&lt;/h3&gt;&lt;p&gt;Test out these debug tools, and over 25 others (like color blindness simulators, dyslexia emulation and layout debugging) in Polypane by &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;starting a free 14 day trial&lt;/a&gt;. Polypane is available on Mac, Windows and Linux.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How Sergio Mattei made the next Makerlog 6x faster with Polypane]]></title><description><![CDATA[Sergio is the creator of  Makerlog , a web app that lets Makers log their progress [including  me  - Kilian] and he is building the next…]]></description><link>https://polypane.app/blog/how-sergio-mattei-made-the-next-makerlog-6-x-faster-with-polypane/</link><guid isPermaLink="false">https://polypane.app/blog/how-sergio-mattei-made-the-next-makerlog-6-x-faster-with-polypane/</guid><pubDate>Tue, 01 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Sergio is the creator of &lt;a href=&quot;https://getmakerlog.com&quot;&gt;Makerlog&lt;/a&gt;, a web app that lets Makers log their progress [including &lt;a href=&quot;https://getmakerlog.com/@kilian&quot;&gt;me&lt;/a&gt; - Kilian] and he is building the next version using Polypane. We interviewed him about his challenges and how Polypane helps him.&lt;/em&gt;&lt;/p&gt;&lt;h3 id=&quot;can-you-tell-us-about-yourself-and-makerlog&quot;&gt;Can you tell us about yourself and Makerlog?&lt;/h3&gt;&lt;p&gt;Hi folks! I’m Sergio Mattei, maker of Makerlog. Makerlog is a community of over 6,000 software developers learning, building, and growing publicly, together. On our site, you share your daily tasks &amp;amp; earn a streak (count of consecutive days building your product). &lt;strong&gt;It’s a fantastic model for accountability &amp;amp; community support: with Makerlog, you’ll never feel alone in your journey.&lt;/strong&gt;&lt;/p&gt;&lt;h3 id=&quot;youre-working-on-a-new-version-of-makerlog-what-can-users-expect-from-it&quot;&gt;You&amp;#x27;re working on a new version of Makerlog. What can users expect from it?&lt;/h3&gt;&lt;p&gt;Makerlog’s new version is over six times faster &amp;amp; lighter. It finally brings mobile support, a refreshed design, and a UX that gets out of the way and lets you be more productive with us.&lt;/p&gt;&lt;img alt=&quot;New Makerlog profile&quot; src=&quot;/blogs/makerlog/overview.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:3rem auto 1rem;display:block;max-width:100%&quot;/&gt;&lt;h3 id=&quot;what-challenges-did-you-have-building-this-version&quot;&gt;What challenges did you have building this version?&lt;/h3&gt;&lt;p&gt;The biggest challenge was certainly refactoring the entire codebase. This was, in essence, a total rewrite of the frontend. Now, I’d usually frown upon a rewrite, but this time it was necessary: it wasn’t delivering a level of reliability &amp;amp; performance you’d expect from a solid community product.&lt;/p&gt;&lt;img alt=&quot;New Makerlog Stories page&quot; src=&quot;/blogs/makerlog/stories.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:0rem 0 1rem 3rem;display:block;float:right;max-width:25%&quot;/&gt;&lt;h3 id=&quot;how-have-you-been-using-polypane&quot;&gt;How have you been using Polypane?&lt;/h3&gt;&lt;p&gt;Polypane has been with me since the day I started the redesign. From the moment I decided to build mobile-first, Polypane has been an essential tool in my maker arsenal. It helps me perfect every detail: from multiple screen sizes to even SEO optimization with the integrated meta tags analysis. &lt;strong&gt;It’s, simply put, the essential toolkit to build products users will love.&lt;/strong&gt;&lt;/p&gt;&lt;h3 id=&quot;what-results-did-you-see-when-using-polypane-to-build-the-next-version-of-makerlog&quot;&gt;What results did you see when using Polypane to build the next version of Makerlog?&lt;/h3&gt;&lt;p&gt;I’ve seen shorter dev time, increased mobile usage, and much better SEO &amp;amp; performance rates. Users are happier &amp;amp; less bugs are being reported than ever before.&lt;/p&gt;&lt;h3 id=&quot;whats-next-for-you&quot;&gt;What&amp;#x27;s next for you?&lt;/h3&gt;&lt;p&gt;Makerlog’s future is very bright! We’re launching the new beta to the public in late December, with a relaunch across many platforms. We’re bringing tons of features to help makers learn, build, and grow together.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;It’s the maker’s heyday again. It’s time to get all hands on deck and ship that sh*t, together.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Thank you Sergio for this interview! Sergio can be found on Twitter as &lt;a href=&quot;https://twitter.com/matteing&quot;&gt;@matteing&lt;/a&gt; and on Makerlog as &lt;a href=&quot;https://maker.to/sergio&quot;&gt;Sergio&lt;/a&gt;. Join Sergio, me and 6000 others on the Makerlog community at &lt;a href=&quot;https://getmakerlog.com&quot;&gt;getmakerlog.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Creating websites with prefers-reduced-data]]></title><description><![CDATA[Even though more and more people get access to the internet every day, not all of them have fast gigabit connections or unlimited data…]]></description><link>https://polypane.app/blog/creating-websites-with-prefers-reduced-data/</link><guid isPermaLink="false">https://polypane.app/blog/creating-websites-with-prefers-reduced-data/</guid><pubDate>Fri, 27 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Even though more and more people get access to the internet every day, not all of them have fast gigabit connections or unlimited data. Using the media query &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt; we can keep our sites accessible to everyone. This media query is part of a set of upcoming media queries designed specifically to support different user preferences and their environments.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; Though no browser supports prefers-reduced-data yet, you can emulate the media query in Polypane and, when you enable the right flag, in Chromium.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt; indicates users want to use as little data as possible. We&amp;#x27;ll go over why that&amp;#x27;s important, what support looks like today, the available alternatives, strategies for implementing &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt; in your website and what you can do to actually save data.&lt;/p&gt;&lt;h3 id=&quot;watch-as-video&quot;&gt;Watch as video&lt;/h3&gt;&lt;p&gt;Kilian presented an abridged version of this article at Shortstack Conference. You can watch the video below, or read on for the full article.&lt;/p&gt;&lt;div style=&quot;position:relative;width:100%;padding-top:56.25%&quot;&gt;&lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/TtLMCLZRlp4&quot; title=&quot;YouTube video player&quot; frameBorder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot; style=&quot;position:absolute;top:0px;left:0px;width:100%;height:100%&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;h3 id=&quot;why-reduce-data&quot;&gt;Why reduce data?&lt;/h3&gt;&lt;p&gt;The average size for web pages is slowly climbing: pages are getting bigger and bigger with the average size of a desktop page now being over 2MB, and the average size of a mobile page not being far behind at 1.9MB. It doesn&amp;#x27;t look like this trend is slowing down, the average page size grew by about 40% in the last year along. (source: &lt;a href=&quot;https://httparchive.org/reports/state-of-the-web&quot;&gt;HTTParchive&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;While a 2MB page size might not be such an issue for people on a home network with a gigabit connection, every day more and more people gain access the internet, often with significantly slower connections.&lt;/p&gt;&lt;p&gt;So while the country I&amp;#x27;m from, The Netherlands, sits at #12 word wide with an average (mobile) speed of 100Mbps, a country like India sits all the way down at #128 with an average speed or 15Mbps. India has the second highest number of internet users in the world (behind China), yet only 54% of Indians currently have access to the internet. (sources: &lt;a href=&quot;https://www.speedtest.net/global-index#mobile&quot;&gt;Speedtest&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_countries_by_number_of_Internet_users&quot;&gt;Wikipedia&lt;/a&gt;) That number is growing by 9% every year though. Similar growth is happening in many parts of the world.&lt;/p&gt;&lt;p&gt;In other words: More and more people are gaining access to the internet world wide, yet their internet speed is incomparable to what we are used to in the west.&lt;/p&gt;&lt;p&gt;And then there&amp;#x27;s also data caps.&lt;/p&gt;&lt;p&gt;Most mobile internet subscriptions come with a data cap, after which access to the internet is cut off, or speed is severely reduced. At 2MB per website, if someone has a 1GB data cap that&amp;#x27;s 500 web pages, or just 16 pages per day. (Of &lt;em&gt;average&lt;/em&gt; size. If someone scrolls through Facebook or Twitter, that data will last them a lot shorter)&lt;/p&gt;&lt;p&gt;Just for fun, check out much tabs you currently have open. With just those, are you over your daily budget of 16? (If so, close some! If you were meant to read them, they&amp;#x27;ll find their way back.)&lt;/p&gt;&lt;p&gt;Reducing your web pages&amp;#x27; size helps with both load time for people with slower internet connections and them having access to your pages in the first place.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;A fun anecdote in this vein is how, many years ago, the Youtube team decided to optimize their video pages. It took a long time and a lot of work and at the end they were horrified to find out that the average load time of pages had &lt;strong&gt;gone up&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;All that work for nothing! Turns out now that their pages were now optimized they had actually become usable for a new group of people: those with slower connections. The average load time went up because an entirely new group of users had access to videos for the first time.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;browser-support&quot;&gt;Browser support&lt;/h3&gt;&lt;p&gt;There is none.&lt;/p&gt;&lt;p&gt;Now wait, before you close the tab... &lt;strong&gt;Support is coming&lt;/strong&gt; and, in Polypane and other Chromium browsers (provided you set the right flag, see the &lt;a href=&quot;#testing-with-polypane-and-chromium&quot;&gt;testing&lt;/a&gt; section) you can already emulate the media query so you can future-proof your web pages.&lt;/p&gt;&lt;h3 id=&quot;reduced-data-for-users&quot;&gt;Reduced data for users&lt;/h3&gt;&lt;p&gt;Without browser support, how can users opt in to reduced data? There is another way users can currently already send a preference for reduced data to servers, using the &amp;quot;Save-Data&amp;quot; header. This is build in on Mobile Chromium versions (on Android), and is available in various browsers with browser extensions.&lt;/p&gt;&lt;h4 id=&quot;the-save-data-on-header&quot;&gt;The Save-Data: on header&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; In Polypane, use the &lt;a href=&quot;/docs/emulation/#custom-headers&quot;&gt;Custom headers&lt;/a&gt; to add the &amp;quot;Save-Data: on&amp;quot; header and test with it.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The Save-Data header is a Request Header, something the browser sends to the server. The server can then decide to send a different response (like a smaller image).
Unfortunately this is something front-end developers usually don&amp;#x27;t have much say in. Luckily you can also detect if it&amp;#x27;s on using JavaScript:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;connection&amp;#x27;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; navigator&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;connection&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;saveData &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// prevent loading resources and other data saving measures&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This &amp;quot;connection&amp;quot; api is available in Chromium browsers and behind a flag in Firefox. In addition to checking if saveData is turned on, you can also get the effective internet speed of a connection. You can combine those together to check if a person either has saveData on, or is on a slow connection in general:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; connection &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;connection &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mozConnection &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;webkitConnection &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;connection&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;saveData &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;slow-2g&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;2g&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;3g&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;connection&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;effectiveType&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// prevent loading resources and other data saving measures&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On the one hand having this as a header makes it much more powerful, since you can send entirely different responses from the server. Unfortunately having this as a header also means that it&amp;#x27;s much less flexible and requires a lot of coordination between front-end development, backend developement and server management.&lt;/p&gt;&lt;h3 id=&quot;strategies-for-implementing-prefers-reduced-data&quot;&gt;Strategies for implementing &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt;&lt;/h3&gt;&lt;p&gt;Using a media query on the other hand, is something front-end developers are familiar with and know how to use.&lt;/p&gt;&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt; media query has two possible values:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;no-preference&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;reduce&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Like &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-motion&lt;/code&gt;, it&amp;#x27;s good to think of the &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data: reduce&lt;/code&gt; option as the default option: people get the lean, fast experience, and only when they indicate &lt;code class=&quot;language-text&quot;&gt;no-preference&lt;/code&gt;, we send them more data. That way, &lt;del&gt;older&lt;/del&gt; browser that don&amp;#x27;t support the media query get the lean experience by default.&lt;/p&gt;&lt;p&gt;You might not yet want to do this for new websites until proper support lands. The alternative is to add strategic use of &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data: reduce&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data: no-preference&lt;/code&gt; around your CSS, something we&amp;#x27;ll go into detail on in the next section.&lt;/p&gt;&lt;h3 id=&quot;what-to-use-prefers-reduced-data-for&quot;&gt;What to use &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt; for&lt;/h3&gt;&lt;p&gt;So now that we have some strategies for implementing &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt;, lets go over what to use it for specifically.&lt;/p&gt;&lt;h4 id=&quot;conditionally-load-fonts&quot;&gt;Conditionally load fonts&lt;/h4&gt;&lt;p&gt;Though every web developers likes using custom fonts we&amp;#x27;re also aware of, and often okay with, using alternative fonts. In fact, this is baked into CSS with the concept of &amp;quot;font stacks&amp;quot; and it&amp;#x27;s specifically this feature we can use to our advantage when conditionally loading fonts:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-reduced-data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no-preference&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@font-face&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;Inter var&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100 900&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;font-display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; swap&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;font-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; normal&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;font-named-instance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;Regular&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string url&quot;&gt;&amp;#x27;Inter-roman.var.woff2&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;woff2&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Inter&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; system-ui&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; -apple-system&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; BlinkMacSystemFont&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Segoe UI&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Ubuntu&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Roboto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Cantarell&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Noto Sans&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sans-serif&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&amp;#x27;Apple Color Emoji&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;Segoe UI Emoji&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;Segoe UI Symbol&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;Noto Color Emoji&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In this bit of code, we specify a font-stack that uses system fonts as a fallback, and only load our preferred font (Inter) when &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt; is set to &lt;code class=&quot;language-text&quot;&gt;no-preference&lt;/code&gt;. If Inter is not available, it will automatically use the next available font instead.&lt;/p&gt;&lt;p&gt;If you still want to show your preferred font to older browsers, you can add the media query block around your &lt;code class=&quot;language-text&quot;&gt;body&lt;/code&gt; CSS declaration instead:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@font-face&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;Inter var&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-weight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100 900&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; swap&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; normal&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-named-instance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;Regular&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string url&quot;&gt;&amp;#x27;Inter-roman.var.woff2&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;woff2&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Inter&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; system-ui&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; -apple-system&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; BlinkMacSystemFont&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Segoe UI&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Ubuntu&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Roboto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Cantarell&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Noto Sans&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sans-serif&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&amp;#x27;Apple Color Emoji&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;Segoe UI Emoji&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;Segoe UI Symbol&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;Noto Color Emoji&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-reduced-data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; reduce&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; system-ui&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; -apple-system&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; BlinkMacSystemFont&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Segoe UI&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Ubuntu&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Roboto&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Cantarell&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Noto Sans&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sans-serif&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&amp;#x27;Apple Color Emoji&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;Segoe UI Emoji&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;Segoe UI Symbol&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;Noto Color Emoji&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This has some code duplication, but because web fonts are loaded only when they are used in the page and not when they&amp;#x27;re declared in the CSS, this will still prevent loading the font files.&lt;/p&gt;&lt;h4 id=&quot;alternative-or-no-background-images&quot;&gt;Alternative or no background images&lt;/h4&gt;&lt;p&gt;A quick win is to use different or no background images for your CSS. Even with modern image formats like WebP and AVIF images often are still a significant portion of a web page&amp;#x27;s payload.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Serve a smaller image by default */&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;/images/small-fast-image.webp&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* But replace it with a large image when applicable */&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-reduced-data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no-preference&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;/image/large-pretty-image.png&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or maybe you can do away with the image entirely and only use it to enhance your page:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* use a solid background color by default */&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #353546&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* A nice dark blue */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* Overlay it with a textured version */&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-reduced-data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no-preference&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;&lt;span class=&quot;token function&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;/image/nice-texture.png&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Instead of a solid color, you could also use gradients to approximate the image to get the same feel. Experiment with it!&lt;/p&gt;&lt;h4 id=&quot;load-smaller-images-in-the-page&quot;&gt;Load smaller images in the page&lt;/h4&gt;&lt;p&gt;The picture element can be used to serve different images dependent on a media query, and we can also use the &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt; media query to send a smaller image rather than a full size or 2x retina size image. Either by setting a media feature on a source like so:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;picture&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;source&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;srcset&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;small.jpg&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;media&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;(prefers-reduced-data: reduce)&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;full-size.jpg&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;My image&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;srcset&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;full-size2x.jpg 2x&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;picture&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or by adding it in a sizes attribute, for example like this:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;picture&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;source&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;srcset&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;/small.jpg 200w,
            /full-size.jpg 400w&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token attr-name&quot;&gt;sizes&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;(prefers-reduced-data: reduce) 200px,
           (min-width: 400px) 400px,
           200px&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;full-size.jpg&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;My image&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;picture&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&quot;prevent-preloading-or-autoplaying-videos-with-javascript&quot;&gt;Prevent preloading or autoplaying videos with JavaScript&lt;/h4&gt;&lt;p&gt;Videos can have a significant impact on a page&amp;#x27;s full size (trust me, I have a video on the homepage) and there&amp;#x27;s two things you&amp;#x27;ll want to prevent when someone prefers reduced data: you don&amp;#x27;t want it to auto play (because that will trigger a download) and you also don&amp;#x27;t want to tell the browser to preload it.&lt;/p&gt;&lt;p&gt;Preloading videos makes starting them much faster which is a great experience for your visitors, but if they prefer reduced data and you preload images, you&amp;#x27;re potentially wasting their bandwidth on a video they might not watch.&lt;/p&gt;&lt;p&gt;to prevent autoplaying and preloading videos, we need to use the &lt;code class=&quot;language-text&quot;&gt;window.matchMedia&lt;/code&gt; JavaScript function:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; video &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;video&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; canAutoPlayAndPreload &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;(prefers-reduced-data: no-preference)&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matches&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;autoplay&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; canAutoPlayAndPreload&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;preload&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; canAutoPlayAndPreload&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will test the media query on page load and set the right values for the attributes on your video element. For more on window.matchMedia, read &lt;a href=&quot;https://polypane.app/blog/the-complete-guide-to-css-media-queries/#using-media-queries-in-javascript&quot;&gt;Using media queries in JavaScript&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Unfortunately, since browser support for &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt; is non-existent, this will prevent preloading for &lt;em&gt;all&lt;/em&gt; visitors. For now, it makes more sense to default to the &amp;#x27;happy path&amp;#x27; of preloading and autoplaying if there is no support for &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt;. To test for that, we have a tricky media query we can use:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; supportsPrefersReducedData &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;not all and (prefers-reduced-data), (prefers-reduced-data)&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matches&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Essentially what this says is &amp;quot;evaluate to true when prefers-reduced-data does not match, or when it does match&amp;quot;. &lt;a href=&quot;https://polypane.app/blog/the-complete-guide-to-css-media-queries/#the-or-operator--a-comma&quot;&gt;The comma in a media query acts as an OR&lt;/a&gt;. So it will be true if &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt; is supported, regardless of the value. But if a browser finds a media query it doesnt understand, it will evaluate it to false.&lt;/p&gt;&lt;p&gt;So with this, we can check if there is support in the first place and use that to autoplay and preload either when:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;There is no support.&lt;/li&gt;&lt;li&gt;There is support and the user has no preference.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;That looks like this:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; video &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;video&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; supportsPrefersReducedData &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;not all and (prefers-reduced-data), (prefers-reduced-data)&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matches&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; noPreference &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;(prefers-reduced-data: no-preference)&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matches&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; canAutoPlayAndPreload &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;supportsPrefersReducedData &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;supportsPrefersReducedData &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; noPreference&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;autoplay&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; canAutoPlayAndPreload&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;preload&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; canAutoPlayAndPreload&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can improve on this even further by also taking the &amp;quot;Save-Data&amp;quot; header I mentioned earlier into account:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; video &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;video&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; connection &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;connection &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mozConnection &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;webkitConnection &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// default to save data being on&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; saveData &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; connection&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;saveData &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; slowConnection &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;slow-2g&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;2g&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;3g&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;connection&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;effectiveType&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; supportsPrefersReducedData &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;not all and (prefers-reduced-data), (prefers-reduced-data)&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matches&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; noPreference &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;(prefers-reduced-data: no-preference)&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matches&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; canAutoPlayAndPreload &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;supportsPrefersReducedData &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;supportsPrefersReducedData &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; noPreference&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;saveData &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; slowConnection&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;autoplay&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; canAutoPlayAndPreload&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;preload&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; canAutoPlayAndPreload&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&quot;dont-auto-load-more-data-on-infinitely-scrolling-pages&quot;&gt;Don&amp;#x27;t auto-load more data on infinitely scrolling pages&lt;/h4&gt;&lt;p&gt;Lastly, when users have &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data: reduce&lt;/code&gt; on it&amp;#x27;s advisable to prevent loading in more data without explicit consent from the user.&lt;/p&gt;&lt;p&gt;If you have an infinitely scrolling page that loads in more data, like Twitter, Facebook or Reddit, consider instead adding a &amp;quot;Load more&amp;quot; button when you detect the user prefers reduced data. The implementation of this is going to depend on your own code, but could look something like this:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; button &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;.loadmore-button&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; list &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;.my-list&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; showButton &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&amp;#x27;(prefers-reduced-data: reduce)&amp;#x27;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matches&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;showButton&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  list&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;button&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;click&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; loadMoreData&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  list&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;scroll&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; shouldLoadData &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* code that checks the scroll position */&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;shouldLoadData&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;loadMoreData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;loadMoreData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// fetch data, show it.&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;testing-with-polypane-and-chromium&quot;&gt;Testing with Polypane and Chromium&lt;/h3&gt;&lt;p&gt;As you start to implement this media query you&amp;#x27;ll want to check if your site still looks and behaves like you expect it to. A nice way to test it is to keep two screens side by side so you can compare the differences between the normal view and the reduced data view.&lt;/p&gt;&lt;p&gt;Since there is no browser implementation yet, you can&amp;#x27;t turn it on with an OS setting (like you can for dark mode). However, you can emulate support for the media query in Polypane and in Chromium.&lt;/p&gt;&lt;div style=&quot;position:relative;display:flex;flex-direction:row;flex-wrap:wrap&quot;&gt;&lt;div class=&quot;childPadding&quot; style=&quot;flex:1 1 320px;padding:0 1rem 0 0&quot;&gt;&lt;h4&gt;Prefers reduced motion emulation in Chromium&lt;/h4&gt;&lt;p&gt;Turning reduced data emulation on in Chromium is done through the rendering pane, but you&amp;#x27;ll have to enable the emulation feature before it&amp;#x27;s visible.&lt;/p&gt;&lt;p&gt;First, you&amp;#x27;ll want to go to &lt;code class=&quot;language-text&quot;&gt;chrome://flags&lt;/code&gt; in your browsers.&lt;/p&gt;&lt;img alt=&quot;step 1&quot; src=&quot;/blogs/reduced-data/chrome1.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:3rem auto 1rem;display:block;max-width:100%;width:443px&quot;/&gt;&lt;p&gt;Search for &lt;code class=&quot;language-text&quot;&gt;#enable-experimental-web-platform-features&lt;/code&gt; and enable it.&lt;/p&gt;&lt;img alt=&quot;step 2&quot; src=&quot;/blogs/reduced-data/chrome2.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:3rem auto 1rem;display:block;max-width:100%;width:443px&quot;/&gt;&lt;p&gt;Restart Chromium.&lt;/p&gt;&lt;img alt=&quot;step 3&quot; src=&quot;/blogs/reduced-data/chrome3.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:3rem auto 1rem;display:block;max-width:100%;width:443px&quot;/&gt;&lt;p&gt;Open your devtools and click the three dots (&amp;quot;kebab&amp;quot; menu) in the top right. Then go to &amp;quot;more tools&amp;quot; and select &amp;quot;Rendering&amp;quot;.&lt;/p&gt;&lt;img alt=&quot;step 4&quot; src=&quot;/blogs/reduced-data/chrome4.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:3rem auto 1rem;display:block;max-width:100%&quot;/&gt;&lt;p&gt;In the newly opened Rendering pane you&amp;#x27;ll see a whole bunch of checkmarks, scroll past them all the way to the bottom.&lt;/p&gt;&lt;img alt=&quot;step 5&quot; src=&quot;/blogs/reduced-data/chrome5.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:3rem auto 1rem;display:block;max-width:100%&quot;/&gt;&lt;p&gt;There is a dropdown with the title &amp;quot;Emulate CSS media feature prefers-reduced-data&amp;quot;, that you can set from &amp;quot;No emulation&amp;quot; to &amp;quot;prefers-reduced-data: reduce&amp;quot;.&lt;/p&gt;&lt;img alt=&quot;step 6&quot; src=&quot;/blogs/reduced-data/chrome6.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:3rem auto 1rem;display:block;max-width:100%&quot;/&gt;&lt;p&gt;The pane is now in reduced data mode and you can begin testing.&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;childPadding&quot; style=&quot;position:sticky;top:150px;flex:1 1 320px;padding:0 0 0 1rem;align-self:flex-start&quot;&gt;&lt;h4 id=&quot;prefers-reduced-motion-emulation-in-polypane&quot;&gt;Prefers reduced motion emulation in Polypane&lt;/h4&gt;&lt;p&gt;Turning reduced data emulation on in Polypane is done through the emulation settings of a pane.&lt;/p&gt;&lt;img alt=&quot;The Emulation panel in Polypane with prefers-reduced-data highlighted&quot; src=&quot;/blogs/reduced-data/emulation.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:1rem 0 1rem 3rem;display:block;float:right;max-width:50%&quot;/&gt;&lt;p&gt;Go to the Emulate settings of that pane, and click the toggle for &amp;quot;prefers-reduced-data&amp;quot;.&lt;/p&gt;&lt;p&gt;The pane is now in reduced data mode and you can begin testing.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3 id=&quot;in-the-wild&quot;&gt;In the wild&lt;/h3&gt;&lt;p&gt;I haven&amp;#x27;t seen &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt; in the wild yet which is unsurprising given how browsers do not support it yet.&lt;/p&gt;&lt;p&gt;I&amp;#x27;ll be adding some of the techniques I showed in this article to the Polypane website in the next few weeks.&lt;/p&gt;&lt;p&gt;If you decide to implement reduced data on your site, &lt;a href=&quot;https://twitter.com/polypane&quot;&gt;let me know&lt;/a&gt; and we&amp;#x27;ll see if we can make a list of sites experimenting with this feature!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 4: Unified Console, DOM tree in elements panel]]></title><description><![CDATA[A new unified Polypane console, a treeview in the elements panel,  prefers-reduced-data  and locale emulation, docked devtools for isolated…]]></description><link>https://polypane.app/blog/polypane-4-unified-console-dom-tree-in-elements-panel/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-4-unified-console-dom-tree-in-elements-panel/</guid><pubDate>Mon, 09 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A new unified Polypane console, a treeview in the elements panel, &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt; and locale emulation, docked devtools for isolated panes, new and updated social media previews and debug tools, Chromium 87 and over 60 new features, improvements and fixes.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Polypane is the browser for developing responsive, fast &amp;amp; accessible websites. It has powerful devtools, multiple synced viewports, over 25 debug tools, device emulation, built-in live-reloading and much more. &lt;a href=&quot;/&quot;&gt;More about Polypane&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;unified-console&quot;&gt;Unified console&lt;/h2&gt;&lt;p&gt;Polypane now comes with a single place that shows the console messages from all panes. Messages are automatically deduplicated, color-coded and you can easily see which panes emitted which messages. You can log strings, arrays, objects, elements and even DOM objects (like &lt;code class=&quot;language-text&quot;&gt;window&lt;/code&gt;), we support &lt;code class=&quot;language-text&quot;&gt;log&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;info&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;debug&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;table&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;warn&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;error&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;dir&lt;/code&gt; and you can easily filter messages by type or by text.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;But the Polypane console doesn&amp;#x27;t just &lt;em&gt;show&lt;/em&gt; console messages.&lt;/strong&gt; It&amp;#x27;s a fully functioning console that lets you send console commands to all panes at the same time.&lt;/p&gt;&lt;img alt=&quot;Console panel&quot; src=&quot;/blogs/polypane-4/console-small.gif&quot; class=&quot;imgshadow&quot; margin:=&quot;&quot; display:=&quot;&quot; maxwidth:=&quot;&quot;/&gt;&lt;p&gt;There&amp;#x27;s syntax highlighting as you type, multiline commands, it remembers previous commands (easily go back to them using the arrow keys) and a whole host of convenience utilities: &lt;code class=&quot;language-text&quot;&gt;$0&lt;/code&gt; through &lt;code class=&quot;language-text&quot;&gt;$4&lt;/code&gt; are the last five elements selected in the Polypane elements panel, &lt;code class=&quot;language-text&quot;&gt;$()&lt;/code&gt; maps to &lt;code class=&quot;language-text&quot;&gt;querySelector&lt;/code&gt; while &lt;code class=&quot;language-text&quot;&gt;$$()&lt;/code&gt; is the same as &lt;code class=&quot;language-text&quot;&gt;querySelectorAll&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;$_&lt;/code&gt; is the output of the previous command etc. Check the &lt;a href=&quot;/docs/console/#console-commands&quot;&gt;console panel documentation&lt;/a&gt; for the full list.&lt;/p&gt;&lt;p&gt;We&amp;#x27;ve been using it ourselves for a while and it really changes how you work with multiple panes. The console works just like you expect it to and getting feedback across all panes for a single command really cuts back on debugging time.&lt;/p&gt;&lt;div style=&quot;position:relative;width:100%;padding-top:56.25%&quot;&gt;&lt;a id=&quot;video&quot; style=&quot;position:absolute;top:-100px&quot;&gt;&lt;/a&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/ADvdTqFvLYk?&amp;amp;autoplay=false&amp;amp;start=0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; style=&quot;position:absolute;top:0px;left:0px;width:100%;height:100%&quot; frameBorder=&quot;0&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;h2 id=&quot;dom-tree-in-element-inspector&quot;&gt;DOM Tree in Element inspector&lt;/h2&gt;&lt;p&gt;The unified element inspector in Polypane lets you easily inspect and edit elements across all panes. Since launching it April of this year we&amp;#x27;ve made some big improvements to it and in Polypane 4 we&amp;#x27;re making another leap.&lt;/p&gt;&lt;p&gt;A lot of you have been asking for a DOM tree view of the document, and after creating the view-source panel in our previous release, we went one step beyond and built the tree view for the Polypane element inspector as well.&lt;/p&gt;&lt;p&gt;The new tree view gives you a great overview of your page, from the &lt;code class=&quot;language-text&quot;&gt;doctype&lt;/code&gt; to the most deeply nested elements, and makes it easier than ever to switch between elements.&lt;/p&gt;&lt;img alt=&quot;Tree view in elements panel&quot; src=&quot;/blogs/polypane-4/treeview.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto&quot;/&gt;&lt;p&gt;It&amp;#x27;s still really easy to select child element and text nodes and edit them, and we&amp;#x27;ve redesigned the bottom-aligned element inspector to make better use of the space.&lt;/p&gt;&lt;h2 id=&quot;docked-devtools-in-isolate-pane-mode&quot;&gt;Docked devtools in isolate pane mode&lt;/h2&gt;&lt;p&gt;We&amp;#x27;re also continuing to make improvements to our isolate pane mode, which gives you access to device and media query emulation.&lt;/p&gt;&lt;p&gt;Devtools for isolated panes are now docked automatically in the Panel where you can easily access them and switch between them. If you prefer them undocked, that option is still available too.&lt;/p&gt;&lt;h3 id=&quot;updates-to-the-devtools-extension-manager&quot;&gt;Updates to the devtools extension manager&lt;/h3&gt;&lt;p&gt;From the devtools panel you can also easily open the &lt;a href=&quot;/docs/browser-extensions/&quot;&gt;browser extension manager&lt;/a&gt; where you can install your favorite developer tool extensions like the React.js or Vue.js devtools. Updated in this version of Polypane, we show the icon and version number of each extension.&lt;/p&gt;&lt;h2 id=&quot;new-emulation-options-prefers-reduced-data-orientation-and-locale&quot;&gt;New emulation options: prefers-reduced-data, orientation and locale&lt;/h2&gt;&lt;img alt=&quot;Redesigned emulation options&quot; src=&quot;/blogs/polypane-4/emulation.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:1em 0 1rem 1rem;float:right&quot;/&gt;&lt;p&gt;We redesigned the emulation panel to make changing and experimenting with different emulation options easier. Because &lt;code class=&quot;language-text&quot;&gt;prefers-color-scheme&lt;/code&gt; is removing the &lt;code class=&quot;language-text&quot;&gt;no-preference&lt;/code&gt; option, all our media feature settings can be toggles, making it easy to see at a glance which option is on and which is not.&lt;/p&gt;&lt;h3 id=&quot;prefers-reduced-data&quot;&gt;prefers-reduced-data&lt;/h3&gt;&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt; media feature is currently trialing in Chromium 87 and can be used to serve up lighter versions of backgrounds, fonts and other elements loaded through CSS (or not loaded because of CSS, like with hidden elements) to preserve data for people that are on slow connections or have data caps.&lt;/p&gt;&lt;p&gt;We think this feature can have a big impact on websites and are excited to make testing it as easy as clicking a single toggle.&lt;/p&gt;&lt;h3 id=&quot;orientation&quot;&gt;Orientation&lt;/h3&gt;&lt;p&gt;Polypane now automatically sends orientation change events when you rotate a pane. If your app depends on these JS events, you can now very easily test them inside Polypane.&lt;/p&gt;&lt;p&gt;This is different from the CSS &lt;code class=&quot;language-text&quot;&gt;orientation&lt;/code&gt; media feature, which has always worked in Polpane. This feature adds the JS events and matching window.screenOrientation values.&lt;/p&gt;&lt;h3 id=&quot;locale&quot;&gt;Locale&lt;/h3&gt;&lt;p&gt;Locale lets you request pages with any locale other than your default locale, and this influences for example the &lt;code class=&quot;language-text&quot;&gt;Intl&lt;/code&gt; api.&lt;/p&gt;&lt;p&gt;We&amp;#x27;ve preloaded all the locales we know (and quite a few we don&amp;#x27;t know) so selecting the one you want to test with, whether that&amp;#x27;s &lt;code class=&quot;language-text&quot;&gt;en-US&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;nl-NL&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;az-Cyrl-AZ&lt;/code&gt; is easy.&lt;/p&gt;&lt;h2 id=&quot;redesigned-getting-started-page&quot;&gt;Redesigned &amp;quot;getting started&amp;quot; page&lt;/h2&gt;&lt;p&gt;Polypane is a tool with a lot of features and a lot of depth, and we haven&amp;#x27;t been doing the best job in explaining the basics. With our redesigned &amp;quot;getting started&amp;quot; page this changes.&lt;/p&gt;&lt;p&gt;We gave it a fresh new design with support for both both light and dark modes, It has two dozen new tips, the latest news, easy links to documentation, blogs and support and will tell you when there&amp;#x27;s a new version of Polypane available.&lt;/p&gt;&lt;p&gt;It also gives you a checklist of seven things to get familiar with as your first use Polypane. As you use Polypane, these items will automatically be checked and if you need help, there&amp;#x27;s explanations on how to do each of the things with links to documentation.&lt;/p&gt;&lt;p&gt;We hope this helps people get familiar with managing panes in Polypane as fast as possible, so they can explore all the features Polypane has to offer.&lt;/p&gt;&lt;img alt=&quot;New getting started page&quot; src=&quot;/blogs/polypane-4/gettingstarted.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:2rem auto&quot;/&gt;&lt;h2 id=&quot;overlays-are-now-debug-tools-and-new-disable-css-debug-tool&quot;&gt;Overlays are now Debug tools, and new Disable CSS Debug tool&lt;/h2&gt;&lt;p&gt;We&amp;#x27;ve renamed the &amp;quot;Overlays&amp;quot; to Debug tools to make them easier to understand and find and along with it, have updated the icon to something less abstract.&lt;/p&gt;&lt;p&gt;We&amp;#x27;ve also added a new &lt;del&gt;Overl&lt;/del&gt;... Debug tool, &amp;quot;Disable CSS&amp;quot;. As you can probably guess, this disables &lt;em&gt;all&lt;/em&gt; CSS on a page, both linked stylesheets and style attributes, giving you the raw HTML styling.&lt;/p&gt;&lt;img alt=&quot;New maximum with for columns&quot; src=&quot;/blogs/polypane-4/disableoverlay.jpg&quot; class=&quot;imgshadow&quot; style=&quot;margin:1rem auto&quot;/&gt;&lt;h2 id=&quot;new-and-updated-social-media-previews&quot;&gt;New and updated social media previews&lt;/h2&gt;&lt;p&gt;Since the beginning of 2020 Polypane has offered pixel perfect and up-to-date social media previews, updating them whenever the site designs changes. This takes a lot of research to make sure we use the same rendering logic and fallback values as the each service. It&amp;#x27;s a lot of effort but we feel it&amp;#x27;s worth it to be sure of how the elements render. If you can&amp;#x27;t depend on a preview you still have to check the real thing, wasting your time.&lt;/p&gt;&lt;p&gt;So we keep track of changes. The first time this happened was back in January, two weeks after we launched out previews, when Google SERPs changed from the green breadcrumb under the title to a grey breadcrumb above the title.&lt;/p&gt;&lt;p&gt;If your current web development tool still renders SERPS like this:&lt;/p&gt;&lt;img alt=&quot;Outdated Google SERP preview&quot; src=&quot;/blogs/polypane-4/serp-old.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:1rem auto&quot;/&gt;&lt;p&gt;Instead of like this:&lt;/p&gt;&lt;img alt=&quot;Polypane&amp;#x27;s Google SERP preview&quot; src=&quot;/blogs/polypane-4/serp-poly.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:1rem auto&quot;/&gt;&lt;p&gt;Then they&amp;#x27;re &lt;em&gt;at least&lt;/em&gt; 10 months out of date.&lt;/p&gt;&lt;p&gt;As for Polypane, it definitely wasn&amp;#x27;t the preview we expected to have to change first, but we &lt;a href=&quot;https://twitter.com/polypane/status/1222162334237499396&quot;&gt;swiftly updated&lt;/a&gt; even as their experiment was still running.&lt;/p&gt;&lt;h3 id=&quot;linkedin-update&quot;&gt;LinkedIn update&lt;/h3&gt;&lt;p&gt;This month LinkedIn launched their new design, updating the colors, margins, amount of text they display and adding a &amp;quot;X min read&amp;quot; indicator.&lt;/p&gt;&lt;p&gt;We&amp;#x27;ve updated our LinkedIn design so you can be sure that if it renders the way you want in Polypane, it renders the way you want on LinkedIn.&lt;/p&gt;&lt;img alt=&quot;LinkedIn preview&quot; src=&quot;/blogs/polypane-4/linkedin.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:1rem auto&quot;/&gt;&lt;h3 id=&quot;telegram-web&quot;&gt;Telegram (web)&lt;/h3&gt;&lt;p&gt;We got many requests to add Telegram so we reverse-engineered their previews and made an identical copy in Polypane. Telegram&amp;#x27;s previews work similar to those of Slack and Discord, but they impose more limits on the description length (if you follow Polypane&amp;#x27;s meta info suggestions you&amp;#x27;ll be fine!) and have smaller image previews.&lt;/p&gt;&lt;img alt=&quot;Telegram preview&quot; src=&quot;/blogs/polypane-4/telegram.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:1rem auto&quot;/&gt;&lt;h2 id=&quot;new-ruler-options&quot;&gt;New ruler options&lt;/h2&gt;&lt;p&gt;Fluid columns and grids can now be given a maximum width so you can easily copy over the grid system a designer made in Sketch, Figma or XD and overlay it on your site as you work.&lt;/p&gt;&lt;p&gt;Additionally, you can now toggle the visibility of guides, grids, columns and rows without removing their settings so they&amp;#x27;re easier to use and you don&amp;#x27;t have to re-apply them every time you want to use them.&lt;/p&gt;&lt;img alt=&quot;New maximum with for columns&quot; src=&quot;/blogs/polypane-4/columns.jpg&quot; class=&quot;imgshadow&quot; style=&quot;margin:1rem auto&quot;/&gt;&lt;h2 id=&quot;chromium-87&quot;&gt;Chromium 87&lt;/h2&gt;&lt;p&gt;Polypane now runs Chromium 87, slightly ahead of the official Chromium release. Chromium 87 brings a host of improvements to Polypane (like the &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt; emulation and &lt;code class=&quot;language-text&quot;&gt;sameSite&lt;/code&gt; support for cookies among other things) and has some nice performance improvements as well. This is a bit of an experiment for us so we&amp;#x27;re keen to hear your input. Let us know if you like Polypane being a little ahead of the official Chrome!&lt;/p&gt;&lt;h2 id=&quot;improved-support-for-linux-systems&quot;&gt;Improved support for Linux systems&lt;/h2&gt;&lt;p&gt;Previous versions of Polypane used native code for some functionality but starting with Polypane 4 we have no native code anymore. This means that Polypane will run on far more versions of Linux. If you had trouble running Polypane in the past, or you&amp;#x27;re running Polypane in a VM, then this release will let you run it natively.&lt;/p&gt;&lt;h2 id=&quot;other-updates&quot;&gt;Other updates&lt;/h2&gt;&lt;p&gt;With over 60 changes in total this announcement is long enough. As always all the documentation has been updated for the new release, and you can find the full changelog below.&lt;/p&gt;&lt;p&gt;Some other updates I wanted to highlight:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;We added new presets for iPhone 12.&lt;/li&gt;&lt;li&gt;A whole bunch of UI tweaks like a new layout for the bottom-aligned meta panel.&lt;/li&gt;&lt;li&gt;Performance improvements around CRA and Webpack sites with lots of injected CSS.&lt;/li&gt;&lt;li&gt;Scrolling performance and hover syncing improvements.&lt;/li&gt;&lt;li&gt;And a number of bug fixes around pane size handling and custom homepages.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;It&amp;#x27;s a big release, we hope you like it.&lt;/p&gt;&lt;h3 id=&quot;getting-polypane-4&quot;&gt;Getting Polypane 4&lt;/h3&gt;&lt;p&gt;Polypane will automatically update on Mac and Windows. Linux users need to download the new version from
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; and if you&amp;#x27;re on Mac and Windows but don&amp;#x27;t want to wait on the update popup, you can find
your download there as well.&lt;/p&gt;&lt;p&gt;If you don&amp;#x27;t have Polypane yet there is a free 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Get it here&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&quot;full-changelog&quot;&gt;Full Changelog&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Polypane unified console panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Element inspector now has a tree view&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Docked devtools for isolate pane mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Disable CSS debug tool&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Telegram (web) meta preview&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Prefers-reduced-data emulation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Locale emulation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Support for screen orientation events&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Redesigned getting started page&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Redesigned emulation options popover&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Chromium 87&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; iPhone 12 presets&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Tabs scroll into view when added&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Support for setting the sameSite value for cookies&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Right-click new tab button to choose layout and set default layout&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Right-click between panes to add new pane there&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Tabs are colored by favicon&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Meta panel is colored by favicon&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Overlays are now called &amp;quot;Debug tools&amp;quot; and has a new icon&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; &amp;quot;Simplified breakpoints&amp;quot; now uses mobile-first logic&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Linkedin Card redesign&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Column and Row overlays now support max size&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Ruler overlays can now be turned off individually&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Scroll sync performance for pages with many links is improved&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; New Element inspector horizontal view layout&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; New Meta panel horizontal view layout&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; New Storage panel horizontal view layout&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta name and properties are now cast to lowercase for consistency&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel strips whitespace for the class attribute&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Box model rendering in dark mode now has appropriate colors&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Updated Google Fonts to latest available fonts and variable fonts&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Sync hover styles for uncomputed shorthand styles&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Devtools manager shows icon and version of extension&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Hide the scrollbar when the pane area is not focused&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Naming consistency in main menu improved&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Reload menu now shows shortcuts&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Update iOS and Device lab workspace presets&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; CSS Frameworks workspace presets now get calculated height&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Favicon testing is now more efficient&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Collapse box model now has a chevron icon&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Overflow detection now re-runs on pane resize&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Accessibility panel upgraded to axe-core 4.0.2&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Accessibility panel HTML code is syntax highlighted&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Store last used inspect element type in isolate pane mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; individual pane zoom can now go up to 2&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Always show pane emulation options for discoverability&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Panel rendering performance&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Tab out of filled-in css rule in elements panel to apply it&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Polypane becoming very slow with invalid HTML&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; New panes in horizontal and vertical layout are now consistently sized&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Disable discretionary ligatures in Slack and Discord previews&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; iPhone 11 viewport size&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Remove ligatures in Accessibility panel code examples&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Remove newlines in Accessibility panel code examples&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; There is no longer uneditable CSS in devtools&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where Live CSS wasn&amp;#x27;t applied to isolate panes on app launch&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent dragging app on mac when trying to select text&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Meta data refresh no longer triggers an Accessibility test&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Bug where pane presets overwrote default workspaces&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Address bar now also gets focused when user has a custom homepage&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent Debug tools and Emulation popovers from overflowing the viewport&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent pane icons clipping popovers&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent tabs overwriting each other when a user has a custom homepage&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where clicking the ruler options scrolled the pane area&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Search params are correctly restored on url load&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Alignment of copy icon for element.style&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Replace Sharp with Jimp for cross-platform compatibility&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;401-changelog&quot;&gt;4.0.1 changelog&lt;/h3&gt;&lt;p&gt;4.0.1 fixes a number of performance issues and bugs, as well as improvements for the elements, console and outline panel&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Link overview in Outline panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Header overview in Outline panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Landmark overview in Outline panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;cmd/ctrl + shift + l&lt;/code&gt; shortcut to open side browser and focus its address bar&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Tailwind CSS 2.0 2xl breakpoint added to workspace&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Element panel style values now grow to fit content&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Element panel support color picker for custom properties and other color-like properties&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Toggle between viewport size and device size is now more explicit&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Treeview performance for long pages increased by order of magnitude&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Synced hover styles no longer show up in elements panel and treeview&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Better combining of similar Console messages&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel supports HTML4 style of charset&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Mac UI alignment fixes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Now correctly syncs clicks on elements that get removed from the DOM as a result of the click&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Support trailing &lt;code class=&quot;language-text&quot;&gt;;&lt;/code&gt; when adding new styles.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; External CSS Files that give a 404 are no longer loaded&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Element panel no longer changes &amp;#x27;px&amp;#x27; to &amp;#x27;x&amp;#x27; when using arrow keys&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue with auto updating failing due to double download&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Getting started page no longer shows overlapping tips&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Breakpoints quickswitcher in focus mode now works again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Mac users can now drag Polypane with devtools open&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Docked devtools in isolate pane mode now accept mouse input&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;402-changelog&quot;&gt;4.0.2 changelog&lt;/h3&gt;&lt;p&gt;4.0.2 adds automated link checking, fixes a number of interaction bugs and improves rendering speed.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Link overview now checks for broken links and links with issues.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Live onboarding chat support + live chat support through help menu&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Middle click on history items or address bar suggestions to open them in a new tab.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Live reload indicators are now also visible on tabs&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Page load times improved by smarter loading of Polypane debug styles.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Slack card rendering now supports labels and article published time&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Reference image now retina-screen aware, so no longer resizes panes on Mac (Thanks Yahya!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Polypane is now smarter about focusing the address bar, only focusses it when manually adding a new tab.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Easier selection of elements in the element panel (Thanks Alex!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Element tooltip now shows accessible name and role when available&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Element inspector now prevent clicks on underlying elements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; More CSS Custom properties now have color pickers&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Outline panel now defaults to headers overview&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Outline panel header is now always visible.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Dark theme refinements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Polypane scrollbar now adapts to dark theme&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Speed improvement for SCSS in Live CSS panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Keyboard syncing now more reliable (Thanks Alex!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; More resilient handling of (potentially broken) external stylesheets&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Telegram Web image sizing more accurate&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Minimum pane size updates from 100x100 to 50x50 (Thanks Joel!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where element highlighting wasn&amp;#x27;t visible for partically covered elements (Thanks Lori!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Text in element tooltip now always left-aligned.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Opening new tabs in Isolate pane mode no longer also opens a popup window&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Right-click on history items no longer opens new tab&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Tab bar had a focus ring&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Parent styles being removed after hover&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Switching between panel tabs lost which inner tab was focused&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where the address bar was spell-checked&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;403-changelog&quot;&gt;4.0.3 changelog&lt;/h3&gt;&lt;p&gt;4.0.3 adds Big sur and M1 support for Polypane and many performance improvements.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Universal Mac binary&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Big Sur style icon for Mac (Thank you many people!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; View source is now automatically formatted by Prettier&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Unneeded Scrollbar emulation debug tool&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; File menu added for Mac users (Thanks John!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Retina support for rulers&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Slack preview uses the correct favicon&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Support for all discrete facebook widths&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Handoff/Browse panel renamed to just Browse&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Updated Google fonts database&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Load performance improvements for sites with stylesheets with 30K+ CSS selectors like Tailwind 2 dev version (Thanks Bjoern and Vivian!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Performance improvements for side panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Linux Icon sizes update&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Devtools button now opens devtools for first pane in Isolate pane mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Better CSS Breakpoint detection in 3rd party stylesheets&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Live Chat support available during signup flow as well&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Wobbly reload icon on Mac&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Closing panel through close button always hide devtools too&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Browser layout resizing issue in isolate pane mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Warning on re-opening the window on Mac&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Live CSS panel not clearing style when removing SCSS&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Devtools inner panel resizing issue (Thanks Alex!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent double load for Outline panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent double load for Element panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent new tabs from being opened when opening a new url from suggestions with arrow keys&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Guides were off by one&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Polypane demo with Shawn @swyx Wang]]></title><description><![CDATA[Last Tuesday together with Shawn  @swyx  Wang we held a livestream to give a tour of Polypane.
We used Shawn's website to go through most of…]]></description><link>https://polypane.app/blog/polypane-demo-with-shawn-swyx-wang/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-demo-with-shawn-swyx-wang/</guid><pubDate>Fri, 16 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Last Tuesday together with Shawn &lt;a href=&quot;https://twitter.com/swyx&quot;&gt;@swyx&lt;/a&gt; Wang we held a livestream to give a tour of Polypane.
We used Shawn&amp;#x27;s website to go through most of the features Polypane has to offer and shared thoughts on modern web development
and browsers. Watch the entire live stream here:&lt;/p&gt;&lt;div style=&quot;position:relative;width:100%;padding-top:56.25%&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/GXGx90FqJEE?autoplay=false&amp;amp;start=0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; style=&quot;position:absolute;top:0px;left:0px;width:100%;height:100%&quot; frameBorder=&quot;0&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[How to find the cause of horizontal scrollbars]]></title><description><![CDATA[One of the most time consuming issues when it comes to web development is  debugging horizontal scrollbars . They're easy to overlook while…]]></description><link>https://polypane.app/blog/strategies-for-dealing-with-horizontal-overflows/</link><guid isPermaLink="false">https://polypane.app/blog/strategies-for-dealing-with-horizontal-overflows/</guid><pubDate>Thu, 08 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;One of the most time consuming issues when it comes to web development is &lt;strong&gt;debugging horizontal scrollbars&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;They&amp;#x27;re easy to overlook while developing (especially on macs) and if users scrolls horizontally, your layout will look broken to them.&lt;/p&gt;&lt;p&gt;On top of that it&amp;#x27;s hard to determine which element is causing the overflow.&lt;/p&gt;&lt;h2 id=&quot;what-causes-horizontal-scrollbars&quot;&gt;What causes horizontal scrollbars?&lt;/h2&gt;&lt;p&gt;There area few common causes for horizontal scrollbars and overflows:&lt;/p&gt;&lt;h3 id=&quot;setting-the-width-of-the-body-to-100vw&quot;&gt;Setting the width of the body to &lt;code class=&quot;language-text&quot;&gt;100vw&lt;/code&gt;&lt;/h3&gt;&lt;p&gt;The viewport width unit (&lt;code class=&quot;language-text&quot;&gt;vw&lt;/code&gt;) is a useful way to make things a certain percentage of the screen wide.&lt;/p&gt;&lt;p&gt;When you use &lt;code class=&quot;language-text&quot;&gt;100vw&lt;/code&gt; however, you make something the full width of the viewport and this &lt;strong&gt;includes the width of scrollbars&lt;/strong&gt;. So the end result is that your page is slightly wider than the available width (which is the full width of the viewport &lt;strong&gt;without the scrollbars&lt;/strong&gt;).&lt;/p&gt;&lt;p&gt;In short: if you use &lt;code class=&quot;language-text&quot;&gt;width: 100vw&lt;/code&gt; on a page that has a vertical scrollbar you end up with a horizontal overflow.&lt;/p&gt;&lt;p&gt;The easy fix is to use &lt;code class=&quot;language-text&quot;&gt;width: 100%&lt;/code&gt; instead. Percentages don&amp;#x27;t include the width of the scrollbar, so will automatically fit.&lt;/p&gt;&lt;p&gt;If you can&amp;#x27;t do that, or you&amp;#x27;re setting the width on another element, add &lt;code class=&quot;language-text&quot;&gt;overflow-x: hidden&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;overflow: hidden&lt;/code&gt; to the surrounding element to prevent the scrollbar.&lt;/p&gt;&lt;h3 id=&quot;fixed-width-elements&quot;&gt;Fixed width elements&lt;/h3&gt;&lt;p&gt;An image or element might have a width of 500px in your desktop layout. When you hardcode that in your CSS, it&amp;#x27;s going to cause a scrollbar on mobile screens that are only 375 pixels wide.&lt;/p&gt;&lt;p&gt;That might sound overly simple, but it&amp;#x27;s often the cause of overflow issues. Particularly when images are added through a CMS.&lt;/p&gt;&lt;p&gt;This happens more when you develop the desktop version first, so &lt;a href=&quot;/blog/responsive-design-ground-rules/#rule-2-mobile-first&quot;&gt;Mobile first design&lt;/a&gt; is a good prevention.&lt;/p&gt;&lt;h3 id=&quot;not-clipping-off-screen-elements-or-elements-that-are-wider-than-the-viewport&quot;&gt;Not clipping off-screen elements or elements that are wider than the viewport&lt;/h3&gt;&lt;p&gt;Some design elements might require you to place them outside of the viewport.&lt;/p&gt;&lt;p&gt;Like a menu that slides in the from the right or a wider-than-the-viewport-element with rounded corners to get a certain curve in your design like in this video:&lt;/p&gt;&lt;div&gt;&lt;div style=&quot;height:0;width:100%&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;The curve on that site extended past the viewport. Because it wasn&amp;#x27;t contained in an element with &lt;code class=&quot;language-text&quot;&gt;overflow: hidden&lt;/code&gt;, all of it was visible after you scrolled.&lt;/p&gt;&lt;h2 id=&quot;finding-horizontal-scrolling-issues&quot;&gt;Finding horizontal scrolling issues&lt;/h2&gt;&lt;p&gt;Now that we know some of the reasons overflow happens, lets look at how to find them.&lt;/p&gt;&lt;h3 id=&quot;using-the-devtools&quot;&gt;Using the devtools&lt;/h3&gt;&lt;p&gt;To find out which elements cause a horizontal scrollbar, you can use the devtools to delete elements one by one until the scrollbar disappears.&lt;/p&gt;&lt;p&gt;When that happens, press &lt;kbd&gt;ctrl/cmd Z&lt;/kbd&gt; to undo the delete, and drill down into the element to figure out which of the child elements cause the horizontal scrollbar. That works in all browser devtools.&lt;/p&gt;&lt;p&gt;This is obviously very time consuming, so it helps to make all elements visible.&lt;/p&gt;&lt;h3 id=&quot;adding-outlines-to-all-elements&quot;&gt;Adding outlines to all elements&lt;/h3&gt;&lt;p&gt;By default, elements are &amp;quot;invisible&amp;quot;. They&amp;#x27;re there and take up space, but unless they have a background or border you won&amp;#x27;t see where they are. So when you make all of them visible, it becomes easier to find the one causing an overflow. A common solution for this it to add outlines to all elements by adding the following style to your CSS:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;outline&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px solid red&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;We&amp;#x27;re using &lt;code class=&quot;language-text&quot;&gt;outline&lt;/code&gt; here and not &lt;code class=&quot;language-text&quot;&gt;border&lt;/code&gt;, because outline does not affect the rest of the layout in a way that border does. Adding a border to all elements might &lt;em&gt;cause&lt;/em&gt; a horizontal overflow where there wasn&amp;#x27;t one before.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Of course, editing your CSS file every time you need to debug something is also not very time efficient. Instead you can paste the following line into your console to add an outline to all elements.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;*&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;el&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; el&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;outline &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;1px solid red&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To get rid of it you reload the page. Doing that also gets rid of any changes you made in the devtools to fix the overflow, so it&amp;#x27;s not ideal but it will work in any browser.&lt;/p&gt;&lt;h3 id=&quot;polypane-adding-outlines-with-a-shortcut&quot;&gt;Polypane: Adding outlines with a shortcut&lt;/h3&gt;&lt;p&gt;Polypane has this outline built-in under a handy shortcut:  &lt;kbd&gt;cmd/ctrl + d&lt;/kbd&gt;.&lt;/p&gt;&lt;p&gt;When activated Polypane draws boxes around all elements in all panes. It also uses a different color per element to keep them apart, something that would be a lot of work to do in your own CSS:&lt;/p&gt;&lt;img src=&quot;/blogs/detect-overflow/layoutdebug.png&quot; class=&quot;imgshadow&quot; alt=&quot;Polypane with layout debugging turned on&quot;/&gt;&lt;p&gt;While you can now clearly see which elements are overflowing the page, you still have to hunt down their 1px outlines to find them.&lt;/p&gt;&lt;h3 id=&quot;polypane-highlighting-overflowing-elements&quot;&gt;Polypane: Highlighting overflowing elements&lt;/h3&gt;&lt;p&gt;When Polypane detects a pane that has a horizontal scrollbar, it &lt;strong&gt;automatically highlights elements that cause the overflow&lt;/strong&gt;. See this video for an example.&lt;/p&gt;&lt;video src=&quot;/blogs/detect-overflow/overflow1.mp4&quot; autoplay=&quot;&quot; loop=&quot;&quot; controls=&quot;&quot; class=&quot;breakout&quot;&gt;&lt;/video&gt;&lt;p&gt;With this feature you won&amp;#x27;t have to hunt around for them any longer. All overflowing elements are visually highlighted so you don&amp;#x27;t have to spend time hunting them down any longer.&lt;/p&gt;&lt;p&gt;With the shared elements editor you quickly verify that the changes you made fix the overflow in all panes.&lt;/p&gt;&lt;h2 id=&quot;polypane-detecting-horizontal-overflows-automatically&quot;&gt;Polypane: Detecting horizontal overflows automatically&lt;/h2&gt;&lt;p&gt;In Polypane, any pane that has a horizonal overflow or contains a layout that uses &lt;code class=&quot;language-text&quot;&gt;100vw&lt;/code&gt; for the width is highlighted
with a &lt;a href=&quot;/docs/horizontal-overflow/&quot;&gt;horizontal overflow icon&lt;/a&gt; that tells you which issue it found.&lt;/p&gt;&lt;p&gt;Clicking the icon will help you detect the overflow causing elements by highlighting them in red, or show you which
layout element has &lt;code class=&quot;language-text&quot;&gt;100vw&lt;/code&gt; applied.&lt;/p&gt;&lt;p&gt;With Polypane, debugging horizontal layout issues goes from diving into the devtools to delete elements one by one to your
browser telling you there&amp;#x27;s an issue and giving you the solution by clicking a single button.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://dashboard.polypane.app/register?ref=detect-overflow-article&quot;&gt;Start a trial&lt;/a&gt; and try Polypane for yourself.&lt;/strong&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Beautiful CSS 3D Transform Examples]]></title><description><![CDATA[3D transforms and perspective can be a great trick to add depth and texture to any website but they're tricky to get right.
They can easily…]]></description><link>https://polypane.app/blog/beautiful-css-3-d-transform-examples/</link><guid isPermaLink="false">https://polypane.app/blog/beautiful-css-3-d-transform-examples/</guid><pubDate>Mon, 05 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;3D transforms and perspective can be a great trick to add depth and texture to any website but they&amp;#x27;re tricky to get right.
They can easily look skewed, too flat or distorted if you don&amp;#x27;t use a fitting &lt;code class=&quot;language-text&quot;&gt;perspective&lt;/code&gt; or go overboard on the angles.&lt;/p&gt;&lt;p&gt;Still, there are sites out there that make excellent use of 3D transforms to make their pages more vibrant and visually
interesting. For example, here&amp;#x27;s Modulz:&lt;/p&gt;&lt;h2 class=&quot;_Example-styles-module--exampleTitle--1a211&quot;&gt;3D Transform  &lt;small&gt;by &lt;a href=&quot;https://modulz.app/styleguide&quot;&gt;Modulz&lt;/a&gt;&lt;/small&gt;&lt;/h2&gt;&lt;div class=&quot;_Example-styles-module--tags--1St8o&quot;&gt;&lt;span&gt;shadow&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;_Example-styles-module--example--11erO&quot;&gt;&lt;div class=&quot;_Example-styles-module--container--2iVEU&quot;&gt;&lt;div class=&quot;_Example-styles-module--perspective--3Pdcd &quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;_Example-styles-module--container--2iVEU&quot;&gt;&lt;div class=&quot;_Example-styles-module--code--2ZGUU&quot;&gt;&lt;div class=&quot;gatsby-highlight&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code&gt;div {
  transform:
    perspective(75em)
    rotateX(18deg);
  box-shadow:
    rgba(22, 31, 39, 0.42) 0px 60px 123px -25px,
    rgba(19, 26, 32, 0.08) 0px 35px 75px -35px;
  border-radius: 10px;
  border: 1px solid;
  border-color:
    rgb(213, 220, 226)
    rgb(213, 220, 226)
    rgb(184, 194, 204);
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;_Copy-styles-module--buttonContainer--1mwWO&quot;&gt;&lt;button class=&quot;_Copy-styles-module--button--3ay31&quot; type=&quot;button&quot;&gt;Copy CSS&lt;/button&gt;&lt;div style=&quot;position:relative&quot;&gt;&lt;/div&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;_Copy-styles-module--button--3ay31&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;icon icon-tabler icon-tabler-brand-codepen&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; stroke-width=&quot;1.5&quot; fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M3 15l9 6l9 -6l-9 -6l-9 6&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M3 9l9 6l9 -6l-9 -6l-9 6&quot;&gt;&lt;/path&gt;&lt;line x1=&quot;3&quot; y1=&quot;9&quot; x2=&quot;3&quot; y2=&quot;15&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;21&quot; y1=&quot;9&quot; x2=&quot;21&quot; y2=&quot;15&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;12&quot; y1=&quot;3&quot; x2=&quot;12&quot; y2=&quot;9&quot;&gt;&lt;/line&gt;&lt;line x1=&quot;12&quot; y1=&quot;15&quot; x2=&quot;12&quot; y2=&quot;21&quot;&gt;&lt;/line&gt;&lt;/svg&gt;Codepen&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:center;font-size:20px&quot;&gt;&lt;p&gt;&lt;strong&gt; &lt;a href=&quot;/css-3d-transform-examples/&quot;&gt;Visit the full list&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;We&amp;#x27;ve been collecting these in a new resource: &lt;a href=&quot;/css-3d-transform-examples/&quot;&gt;Beautiful CSS 3D Transform examples&lt;/a&gt;. We&amp;#x27;ve taken
examples from Framer, MagicPattern, Polypane and other websites, simplified them and placed them side-by-side with their
CSS.&lt;/p&gt;&lt;p&gt;Each example comes with a Copy CSS button that lets you easily copy over the CSS that creates the 3D effect. These examples
are great startingpoints for you to create your own beautiful CSS 3D transforms and when you do,
&lt;a href=&quot;https://twitter.com&quot;&gt;reach out&lt;/a&gt; and we&amp;#x27;ll add them to the list!&lt;/p&gt;&lt;div style=&quot;text-align:center;font-size:20px&quot;&gt;&lt;p&gt;&lt;strong&gt; &lt;a href=&quot;/css-3d-transform-examples/&quot;&gt;Beautiful CSS 3D Transform examples&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Polypane 3.3: Grids and guides, horizontal overflow detection and updated UI]]></title><description><![CDATA[Add grids and guides to your site, detect which elements cause horizontal overflows, new overlays, a refreshed UI and
noticable performance…]]></description><link>https://polypane.app/blog/polypane-3-3-grids-and-guides-horizontal-overflow-detection-and-updated-ui/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-3-3-grids-and-guides-horizontal-overflow-detection-and-updated-ui/</guid><pubDate>Mon, 31 Aug 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Add grids and guides to your site, detect which elements cause horizontal overflows, new overlays, a refreshed UI and
noticable performance improvements. with over 50 changes there&amp;#x27;s quite a lot to find in the new Polypane 3.3!&lt;/p&gt;&lt;h2 id=&quot;grids-and-guides&quot;&gt;Grids and guides&lt;/h2&gt;&lt;p&gt;Polypane 3.3 comes with a new set of tools to make measuring, aligning elements and adhering to a grid system easy and quick.&lt;/p&gt;&lt;img alt=&quot;Various rulers in Polypane&quot; src=&quot;/blogs/polypane-3-3/rulers.png&quot; style=&quot;max-width:100%&quot;/&gt;&lt;p&gt;With rulers and guides it&amp;#x27;s easier than ever to make sure your elements are aligned. With the grid, columns and rows
feature you can make sure your website follows your grid system, matches the columns in a design and has the right vertical
rhythm.&lt;/p&gt;&lt;h2 id=&quot;horizontal-overflow-detection&quot;&gt;Horizontal overflow detection&lt;/h2&gt;&lt;p&gt;Going through the devtools deleting element one by one just to find which element is causing a horizontal overflow?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Polypane 3.3 radically improves the debugging experience for one of the most annoying front-end bugs there is.&lt;/strong&gt;&lt;/p&gt;&lt;div style=&quot;position:relative;width:100%;max-width:100%;padding-top:45.2%&quot;&gt;&lt;video src=&quot;/blogs/polypane-3-3/overflow.mp4&quot; autoplay=&quot;&quot; loop=&quot;&quot; controls=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;position:absolute;top:0px;left:0px;width:100%;max-width:100%;height:100%&quot;&gt;&lt;/video&gt;&lt;/div&gt;&lt;p&gt;Finding elements that cause a horizontal overflow is now as easy as turning debugging on in Polypane. Any element that
causes a horizontal scrollbar is automatically colored red.&lt;/p&gt;&lt;p&gt;As simple as that.&lt;/p&gt;&lt;p&gt;No more searching, scrolling or deleting
elements one-by-one in the devtools. Just check which elements are red and fixing those.&lt;/p&gt;&lt;h2 id=&quot;reachability-overlay&quot;&gt;Reachability overlay&lt;/h2&gt;&lt;p&gt;A small new overlay that we&amp;#x27;ve added is the reachability overlay. It shows how easy parts of the screen are to reach when
people hold a phone in their hand.&lt;/p&gt;&lt;img alt=&quot;Reachability overlay&quot; src=&quot;/doc-img/overlays/reachability.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;&lt;em&gt;As a lefty, I made sure there&amp;#x27;s also a left-handed version!&lt;/em&gt;&lt;/p&gt;&lt;h2 id=&quot;element-inspector-improvements&quot;&gt;Element inspector improvements&lt;/h2&gt;&lt;p&gt;Since introducing the Polypane element inspector in 3.1, it&amp;#x27;s steadily become more advanced and more capable. It&amp;#x27;s a
unified inspect element that inspects and edits elements in all panes at the same time. Whether it&amp;#x27;s styling, content or
attributes, there&amp;#x27;s no faster way to get info about your elements and edit them.&lt;/p&gt;&lt;p&gt;In 3.3 we&amp;#x27;re making it much easier to use.&lt;/p&gt;&lt;p&gt;With a dedicated button in the header getting element info is just a click away. You can also press the familiar &lt;code class=&quot;language-text&quot;&gt;shift + ctrl + c&lt;/code&gt;
shortcut or right-click on any element to inspect it in the panel.&lt;/p&gt;&lt;p&gt;When you&amp;#x27;re inspecting we&amp;#x27;ll show you a lot of interesting information in the tooltip. For example, Polypane displays the
rendered font (not just the font-stack in the CSS) so you know for sure which font is being rendered. It will also highlight
if an image has a missing alt attribute (among other attribute checks) and if an element has the right contrast. If that&amp;#x27;s all
you wanted to do, just press &lt;code class=&quot;language-text&quot;&gt;esc&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;When you&amp;#x27;ve found an element you want to inspect, click it to show all the details in the elements panel, from where you can
edit the text content, the styling and the attributes, as well as easily copy the complete style or quickly hide it.&lt;/p&gt;&lt;p&gt;It&amp;#x27;s still easy to get to the regular devtools as well, with the devtools button being still there, right-click also having
a &amp;quot;inspect element in devtools&amp;quot; option and the new shortcut &lt;code class=&quot;language-text&quot;&gt;shift + alt + c&lt;/code&gt; opening devtools in inspect mode.&lt;/p&gt;&lt;p&gt;But we suspect you&amp;#x27;ll prefer using the Polypane panel: It&amp;#x27;s faster, easier to use and edits all panes at the same time.&lt;/p&gt;&lt;h2 id=&quot;ui-updates&quot;&gt;UI updates&lt;/h2&gt;&lt;p&gt;This version of Polypane will look familiar, but we&amp;#x27;ve updated a lot of the UI to improve the rendering on
different types of screens (1x, retina 2x and also in-between screens like window&amp;#x27;s 1.25x) and make Polypane easier
to use and get started with.&lt;/p&gt;&lt;img alt=&quot;New Icons in Polypane header&quot; src=&quot;/blogs/polypane-3-3/ui.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;With this update, we also took the opportunity to give Polypane users some more information on what&amp;#x27;s happening:
Inactive buttons now have a clear X next to them, when the Live CSS feature is active we show a small indicator in the
addressbar, and while screenshots are generating a notification informs you of this.&lt;/p&gt;&lt;h3 id=&quot;liveauto-reloading-improvements&quot;&gt;Live/auto reloading improvements&lt;/h3&gt;&lt;p&gt;We now show notifications when you start or stop live or auto reloading, especially useful because Polypane will now
automatically restart live reloading when you switch to a tab that has it configured. One less thing you need to worry
about!&lt;/p&gt;&lt;h2 id=&quot;performance-improvements&quot;&gt;Performance improvements&lt;/h2&gt;&lt;p&gt;We took a good look at everything happening in Polypane and made some significant performance improvements, both in the
regular mode and in isolated pane mode. These will be most noticable when interacting with websites. Navigating between
pages is now much smoother and will happen &lt;strong&gt;near-instant across all panes.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;We also made performance improvements to our interaction synchronisation. We found some cases where Polypane did too
much work so we simplified those. This has led to faster and more consistent synchronisation of
clicks and scrolling across a wider variety of websites. Not bad!&lt;/p&gt;&lt;h2 id=&quot;getting-polypane-33&quot;&gt;Getting Polypane 3.3&lt;/h2&gt;&lt;p&gt;Polypane will automatically update on Mac and Windows. Linux users need to download the new version from
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; and if you&amp;#x27;re on Mac and Windows but don&amp;#x27;t want to wait on the update popup, you can find
your download there as well.&lt;/p&gt;&lt;p&gt;If you don&amp;#x27;t have Polypane yet there is a free 14 day trial available. &lt;a href=&quot;https://dashboard.polypane.app/register&quot;&gt;Get it here&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;full-changelog&quot;&gt;Full changelog&lt;/h2&gt;&lt;p&gt;We managed to pack quite the long list of features and improvements into this release, check out the full changelog below. All new features are fully documented in our &lt;a href=&quot;/docs/&quot;&gt;docs&lt;/a&gt; too.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Rulers, guides, grid, column and row overlays for panes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Layout debugging overlay highlights elements that cause horizontal overflows.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Reachability overlay to see how easy parts of the screen are to reach.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Inspect element in the element panel is now available in the header and context menus, as well as the inspect element shortcut.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Updated icons, font and design, speed of UI.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Visible scrollbars in workspace for easier navigation.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Updated user agent for better compatibility.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Indicator in address bar when Live CSS is active.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Live and autoreloading automatically pause and restart when switching tabs.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Outline panel highlights and scroll to elements when hovered, and opens them in elements panel when clicked.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Faster and more precise interaction syncing.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Panes load new URLs faster and without visible refresh when navigating inside panes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Show notification when live/auto reloading starts and stops.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Element panel can now increase any number in any value using arrow keys and modifier keys.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Element tooltip shows additional attributes (like &lt;code class=&quot;language-text&quot;&gt;role&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;alt&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;name&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;for&lt;/code&gt;) and highlight if they&amp;#x27;re required but missing.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Element tooltip now has a dark mode.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Elements panel supports custom CSS properties with multiple fallback values.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Address bar no longer automatically removes www. from domains.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Isolated panes are now more performant when loading and reloading.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Better support for CSS breakpoint detection in lazy loaded CSS.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Order of color blindness overlays is now consistent.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Active panes now have a blue topbar rather than a blue shadow.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Placeholdifier no longer uses external resources.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Pressing esc now clears focus from inside panes, closes all popovers and clears element selector.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Show notification while screenshot is being generated.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; You can now turn on isolated panes directly from the devtools extension manager.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Update list of available Google Fonts.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; New pane is no longer 100% high.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Restore scroll position in workspace when panes trigger a scroll event.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Bootstrap workspace updated to Bootstrap v5.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Update accessibility panel with latest version of Axe.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Global zoom now supports zooming out to 10%.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Updated Google SERP rendering.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Color contrast is now precise up to three digits everywhere it&amp;#x27;s used.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Color contrast overlay shows new ratio when showing preview of new color.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Active overlay is now listed in the Overlay tooltip.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Prevent overlays from crashing browser in certain situations.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Filters are now viewport aware.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Fix issue in color contrast overlay where new color with insufficient contrast was suggested.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Viewport aware toggle in device selector no longer clears the device selector.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Dark mode UI issue in Elements panel.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Full overview screenshot no longer shows blank page in certain situations.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Maximum height for panes in focus mode is now correct.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Trial end reminder is now consistently shown during last week of trial.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Console error indicator is now cleared after page load in isolated panes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Outline panel now escapes any HTML strings in headers.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Cookie date field no longer hides delete button when panel is narrow.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Cr24/CRX3 support for devtools extensions (react devtools was affected).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Ctrl + scroll to zoom in and out now works again.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Toggling touch events in isolated panes no longer prevents hover effects in the rest of the browser.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Panes resized to device now consistently get the orientation indicated.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Zoom to fit shortcut takes panel into account.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Pane header now animates along with rest of pane during resizing.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;polypane-331&quot;&gt;Polypane 3.3.1&lt;/h2&gt;&lt;p&gt;This is a bugfix release but it does contain some fun updates and features. Primarily, Polypane now has a view source panel, where you can quickly check the (live) source code of a site. This update also implements support for sites with hash based (#) routing.&lt;/p&gt;&lt;h3 id=&quot;full-changelog-1&quot;&gt;Full changelog:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; HTML Source panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Hash based routing support&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Live CSS now supports all Google Variable font axes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Cookies are now handled better in normal mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; New shortcut &lt;code class=&quot;language-text&quot;&gt;cmd/ctrl alt i&lt;/code&gt; to open devtools&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Google SERP layout updates&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Overview screenshots now hides the pane icon bar&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Update Google Fonts list&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; All popovers (like devtools extensions or live reload settings) now also close on &lt;code class=&quot;language-text&quot;&gt;esc&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; The elements panel now highlights css properties instead of the values&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Scroll-behaviour is disabled in screenshots and when syncing scroll between panes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Polypane now parses CSS from other origins again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Click syncing now works better for checkboxes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Added &amp;quot;Start over&amp;quot; button during license request flow&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Elements panel is no longer opened on page load in Isolate pane mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Breakpoint names are no longer hidden in dropdown&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; issue where you couldn&amp;#x27;t click on the address bar in some places&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent live reloading from opening to many listeners&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Clear live reloading listeners on tab change more persistently&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent reload loop in isolated panes on Windows&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;polypane-332&quot;&gt;Polypane 3.3.2&lt;/h2&gt;&lt;p&gt;Bugfix release.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Add support for more CSS functions like blur() and saturate() in the Elements panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Now shows &amp;quot;untitled document&amp;quot; when title element is missing&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Updated minimum dimensions of Polypane&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent duplicating site CSS&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent issue where Polypane showed print CSS&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Alignment issue for copy CSS rule button&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Loading indicator now stopf when title element is missing&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[How Earnworthy uses Polypane to audit landing pages and land 25% more customers]]></title><description><![CDATA[We interviewed Nicholas Scalice, the founder of  Earnworthy  and creator of the  GrowthMarketer.co  newsletter about how he uses Polypane to…]]></description><link>https://polypane.app/blog/how-earnworthy-uses-polypane-to-audit-landing-pages-and-land-25-more-customers/</link><guid isPermaLink="false">https://polypane.app/blog/how-earnworthy-uses-polypane-to-audit-landing-pages-and-land-25-more-customers/</guid><pubDate>Mon, 17 Aug 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;We interviewed Nicholas Scalice, the founder of &lt;a href=&quot;https://earnworthy.com&quot;&gt;Earnworthy&lt;/a&gt; and creator of the &lt;a href=&quot;https://vrlps.co/FZZy2oK/cp&quot;&gt;GrowthMarketer.co&lt;/a&gt; newsletter about how he uses Polypane to be able to provide quick landing page consultations while focusing on both desktop and mobile.&lt;/em&gt;&lt;/p&gt;&lt;h3 id=&quot;can-you-introduce-us-to-earnworthy&quot;&gt;Can you introduce us to Earnworthy?&lt;/h3&gt;&lt;img alt=&quot;Photo of Nicholas&quot; src=&quot;/blogs/earnworthy/nicholas.png&quot; style=&quot;max-width:20rem;width:33%;float:left;margin-right:2rem;margin-bottom:4rem&quot;/&gt;&lt;p&gt;&lt;a href=&quot;https://earnworthy.com&quot;&gt;Earnworthy&lt;/a&gt; is a growth marketing consultancy that I founded in 2015. We&amp;#x27;re a small but mighty team of 5, and while we are technically based in Boca Raton, Florida, our work structure is fully remote. We specialize in one thing: Helping brands convert more of their website visitors into leads and customers using high-converting landing pages.&lt;/p&gt;&lt;h3 id=&quot;one-of-your-services-is-a-landing-page-audit-what-does-that-process-look-like&quot;&gt;One of your services is a landing page audit. What does that process look like?&lt;/h3&gt;&lt;p&gt;We do two types of landing page audits. First is a short, free audit that is used as a sales magnet. It has been a tremendous source of new business for us. The way it works is that people see our ads, or visit our site and request to have their landing page reviewed. I then create a 5-10 minute screen share video pointing out a few things I would recommend they do to improve conversions. I record using a tool called Loom, and I pull up the sites in Polypane so that everyone can see the mobile and desktop versions side-by-side.&lt;/p&gt;&lt;p&gt;The other type of landing page audit we do is a paid offering. It&amp;#x27;s a similar process, but there are more steps involved, such as a speed test, reading level test, and sometimes a five second test. We use Polypane for this audit as well of course!&lt;/p&gt;&lt;h3 id=&quot;what-were-you-looking-to-improve-in-your-workflow-that-made-you-search-out-a-tool-like-polypane&quot;&gt;What were you looking to improve in your workflow that made you search out a tool like Polypane?&lt;/h3&gt;&lt;p&gt;The biggest challenge when doing landing page audits is that these days, landing page traffic is primarily mobile traffic, yet, we review pages on our desktops and laptops. I needed a way to review the mobile layout as well. And while I could always pull the page up on my mobile device, this wasn&amp;#x27;t easy to record and share.&lt;/p&gt;&lt;p&gt;Polypane changed all that. It allows me to view both the mobile and desktop versions of a site side-by-side, and they sync as we scroll. I&amp;#x27;m aware that this is like only 1% of the power of Polypane, but for me, it&amp;#x27;s a game-changer.&lt;/p&gt;&lt;h3 id=&quot;how-did-you-find-out-about-polypane-what-other-productmethods-did-you-consider&quot;&gt;How did you find out about Polypane? What other product/methods did you consider?&lt;/h3&gt;&lt;p&gt;I was searching for browsers that had more advanced features than regular Google Chrome and Polypane came up.&lt;/p&gt;&lt;p&gt;Another method I had considered was using a Mac app called Reflector to mirror my actual iPhone screen to my desktop and then record the screen from there, while also keeping a desktop browser open. &lt;strong&gt;Yeah, it&amp;#x27;s as complicated as it sounds. It hurt to even write that.&lt;/strong&gt;&lt;/p&gt;&lt;h3 id=&quot;how-do-you-use-polypane-during-your-landing-page-audit&quot;&gt;How do you use Polypane during your landing page audit?&lt;/h3&gt;&lt;p&gt;It&amp;#x27;s simple. I open Polypane, pull up the site to be audited, and record my screen using Loom. I don&amp;#x27;t have to worry about switching devices, as I can see the desktop and mobile versions of a landing page side-by-side that way.&lt;/p&gt;&lt;div style=&quot;position:relative;padding-bottom:53.41246290801187%;height:0;border-radius:4px;overflow:hidden;box-shadow:rgba(20, 40, 50, 0.05) 0px 4px 4px, rgba(20, 40, 50, 0.05) 0px 1px 10px, rgba(20, 40, 50, 0.08) 0px 20px 30px&quot;&gt;&lt;iframe src=&quot;https://www.loom.com/embed/bc66deb478cf4153a64a06a1935d2677&quot; frameBorder=&quot;0&quot; allowfullscreen=&quot;&quot; style=&quot;position:absolute;top:0;left:0;width:100%;height:100%&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Nicholas has more landing page audits you can watch on the &lt;a href=&quot;https://www.youtube.com/channel/UCsUvL-W3vrnAGmAOUh3LM0w&quot;&gt;GrowthMarketer YouTube channel&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;h3 id=&quot;what-results-did-you-see-in-your-audit-after-you-started-using-polypane&quot;&gt;What results did you see in your audit after you started using Polypane?&lt;/h3&gt;&lt;p&gt;The most surprising thing was how many people asked me what browser I was using. People are always curious about tools, but in this case, it generated quite some buzz in the early days, when nobody knew about Polypane.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;As for quantifiable results, &lt;strong&gt;our closing rate from prospects to clients has gone up around 25% after we started using Polypane&lt;/strong&gt; for the initial free audit.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;I attribute this to the fact that people see more value in the audit video, since we’re able to focus on both mobile and desktop.&lt;/p&gt;&lt;img alt=&quot;Polypane showing Earnworthy&amp;#x27;s Unbounce editor and preview&quot; src=&quot;/blogs/earnworthy/sidebrowser.jpg&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;&lt;em&gt;Earnworthy develops web pages using the Unbounce editor in the &lt;a href=&quot;/docs/browse/&quot;&gt;side browser&lt;/a&gt; and previews them on multiple sizes.&lt;/em&gt;&lt;/p&gt;&lt;h3 id=&quot;whats-next-for-earnworthy-where-can-we-learn-more&quot;&gt;What&amp;#x27;s next for Earnworthy, where can we learn more?&lt;/h3&gt;&lt;p&gt;Apart from the landing page optimization business, I recently launched a free marketing newsletter where I share cool tips and tools like Polypane once per week. Check it out at &lt;a href=&quot;https://vrlps.co/FZZy2oK/cp&quot;&gt;GrowthMarketer.co&lt;/a&gt; and subscribe!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane ❤ Tumult Hype. New integration]]></title><description><![CDATA[Tumult Hype  lets you create beautiful, responsive HTML5 animations and web content. When you preview your design by clicking the 'preview…]]></description><link>https://polypane.app/blog/polypane-❤-tumult-hype-new-integration/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-❤-tumult-hype-new-integration/</guid><pubDate>Mon, 27 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://tumult.com/hype/&quot;&gt;Tumult Hype&lt;/a&gt; lets you create beautiful, responsive HTML5 animations and web content.&lt;/p&gt;&lt;p&gt;When you preview your design by clicking the &amp;#x27;preview&amp;#x27; button in Hype and selecting Polypane, it will automatically open the viewports you&amp;#x27;ve specified in Hype so you get
the full overview with just a single click. If you click the preview button again Polypane focuses and reloads your existing tab, even if you&amp;#x27;ve made changes to that
tab. This is the ideal way to test your Tumult Hype creations on multiple screen sizes.&lt;/p&gt;&lt;p&gt;Check out the video for a quick walkthrough:&lt;/p&gt;&lt;div style=&quot;position:relative;width:100%;padding-top:56.25%&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/rJ3ON_oSL_g?&amp;amp;autoplay=false&amp;amp;start=0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; style=&quot;position:absolute;top:0px;left:0px;width:100%;height:100%&quot; frameBorder=&quot;0&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;https://tumult.com/hype/&quot;&gt;Tumult Hype&lt;/a&gt; is available on macOS from &lt;a href=&quot;https://tumult.com&quot;&gt;tumult.com&lt;/a&gt; and the Mac App Store.&lt;/p&gt;&lt;p&gt;&lt;em&gt;If you&amp;#x27;re interested in integrating your own tool with Polypane like this, &lt;a href=&quot;/support/&quot;&gt;contact us&lt;/a&gt;!&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How Code& increased their efficiency by 500% maintaining and improving websites like Freshwater SLSC]]></title><description><![CDATA[We interviewed Dale Grant, the owner of  Code&  on their workflow and how Polypane fits into it. As a development-focused agency they use…]]></description><link>https://polypane.app/blog/how-code-increased-their-efficiency-by-500-maintaining-and-improving-websites-like-freshwater-slsc/</link><guid isPermaLink="false">https://polypane.app/blog/how-code-increased-their-efficiency-by-500-maintaining-and-improving-websites-like-freshwater-slsc/</guid><pubDate>Wed, 22 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;We interviewed Dale Grant, the owner of &lt;a href=&quot;https://codeand.com.au&quot;&gt;Code&amp;amp;&lt;/a&gt; on their workflow and how Polypane fits into it. As a development-focused agency they use WordPress for a wide variety of clients and projects.&lt;/em&gt;&lt;/p&gt;&lt;h3 id=&quot;can-you-introduce-us-to-code&quot;&gt;Can you introduce us to Code&amp;amp;?&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://codeand.com.au&quot;&gt;Code&amp;amp;&lt;/a&gt; is a web development agency from Sydney, Australia. We started in 2012 (under a different name in the UK, have since relocated to Sydney) and there’s currently five of us. There&amp;#x27;s Rich, senior developer, who lives in the UK, which is great because we can pass work back and forth between different time zones. It means we have almost a full 24 hour day between us. He&amp;#x27;s been with us for seven years now. Then over here in Sydney we have Marshall who&amp;#x27;s a junior developer and Lauren oversees our admin. Sarah is our copywriter, currently on maternity leave and then there&amp;#x27;s myself, Dale. My skill set is in development and I handle client relations as well.&lt;/p&gt;&lt;p&gt;We focus primarily on development and as you&amp;#x27;ll note we have no designers on our team. We don&amp;#x27;t do a lot of design work and focus on what we do best: development. We have a handful of talented &amp;amp; trusted designers we work with when the project calls for it.&lt;/p&gt;&lt;p&gt;Despite an oversaturated market we haven&amp;#x27;t had to spend a cent on advertising since we began and yet we&amp;#x27;re busy. We’ve found the best form of marketing is referrals, and to get those you have to be good at what you do, focus on the right projects and above all else, be honest and transparent with your clients not only when celebrating the wins, but also when fixing the issues.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/blogs/codeand/img.png&quot;/&gt;&lt;/p&gt;&lt;h3 id=&quot;what-does-your-current-workflow-look-like&quot;&gt;What does your current workflow look like?&lt;/h3&gt;&lt;p&gt;We have a set structure that we follow for every new client that comes in for a project. We have a lucky 13 step process from start to finish and each of those ones have their own subtasks.&lt;/p&gt;&lt;p&gt;We first set everything up in our internal tools, like Asana (our task manager of choice) and we add our clients into our own Slack. Each client gets their own channel that they participate in and that&amp;#x27;s where we do all communication. Everything in full view of the client, which has been very, very good for projects.&lt;/p&gt;&lt;img alt=&quot;&quot; src=&quot;/blogs/codeand/uluhye.png&quot; class=&quot;imgshadow&quot; style=&quot;float:left;max-width:20rem;width:33%;margin-right:2rem;margin-bottom:4rem;border-radius:5px&quot;/&gt;&lt;p&gt;Side note: It&amp;#x27;s difficult to get to grips with having all communication in front of the client the first time something goes wrong, because you have to declare that something has gone wrong in full view of the client. But in doing so we&amp;#x27;ve realized that by acknowledging that we know about the problem, the client now knows what we know and they don&amp;#x27;t have to report it. Even if it&amp;#x27;s our mistake, we&amp;#x27;re all human and our clients like to see that it&amp;#x27;s taken care of and that something is being done.&lt;/p&gt;&lt;p&gt;Then we have steps around collecting and developing content, which usually goes side by side with design. Our copywriter will work with the designer that we&amp;#x27;re working with to fine tune the content areas to make sure they fit the needed content, for example we might need a full page of this type of content and this section will have a video et cetera.&lt;/p&gt;&lt;p&gt;In terms of development, there&amp;#x27;s a lot of tasks to check off before you even get stuck into the building, like setting up the environment. We work primarily with WordPress and need to make sure the settings are correct as we get started so when it&amp;#x27;s pushed to production, everything works as expected.&lt;/p&gt;&lt;p&gt;The actual development will vary project to project and we have a few tasks for our testing. I&amp;#x27;m guessing this is fairly standard, but we have a round of internal site testing and if there&amp;#x27;s budget also some user testing, before we give it to the client to say &amp;quot;yep, we&amp;#x27;re done&amp;quot;. Then we give them two rounds to find anything we missed or anything that needs to be tweaked like last-minute content changes. Then we hand it over and give them a couple of weeks of bug fixing.&lt;/p&gt;&lt;p&gt;When we do user testing we prefer to do that with real customers that we can put in front of the product but if not we source people who we think match the criteria.&lt;/p&gt;&lt;h3 id=&quot;what-made-you-choose-wordpress-as-the-primary-platform-for-development&quot;&gt;What made you choose WordPress as the primary platform for development?&lt;/h3&gt;&lt;p&gt;For us it can do anything we need, there&amp;#x27;s not a site so far that I&amp;#x27;ve come across that we haven&amp;#x27;t been able to do within WordPress. Obviously you can do the very basic ones, like our own for example. Ours was needed in a short time frame, we based it off a theme and it’ll do the job until we find time to improve.&lt;/p&gt;&lt;p&gt;But we’ve also built, for example, a web app within WordPress for the mining industry here in Australia where people can track their certification. You have to be certified in a lot of different areas depending on your role and you have to gain a number of points within five years, but some of the certificates are only valid for two and there&amp;#x27;s different variables to it. It&amp;#x27;s very difficult to keep track off if you&amp;#x27;re not on top of it. So we built a platform for people to track their certification in.&lt;/p&gt;&lt;p&gt;We&amp;#x27;ve also done a couple of currency exchange platforms which is like reverse engineering WooCommerce. Instead of paying money and getting a product you think of money as the product so they send money in and get money back out.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;We just haven&amp;#x27;t found anything so far you couldn&amp;#x27;t do in WordPress.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;In terms of development environment we use &lt;a href=&quot;https://roots.io/trellis/&quot;&gt;Trellis&lt;/a&gt; by Roots to set up all of our environments. We also use it to provision staging and production servers. Roots has modified the structure of WordPress in their project called &lt;a href=&quot;https://roots.io/bedrock/&quot;&gt;Bedrock&lt;/a&gt; which we use for every single one of our sites. If we have a budget available for a custom build rather than a theme build we&amp;#x27;ll use their starter theme called &lt;a href=&quot;https://roots.io/sage/&quot;&gt;Sage&lt;/a&gt; - all of these bring WordPress more inline with more modern development practices.&lt;/p&gt;&lt;h3 id=&quot;what-were-you-looking-to-improve-in-your-workflow-that-made-you-search-out-a-tool-like-polypane&quot;&gt;What were you looking to improve in your workflow that made you search out a tool like Polypane?&lt;/h3&gt;&lt;p&gt;Testing, either at the end of a project, during the build or even for ongoing quality assurance. Any time we&amp;#x27;re doing maintenance we test any work that we&amp;#x27;ve done. It takes more time than people realise and you get bogged down in development because you&amp;#x27;re testing in so many different devices and screen sizes, so many different combinations of everything that it takes a lot of time to go through. And if you change something well then you just got to go and check it all again.&lt;/p&gt;&lt;img alt=&quot;&quot; src=&quot;/blogs/codeand/breakdown.png&quot; class=&quot;imgshadow&quot; style=&quot;float:right;max-width:20rem;width:33%;margin-left:2rem;margin-bottom:2rem;border-radius:5px&quot;/&gt;&lt;p&gt;I came across Polypane - I wouldn&amp;#x27;t even like to admit how long ago but it took me a very, very long time before I took the plunge and gave it a go. I think that&amp;#x27;s a little bit out of fear of changing your processes and using new tools but it got to the point where it was just like &amp;#x27;this is ridiculous&amp;#x27;. I&amp;#x27;m spending so much time checking the work my developers are doing and my developers are also spending all this time themselves.&lt;/p&gt;&lt;p&gt;The second thing was realising how many hours per day are we spending just checking and thinking there was an easier way of doing this. Primarily my desire to save time came from the Quality Assurance side of things rather than project work because it&amp;#x27;s something that&amp;#x27;s repeatable. We do that every month for somewhere between 30 and 40 clients and we needed to cut down that time so we had more time left over to do things that actually improve their site.&lt;/p&gt;&lt;p&gt;Testing is the least fun part - we’re creators, we live to create not to test! - and it&amp;#x27;s also the part that the customers never really want you to do. They do when things break but they don&amp;#x27;t really want to be spending money on you checking things. If that took less time, instead of checking screens we could look at doing something to progress our client’s sites, like conversion optimization or accessibility.&lt;/p&gt;&lt;h3 id=&quot;what-other-ways-did-you-consider-to-solve-this&quot;&gt;What other ways did you consider to solve this?&lt;/h3&gt;&lt;p&gt;We&amp;#x27;ve tried a few things over the years, like an app that would mirror to your iPad as a second screen and we would use that to check how a site would look on that particular screen. That kind of helped, and obviously the responsive mode in browsers or just the old-fashioned method of resizing your browser but both of those take time. I hadn&amp;#x27;t really come across anything else like Polypane and how it solves this issue.&lt;/p&gt;&lt;h3 id=&quot;how-was-it-for-the-team-to-get-started-with-polypane-and-how-do-they-use-it&quot;&gt;How was it for the team to get started with Polypane and how do they use it?&lt;/h3&gt;&lt;p&gt;With us, Rich started using it first and said that it was awesome, so I got it for the team so we can all use it. It&amp;#x27;s been really good. The issue that first got me in touch with you, being able to share workspaces with other team members, that feature has been super useful. Rather than write a list and say “we need to check these sizes” and hope people set it up correctly, don’t miss a size or add one wrong etc, with the shared workspace there&amp;#x27;s none of that and it&amp;#x27;s fantastic, we love that.&lt;/p&gt;&lt;p&gt;We use Polypane to do quality assurance checks on our staging server; it’s a huge time saver and we found it quicker than running it alongside Vagrant locally.&lt;/p&gt;&lt;h3 id=&quot;what-results-did-you-see-with-maintaining-and-checking-websites-using-in-polypane&quot;&gt;What results did you see with maintaining and checking websites using in Polypane?&lt;/h3&gt;&lt;p&gt;I asked the team to do a rundown comparing our old way of checking sites with the new way using Polypane.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;We checked three sites with our old method of resizing the browser and using the developer tools and each of them was around 30 minutes. &lt;strong&gt;With Polypane, we did the same work on the same sites in 6 minutes.&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;That&amp;#x27;s a massive time saving! In my reaction to that I definitely used a celebratory F word. We&amp;#x27;re very happy with that because it just means that the team can use that time doing more important and more interesting things.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/blogs/codeand/freshwater.svg&quot; alt=&quot;Freshwater SLC logo&quot;/&gt;&lt;/p&gt;&lt;h3 id=&quot;one-of-the-websites-youve-been-doing-this-with-is-the-freshwater-surf-life-saving-club-can-you-tell-us-about-them-and-their-website&quot;&gt;One of the websites you&amp;#x27;ve been doing this with is the Freshwater Surf Life Saving Club. Can you tell us about them and their website?&lt;/h3&gt;&lt;p&gt;Surf clubs are a big part of the community here due to Australian beach culture. Freshwater SLSC for example is over 100 years old, and some other clubs are even older.&lt;/p&gt;&lt;img src=&quot;/blogs/codeand/code-and-freshwater-slsc.jpg&quot; class=&quot;imgshadow&quot; style=&quot;float:left;max-width:20rem;width:33%;margin-right:2rem;margin-bottom:2rem;border-radius:5px&quot;/&gt;&lt;p&gt;The surf clubs started out primarily as surf life savers, so people who patrol the beach and rescue swimmers if they got into trouble. Nowadays a lot of people join these clubs to make friends and compete in various different sports.&lt;/p&gt;&lt;p&gt;They obviously spend their time patrolling on the weekend to make sure people don&amp;#x27;t drown or don&amp;#x27;t get swept off in a riptide, but it&amp;#x27;s also an integral part of the community.&lt;/p&gt;&lt;p&gt;Their potential audience ranges from preteens with something called &amp;#x27;nippers&amp;#x27;, which teaches kids how to swim in the sea and about the dangers of the sea like riptides and marine creatures. Then on the other end there&amp;#x27;s 70/80+ year olds who have been part of the club for decades and just want to know what the next event is and of course every age in between.&lt;/p&gt;&lt;h3 id=&quot;what-are-the-challenges-when-building-websites-with-such-a-broad-audience&quot;&gt;What are the challenges when building websites with such a broad audience?&lt;/h3&gt;&lt;p&gt;Making a website to cater to all these groups was a pretty big challenge to try and tackle. We had a lot of input from the executive committee of the club and their primary focus was communication. We need to make sure that we are communicating everything we need to every possible member that could be part of the club, whether that&amp;#x27;s young or old and whether they&amp;#x27;re interested in surf sports, patrols or nippers for their kids.&lt;/p&gt;&lt;p&gt;We had a lot of input from different people all with different goals so we had to juggle how all the different parts of Freshwater were presented. We couldn&amp;#x27;t just place everything on the homepage even if everyone wanted their section to be on the homepage. One big concern was how we could make sure the older generation could also read things well. So we&amp;#x27;ve got nice big bold text in various places and tested this with some of the older members.&lt;/p&gt;&lt;img alt=&quot;&quot; src=&quot;/blogs/codeand/mgs.physio.png&quot; class=&quot;imgshadow&quot; style=&quot;float:right;max-width:20rem;width:33%;margin-left:2rem;margin-bottom:2rem;border-radius:5px&quot;/&gt;&lt;p&gt;Nowadays, we work a lot with the client to make sure the website stays in good shape. When clients have access to their website, they&amp;#x27;re going to do things like add content where it&amp;#x27;s not supposed to go or add five paragraphs instead of one so we like to help them as much as possible.&lt;/p&gt;&lt;p&gt;This is where Polypane helps because you can show clients how the site works on different screen sizes, for different audiences and verify they can understand and read it well.&lt;/p&gt;&lt;p&gt;The &lt;a href=&quot;/docs/accessibility-panel/&quot;&gt;new accessibility panel&lt;/a&gt; will help us improve the accessibility of the website as we keep maintaining it. We have a few issues right now but with a homepage that long I&amp;#x27;m not unhappy with the current state. I&amp;#x27;ve heard rumours of a surprise within Polypane when that panel finds no issues, so discovering that is next on our list!&lt;/p&gt;&lt;p&gt;With a lot of our clients we have a retainer agreement to maintain the website going forward and to keep it excellent. That usually comes with a few hours each month where we either do something they requested or if we find something that is broken or could be made better. There&amp;#x27;s always things you can do so we have a little list for Freshwater. &lt;strong&gt;Thanks to Polypane we now have additional time to make the website work even better.&lt;/strong&gt;&lt;/p&gt;&lt;h3 id=&quot;whats-next-for-code&quot;&gt;What&amp;#x27;s next for Code&amp;amp;?&lt;/h3&gt;&lt;p&gt;We’d like to focus more on accessibility, which greatly enhances the web for people with disabilities. Unfortunately, current processes mean this usually gets thrown in the “nice to have” pile, which as we all know gets cut when budget becomes tight. Finding a way to ensure this is included as a standard practise in all our projects is something we’ll be working on going forward.&lt;/p&gt;&lt;p&gt;We’d also like to build on our long term relationships with our clients. Some of our clients have sites that are approaching 10 years old, which may seem ancient in web years but with regular updates and progressive improvements, they’re still going strong. Recently we’ve been compiling our knowledge of solutions to common pain points in areas like conversion optimisation, customer experience and SEO. We’ve also been looking at how site owners, in particular ecommerce store owners use (or why they don’t use) their admin panels. This will not only serve as the starting for future projects, but also help our existing customers improve their existing sites with new tools, new data and new ways to engage their customers without needing a completely new site.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;If we can make more things possible in less time for more people, we’re happy!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Thank you Dale! Be sure to check out &lt;a href=&quot;https://codeand.com.au&quot;&gt;Code&amp;amp;&lt;/a&gt; if you&amp;#x27;re looking for a WordPress development agency that involves you in the process from day one, cares about accessibility and creates amazing websites and web apps.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CSS breakpoints used by popular CSS frameworks]]></title><description><![CDATA[When using a CSS framework it often doesn't matter what devices people use. These frameworks come with their own set of
CSS breakpoints with…]]></description><link>https://polypane.app/blog/css-breakpoints-used-by-popular-css-frameworks/</link><guid isPermaLink="false">https://polypane.app/blog/css-breakpoints-used-by-popular-css-frameworks/</guid><pubDate>Wed, 15 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When using a CSS framework it often doesn&amp;#x27;t matter what devices people use. These frameworks come with their own set of
CSS breakpoints with components that work well with those breakpoints.&lt;/p&gt;&lt;p&gt;Instead of configuring Polypane to show devices, you can configure it to show the breakpoints supported by the frameworks.&lt;/p&gt;&lt;p&gt;Polypane comes with &lt;a href=&quot;/docs/workspaces/&quot;&gt;workspace presets&lt;/a&gt; for &lt;a href=&quot;#bootstrap-v5&quot;&gt;Bootstrap v5&lt;/a&gt;, &lt;a href=&quot;#materialize&quot;&gt;Materialize&lt;/a&gt;, &lt;a href=&quot;#bulma&quot;&gt;Bulma&lt;/a&gt; and &lt;a href=&quot;#tailwind-css&quot;&gt;Tailwind CSS&lt;/a&gt;.
Adding other ones is as easy as downloading and importing a workspace file.&lt;/p&gt;&lt;h2 id=&quot;breakpoints-for-each-css-framework&quot;&gt;Breakpoints for each CSS Framework&lt;/h2&gt;&lt;p&gt;If you&amp;#x27;re using Polypane, You can create panes from the exact breakpoints and get the complete overview in a single browser,
&lt;strong&gt;something that no other browser can do.&lt;/strong&gt; Which breakpoints are used by each CSS framework? Find the lists below.&lt;/p&gt;&lt;div class=&quot;css-frameworks-blog&quot;&gt;&lt;h3 id=&quot;bootstrap-v5&quot;&gt;&lt;img src=&quot;/blogs/css-frameworks/bootstrap-v5.svg&quot;/&gt; Bootstrap v5&lt;/h3&gt;&lt;div class=&quot;WorkspacePreview-styles-module--workspaceWrapper--2oxQo&quot;&gt;&lt;div class=&quot;WorkspacePreview-styles-module--buttonContainer--qE3bQ&quot;&gt;&lt;a class=&quot;WorkspacePreview-styles-module--open--1iMji&quot; href=&quot;polypane://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A320%2C%22title%22%3A%22--%22%7D%2C%7B%22width%22%3A576%2C%22title%22%3A%22sm%22%7D%2C%7B%22width%22%3A768%2C%22title%22%3A%22md%22%7D%2C%7B%22width%22%3A992%2C%22title%22%3A%22lg%22%7D%2C%7B%22width%22%3A1200%2C%22title%22%3A%22xl%22%7D%2C%7B%22width%22%3A1400%2C%22title%22%3A%22xxl%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;i&gt;Built into Polypane&lt;/i&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreview-styles-module--panelist--1A3mi panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:40px;height:100%&quot;&gt;--&lt;i&gt; &lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:72px;height:100%&quot;&gt;sm&lt;i&gt;576px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:96px;height:100%&quot;&gt;md&lt;i&gt;768px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:124px;height:100%&quot;&gt;lg&lt;i&gt;992px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:150px;height:100%&quot;&gt;xl&lt;i&gt;1200px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:175px;height:100%&quot;&gt;xxl&lt;i&gt;1400px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;centered&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Description&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;Minimum width&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;--&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;X-Small&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;em&gt;none&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;sm&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Small&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;576px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;md&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Medium&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;768px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;lg&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Large&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;992px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;xl&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Extra large&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1200px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;xxl&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Extra extra large&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1400px&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Find more information in the &lt;a href=&quot;https://v5.getbootstrap.com/docs/5.0/layout/breakpoints/&quot;&gt;Bootstrap v5 documentation&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 id=&quot;bulma&quot;&gt;&lt;img src=&quot;/blogs/css-frameworks/bulma.svg&quot;/&gt; Bulma&lt;/h3&gt;&lt;div class=&quot;WorkspacePreview-styles-module--workspaceWrapper--2oxQo&quot;&gt;&lt;div class=&quot;WorkspacePreview-styles-module--buttonContainer--qE3bQ&quot;&gt;&lt;a class=&quot;WorkspacePreview-styles-module--open--1iMji&quot; href=&quot;polypane://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A414%2C%22title%22%3A%22mobile%22%7D%2C%7B%22width%22%3A769%2C%22title%22%3A%22tablet%22%7D%2C%7B%22width%22%3A1024%2C%22title%22%3A%22desktop%22%7D%2C%7B%22width%22%3A1216%2C%22title%22%3A%22widescreen%22%7D%2C%7B%22width%22%3A1408%2C%22title%22%3A%22fullhd%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;i&gt;Built into Polypane&lt;/i&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreview-styles-module--panelist--1A3mi panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:51.75px;height:100%&quot;&gt;mobile&lt;i&gt; &lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:96.125px;height:100%&quot;&gt;tablet&lt;i&gt;769px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:128px;height:100%&quot;&gt;desktop&lt;i&gt;1024px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:152px;height:100%&quot;&gt;widescreen&lt;i&gt;1216px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:176px;height:100%&quot;&gt;fullhd&lt;i&gt;1408px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;centered&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;Minimum width&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;mobile&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;em&gt;none&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;tablet&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;769px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;desktop&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1024px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;widescreen&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1216px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;fullhd&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1408px&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Find more information in the &lt;a href=&quot;https://bulma.io/documentation/overview/responsiveness/#breakpoints&quot;&gt;Bulma documentation&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 id=&quot;chakra-ui&quot;&gt;&lt;img src=&quot;/blogs/css-frameworks/chakra.svg&quot; alt=&quot;Chakra UI&quot;/&gt;&lt;/h3&gt;&lt;div class=&quot;WorkspacePreview-styles-module--workspaceWrapper--2oxQo&quot;&gt;&lt;div class=&quot;WorkspacePreview-styles-module--buttonContainer--qE3bQ&quot;&gt;&lt;a class=&quot;WorkspacePreview-styles-module--open--1iMji&quot; href=&quot;polypane://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A375%2C%22title%22%3A%22below%20sm%22%7D%2C%7B%22width%22%3A480%2C%22title%22%3A%22sm%22%7D%2C%7B%22width%22%3A768%2C%22title%22%3A%22md%22%7D%2C%7B%22width%22%3A992%2C%22title%22%3A%22lg%22%7D%2C%7B%22width%22%3A1280%2C%22title%22%3A%22xl%22%7D%2C%7B%22width%22%3A1472%2C%22title%22%3A%222xl%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a class=&quot;WorkspacePreview-styles-module--download--3LtqQ&quot; href=&quot;/workspace-downloads/ChakraUI.ppws&quot; download=&quot;&quot;&gt;Download Workspace file &lt;svg id=&quot;i-download&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 26 L16 30 21 26 M16 16 L16 30&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreview-styles-module--panelist--1A3mi panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:46.875px;height:100%&quot;&gt;below sm&lt;i&gt; &lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:60px;height:100%&quot;&gt;sm&lt;i&gt;480px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:96px;height:100%&quot;&gt;md&lt;i&gt;768px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:124px;height:100%&quot;&gt;lg&lt;i&gt;992px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:160px;height:100%&quot;&gt;xl&lt;i&gt;1280px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:184px;height:100%&quot;&gt;2xl&lt;i&gt;1472px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;centered&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;Minimum width&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;em&gt;below sm&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;em&gt;none&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;sm&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;30em&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;md&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;48em&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;lg&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;62em&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;xl&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;80em&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;2xl&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;96em&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Find more information in the &lt;a href=&quot;https://chakra-ui.com/docs/styled-system/features/responsive-styles&quot;&gt;Chakra UI documentation&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 id=&quot;foundation&quot;&gt;&lt;img src=&quot;/blogs/css-frameworks/foundation.svg&quot;/&gt; Foundation&lt;/h3&gt;&lt;div class=&quot;WorkspacePreview-styles-module--workspaceWrapper--2oxQo&quot;&gt;&lt;div class=&quot;WorkspacePreview-styles-module--buttonContainer--qE3bQ&quot;&gt;&lt;a class=&quot;WorkspacePreview-styles-module--open--1iMji&quot; href=&quot;polypane://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A414%2C%22title%22%3A%22Small%22%7D%2C%7B%22width%22%3A640%2C%22title%22%3A%22Medium%22%7D%2C%7B%22width%22%3A1024%2C%22title%22%3A%22Large%22%7D%2C%7B%22width%22%3A1200%2C%22title%22%3A%22Xlarge%22%7D%2C%7B%22width%22%3A1440%2C%22title%22%3A%22Xxlarge%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a class=&quot;WorkspacePreview-styles-module--download--3LtqQ&quot; href=&quot;/workspace-downloads/Foundation.ppws&quot; download=&quot;&quot;&gt;Download Workspace file &lt;svg id=&quot;i-download&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 26 L16 30 21 26 M16 16 L16 30&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreview-styles-module--panelist--1A3mi panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:51.75px;height:100%&quot;&gt;Small&lt;i&gt; &lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:80px;height:100%&quot;&gt;Medium&lt;i&gt;640px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:128px;height:100%&quot;&gt;Large&lt;i&gt;1024px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:150px;height:100%&quot;&gt;Xlarge&lt;i&gt;1200px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:180px;height:100%&quot;&gt;Xxlarge&lt;i&gt;1440px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;centered&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;Minimum width&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Small&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;em&gt;none&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Medium&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;640px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Large&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1024px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Xlarge &lt;em&gt;(optional)&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1200px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Xxlarge &lt;em&gt;(optional)&lt;/em&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1440px&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Find more information in the &lt;a href=&quot;https://get.foundation/sites/docs/media-queries.html#default-media-queries&quot;&gt;Foundation documentation&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 id=&quot;halfmoon&quot;&gt;&lt;img src=&quot;/blogs/css-frameworks/halfmoon.svg&quot;/&gt; Halfmoon&lt;/h3&gt;&lt;div class=&quot;WorkspacePreview-styles-module--workspaceWrapper--2oxQo&quot;&gt;&lt;div class=&quot;WorkspacePreview-styles-module--buttonContainer--qE3bQ&quot;&gt;&lt;a class=&quot;WorkspacePreview-styles-module--open--1iMji&quot; href=&quot;polypane://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A540%2C%22title%22%3A%22sm%22%7D%2C%7B%22width%22%3A720%2C%22title%22%3A%22md%22%7D%2C%7B%22width%22%3A960%2C%22title%22%3A%22lg%22%7D%2C%7B%22width%22%3A1140%2C%22title%22%3A%22xl%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a class=&quot;WorkspacePreview-styles-module--download--3LtqQ&quot; href=&quot;/workspace-downloads/Halfmoon.ppws&quot; download=&quot;&quot;&gt;Download Workspace file &lt;svg id=&quot;i-download&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 26 L16 30 21 26 M16 16 L16 30&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreview-styles-module--panelist--1A3mi panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:67.5px;height:100%&quot;&gt;sm&lt;i&gt;540px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:90px;height:100%&quot;&gt;md&lt;i&gt;720px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:120px;height:100%&quot;&gt;lg&lt;i&gt;960px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:142.5px;height:100%&quot;&gt;xl&lt;i&gt;1140px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;centered&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;Minimum width&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;sm&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;540px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;md&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;720px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;lg&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;960px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;xl&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1140px&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Find more information in the &lt;a href=&quot;https://www.gethalfmoon.com/docs/containers/&quot;&gt;Halfmoon documentation&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 id=&quot;ionic&quot;&gt;&lt;img src=&quot;/blogs/css-frameworks/ionic.svg&quot;/&gt; Ionic&lt;/h3&gt;&lt;div class=&quot;WorkspacePreview-styles-module--workspaceWrapper--2oxQo&quot;&gt;&lt;div class=&quot;WorkspacePreview-styles-module--buttonContainer--qE3bQ&quot;&gt;&lt;a class=&quot;WorkspacePreview-styles-module--open--1iMji&quot; href=&quot;polypane://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A424%2C%22title%22%3A%22xs%22%7D%2C%7B%22width%22%3A576%2C%22title%22%3A%22sm%22%7D%2C%7B%22width%22%3A768%2C%22title%22%3A%22md%22%7D%2C%7B%22width%22%3A992%2C%22title%22%3A%22lg%22%7D%2C%7B%22width%22%3A1200%2C%22title%22%3A%22xl%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a class=&quot;WorkspacePreview-styles-module--download--3LtqQ&quot; href=&quot;/workspace-downloads/Ionic.ppws&quot; download=&quot;&quot;&gt;Download Workspace file &lt;svg id=&quot;i-download&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 26 L16 30 21 26 M16 16 L16 30&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreview-styles-module--panelist--1A3mi panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:53px;height:100%&quot;&gt;xs&lt;i&gt; &lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:72px;height:100%&quot;&gt;sm&lt;i&gt;576px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:96px;height:100%&quot;&gt;md&lt;i&gt;768px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:124px;height:100%&quot;&gt;lg&lt;i&gt;992px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:150px;height:100%&quot;&gt;xl&lt;i&gt;1200px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;centered&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;Minimum width&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;xs&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;em&gt;none&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;sm&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;576px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;md&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;768px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;lg&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;992px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;xl&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1200px&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Find more information in the &lt;a href=&quot;https://ionicframework.com/docs/layout/css-utilities#ionic-breakpoints&quot;&gt;Ionic documentation&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 id=&quot;mantine&quot;&gt;&lt;img src=&quot;/blogs/css-frameworks/mantine.svg&quot;/&gt; Mantine&lt;/h3&gt;&lt;div class=&quot;WorkspacePreview-styles-module--workspaceWrapper--2oxQo&quot;&gt;&lt;div class=&quot;WorkspacePreview-styles-module--buttonContainer--qE3bQ&quot;&gt;&lt;a class=&quot;WorkspacePreview-styles-module--open--1iMji&quot; href=&quot;polypane://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A500%2C%22title%22%3A%22xs%22%7D%2C%7B%22width%22%3A800%2C%22title%22%3A%22sm%22%7D%2C%7B%22width%22%3A1000%2C%22title%22%3A%22md%22%7D%2C%7B%22width%22%3A1200%2C%22title%22%3A%22lg%22%7D%2C%7B%22width%22%3A1400%2C%22title%22%3A%22xl%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a class=&quot;WorkspacePreview-styles-module--download--3LtqQ&quot; href=&quot;/workspace-downloads/Mantine.ppws&quot; download=&quot;&quot;&gt;Download Workspace file &lt;svg id=&quot;i-download&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 26 L16 30 21 26 M16 16 L16 30&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreview-styles-module--panelist--1A3mi panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:62.5px;height:100%&quot;&gt;xs&lt;i&gt;500px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:100px;height:100%&quot;&gt;sm&lt;i&gt;800px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:125px;height:100%&quot;&gt;md&lt;i&gt;1000px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:150px;height:100%&quot;&gt;lg&lt;i&gt;1200px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:175px;height:100%&quot;&gt;xl&lt;i&gt;1400px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;centered&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;Minimum width&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;xs&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;500px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;sm&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;800px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;md&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1000px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;lg&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1200px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;xl&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1400px&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Find more information in the &lt;a href=&quot;https://mantine.dev/styles/responsive/&quot;&gt;Mantine documentation&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 id=&quot;material-ui&quot;&gt;&lt;img src=&quot;/blogs/css-frameworks/materialui.svg&quot;/&gt; Material UI&lt;/h3&gt;&lt;div class=&quot;WorkspacePreview-styles-module--workspaceWrapper--2oxQo&quot;&gt;&lt;div class=&quot;WorkspacePreview-styles-module--buttonContainer--qE3bQ&quot;&gt;&lt;a class=&quot;WorkspacePreview-styles-module--open--1iMji&quot; href=&quot;polypane://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A320%2C%22title%22%3A%22xs%22%7D%2C%7B%22width%22%3A600%2C%22title%22%3A%22sm%22%7D%2C%7B%22width%22%3A960%2C%22title%22%3A%22md%22%7D%2C%7B%22width%22%3A1280%2C%22title%22%3A%22lg%22%7D%2C%7B%22width%22%3A1920%2C%22title%22%3A%22xl%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;i&gt;Built into Polypane&lt;/i&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreview-styles-module--panelist--1A3mi panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:40px;height:100%&quot;&gt;xs&lt;i&gt; &lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:75px;height:100%&quot;&gt;sm&lt;i&gt;600px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:120px;height:100%&quot;&gt;md&lt;i&gt;960px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:160px;height:100%&quot;&gt;lg&lt;i&gt;1280px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:240px;height:100%&quot;&gt;xl&lt;i&gt;1920px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;centered&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;Minimum width&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;xs&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;em&gt;none&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;sm&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;600px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;md&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;960px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;lg&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1280px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;xl&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1920px&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Find more information in the &lt;a href=&quot;https://material-ui.com/customization/breakpoints/#default-breakpoints&quot;&gt;Material UI documentation&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 id=&quot;materialize&quot;&gt;&lt;img src=&quot;/blogs/css-frameworks/materialize.svg&quot;/&gt; Materialize&lt;/h3&gt;&lt;div class=&quot;WorkspacePreview-styles-module--workspaceWrapper--2oxQo&quot;&gt;&lt;div class=&quot;WorkspacePreview-styles-module--buttonContainer--qE3bQ&quot;&gt;&lt;a class=&quot;WorkspacePreview-styles-module--open--1iMji&quot; href=&quot;polypane://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A320%2C%22title%22%3A%22s%22%7D%2C%7B%22width%22%3A600%2C%22title%22%3A%22m%22%7D%2C%7B%22width%22%3A992%2C%22title%22%3A%22l%22%7D%2C%7B%22width%22%3A1200%2C%22title%22%3A%22xl%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a class=&quot;WorkspacePreview-styles-module--download--3LtqQ&quot; href=&quot;/workspace-downloads/Materialize.ppws&quot; download=&quot;&quot;&gt;Download Workspace file &lt;svg id=&quot;i-download&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 26 L16 30 21 26 M16 16 L16 30&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreview-styles-module--panelist--1A3mi panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:40px;height:100%&quot;&gt;s&lt;i&gt; &lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:75px;height:100%&quot;&gt;m&lt;i&gt;600px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:124px;height:100%&quot;&gt;l&lt;i&gt;992px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:150px;height:100%&quot;&gt;xl&lt;i&gt;1200px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;centered&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;Minimum width&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;s&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;em&gt;none&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;m&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;600px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;l&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;992px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;xl&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1200px&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Find more information in the &lt;a href=&quot;https://materializecss.com/grid.html#grid-responsive&quot;&gt;Materialize documentation&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 id=&quot;open-props&quot;&gt;&lt;img src=&quot;/blogs/css-frameworks/openprops.svg&quot;/&gt; Open Props&lt;/h3&gt;&lt;div class=&quot;WorkspacePreview-styles-module--workspaceWrapper--2oxQo&quot;&gt;&lt;div class=&quot;WorkspacePreview-styles-module--buttonContainer--qE3bQ&quot;&gt;&lt;a class=&quot;WorkspacePreview-styles-module--open--1iMji&quot; href=&quot;polypane://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A240%2C%22title%22%3A%22xxs%22%7D%2C%7B%22width%22%3A360%2C%22title%22%3A%22xs%22%7D%2C%7B%22width%22%3A480%2C%22title%22%3A%22sm%22%7D%2C%7B%22width%22%3A768%2C%22title%22%3A%22md%22%7D%2C%7B%22width%22%3A1024%2C%22title%22%3A%22lg%22%7D%2C%7B%22width%22%3A1400%2C%22title%22%3A%22xl%22%7D%2C%7B%22width%22%3A1920%2C%22title%22%3A%22xxl%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a class=&quot;WorkspacePreview-styles-module--download--3LtqQ&quot; href=&quot;/workspace-downloads/Open-props.ppws&quot; download=&quot;&quot;&gt;Download Workspace file &lt;svg id=&quot;i-download&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 26 L16 30 21 26 M16 16 L16 30&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreview-styles-module--panelist--1A3mi panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:30px;height:100%&quot;&gt;xxs&lt;i&gt; &lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:45px;height:100%&quot;&gt;xs&lt;i&gt;360px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:60px;height:100%&quot;&gt;sm&lt;i&gt;480px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:96px;height:100%&quot;&gt;md&lt;i&gt;768px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:128px;height:100%&quot;&gt;lg&lt;i&gt;1024px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:175px;height:100%&quot;&gt;xl&lt;i&gt;1400px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:240px;height:100%&quot;&gt;xxl&lt;i&gt;1920px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;centered&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;Minimum width&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;xxs&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;240px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;xs&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;360px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;sm&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;480px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;md&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;768px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;lg&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1024px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;xl&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1400px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;xxl&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1920px&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Find more information in the &lt;a href=&quot;https://open-props.style/#media-queries&quot;&gt;Open Props documentation&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 id=&quot;semantic-ui&quot;&gt;&lt;img src=&quot;/blogs/css-frameworks/semantic.png&quot;/&gt; Semantic UI&lt;/h3&gt;&lt;div class=&quot;WorkspacePreview-styles-module--workspaceWrapper--2oxQo&quot;&gt;&lt;div class=&quot;WorkspacePreview-styles-module--buttonContainer--qE3bQ&quot;&gt;&lt;a class=&quot;WorkspacePreview-styles-module--open--1iMji&quot; href=&quot;polypane://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A414%2C%22title%22%3A%22mobile%22%7D%2C%7B%22width%22%3A768%2C%22title%22%3A%22tablet%22%7D%2C%7B%22width%22%3A992%2C%22title%22%3A%22small%20monitor%22%7D%2C%7B%22width%22%3A1200%2C%22title%22%3A%22large%20monitor%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a class=&quot;WorkspacePreview-styles-module--download--3LtqQ&quot; href=&quot;/workspace-downloads/SemanticUI.ppws&quot; download=&quot;&quot;&gt;Download Workspace file &lt;svg id=&quot;i-download&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 26 L16 30 21 26 M16 16 L16 30&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreview-styles-module--panelist--1A3mi panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:51.75px;height:100%&quot;&gt;mobile&lt;i&gt; &lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:96px;height:100%&quot;&gt;tablet&lt;i&gt;768px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:124px;height:100%&quot;&gt;small monitor&lt;i&gt;992px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:150px;height:100%&quot;&gt;large monitor&lt;i&gt;1200px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;centered&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;Minimum width&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;mobile&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;&lt;em&gt;none&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;tablet&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;768px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;small monitor&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;992px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;large monitor&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1200px&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Find more information in the &lt;a href=&quot;https://semantic-ui.com/elements/container.html&quot;&gt;Semantic UI documentation&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 id=&quot;skeleton&quot;&gt;&lt;img src=&quot;/blogs/css-frameworks/skeleton.png&quot;/&gt; Skeleton&lt;/h3&gt;&lt;div class=&quot;WorkspacePreview-styles-module--workspaceWrapper--2oxQo&quot;&gt;&lt;div class=&quot;WorkspacePreview-styles-module--buttonContainer--qE3bQ&quot;&gt;&lt;a class=&quot;WorkspacePreview-styles-module--open--1iMji&quot; href=&quot;polypane://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A440%2C%22title%22%3A%22Mobile%22%7D%2C%7B%22width%22%3A550%2C%22title%22%3A%22Phablet%22%7D%2C%7B%22width%22%3A750%2C%22title%22%3A%22Tablet%22%7D%2C%7B%22width%22%3A1000%2C%22title%22%3A%22Desktop%22%7D%2C%7B%22width%22%3A1200%2C%22title%22%3A%22Desktop%20HD%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a class=&quot;WorkspacePreview-styles-module--download--3LtqQ&quot; href=&quot;/workspace-downloads/Skeleton.ppws&quot; download=&quot;&quot;&gt;Download Workspace file &lt;svg id=&quot;i-download&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 26 L16 30 21 26 M16 16 L16 30&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreview-styles-module--panelist--1A3mi panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:55px;height:100%&quot;&gt;Mobile&lt;i&gt;440px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:68.75px;height:100%&quot;&gt;Phablet&lt;i&gt;550px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:93.75px;height:100%&quot;&gt;Tablet&lt;i&gt;750px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:125px;height:100%&quot;&gt;Desktop&lt;i&gt;1000px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:150px;height:100%&quot;&gt;Desktop HD&lt;i&gt;1200px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;centered&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;Minimum width&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Mobile&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;440px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Phablet&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;550px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Tablet&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;750px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Desktop&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1000px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Desktop HD&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1200px&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Find more information in the &lt;a href=&quot;http://getskeleton.com/#queries&quot;&gt;Skeleton documentation&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 id=&quot;tailwind-css-30&quot;&gt;&lt;img src=&quot;/blogs/css-frameworks/tailwind.svg&quot;/&gt; Tailwind CSS (3.0)&lt;/h3&gt;&lt;div class=&quot;WorkspacePreview-styles-module--workspaceWrapper--2oxQo&quot;&gt;&lt;div class=&quot;WorkspacePreview-styles-module--buttonContainer--qE3bQ&quot;&gt;&lt;a class=&quot;WorkspacePreview-styles-module--open--1iMji&quot; href=&quot;polypane://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A640%2C%22title%22%3A%22sm%22%7D%2C%7B%22width%22%3A768%2C%22title%22%3A%22md%22%7D%2C%7B%22width%22%3A1024%2C%22title%22%3A%22lg%22%7D%2C%7B%22width%22%3A1280%2C%22title%22%3A%22xl%22%7D%2C%7B%22width%22%3A1536%2C%22title%22%3A%222xl%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;i&gt;Built into Polypane&lt;/i&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreview-styles-module--panelist--1A3mi panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:80px;height:100%&quot;&gt;sm&lt;i&gt;640px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:96px;height:100%&quot;&gt;md&lt;i&gt;768px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:128px;height:100%&quot;&gt;lg&lt;i&gt;1024px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:160px;height:100%&quot;&gt;xl&lt;i&gt;1280px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:192px;height:100%&quot;&gt;2xl&lt;i&gt;1536px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;centered&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;Minimum width&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;sm&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;640px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;md&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;768px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;lg&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1024px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;xl&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1280px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;2xl&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1536px&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Find more information in the &lt;a href=&quot;https://tailwindcss.com/docs/breakpoints/&quot;&gt;Tailwind CSS documentation&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 id=&quot;uikit&quot;&gt;&lt;img src=&quot;/blogs/css-frameworks/uikit.svg&quot;/&gt; UIKit&lt;/h3&gt;&lt;div class=&quot;WorkspacePreview-styles-module--workspaceWrapper--2oxQo&quot;&gt;&lt;div class=&quot;WorkspacePreview-styles-module--buttonContainer--qE3bQ&quot;&gt;&lt;a class=&quot;WorkspacePreview-styles-module--open--1iMji&quot; href=&quot;polypane://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A640%2C%22title%22%3A%22s%22%7D%2C%7B%22width%22%3A960%2C%22title%22%3A%22m%22%7D%2C%7B%22width%22%3A1200%2C%22title%22%3A%22l%22%7D%2C%7B%22width%22%3A1600%2C%22title%22%3A%22xl%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a class=&quot;WorkspacePreview-styles-module--download--3LtqQ&quot; href=&quot;/workspace-downloads/UIKit.ppws&quot; download=&quot;&quot;&gt;Download Workspace file &lt;svg id=&quot;i-download&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 26 L16 30 21 26 M16 16 L16 30&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreview-styles-module--panelist--1A3mi panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:80px;height:100%&quot;&gt;s&lt;i&gt;640px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:120px;height:100%&quot;&gt;m&lt;i&gt;960px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:150px;height:100%&quot;&gt;l&lt;i&gt;1200px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:200px;height:100%&quot;&gt;xl&lt;i&gt;1600px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;centered&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;Minimum width&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;s&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;640px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;m&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;960px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;l&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1200px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;xl&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1600px&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Find more information in the &lt;a href=&quot;https://getuikit.com/docs/visibility#responsive&quot;&gt;UIKit documentation&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 id=&quot;webflow&quot;&gt;&lt;img src=&quot;/blogs/css-frameworks/webflow.svg&quot;/&gt; Webflow&lt;/h3&gt;&lt;div class=&quot;WorkspacePreview-styles-module--workspaceWrapper--2oxQo&quot;&gt;&lt;div class=&quot;WorkspacePreview-styles-module--buttonContainer--qE3bQ&quot;&gt;&lt;a class=&quot;WorkspacePreview-styles-module--open--1iMji&quot; href=&quot;polypane://polypane.app/exported-panes/?panesizes=%5B%7B%22width%22%3A478%2C%22title%22%3A%22Mobile%20portrait%20and%20below%22%7D%2C%7B%22width%22%3A767%2C%22title%22%3A%22Mobile%20landscape%20and%20below%22%7D%2C%7B%22width%22%3A991%2C%22title%22%3A%22Tablet%20and%20below%22%7D%2C%7B%22width%22%3A1024%2C%22title%22%3A%22Desktop%20(base)%22%7D%2C%7B%22width%22%3A1280%2C%22title%22%3A%221280px%20and%20above%22%7D%2C%7B%22width%22%3A1440%2C%22title%22%3A%221280px%20and%20above%22%7D%2C%7B%22width%22%3A1920%2C%22title%22%3A%221280px%20and%20above%22%7D%5D&quot;&gt;Open in Polypane &lt;svg id=&quot;i-upload&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;20&quot; height=&quot;20&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 18 L16 14 21 18 M16 14 L16 29&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a class=&quot;WorkspacePreview-styles-module--download--3LtqQ&quot; href=&quot;/workspace-downloads/webflow.ppws&quot; download=&quot;&quot;&gt;Download Workspace file &lt;svg id=&quot;i-download&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M9 22 C0 23 1 12 9 13 6 2 23 2 22 10 32 7 32 23 23 22 M11 26 L16 30 21 26 M16 16 L16 30&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul class=&quot;WorkspacePreview-styles-module--panelist--1A3mi panelist&quot;&gt;&lt;li&gt;&lt;div style=&quot;width:59.75px;height:100%&quot;&gt;Mobile portrait and below&lt;i&gt;478px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:95.875px;height:100%&quot;&gt;Mobile landscape and below&lt;i&gt;767px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:123.875px;height:100%&quot;&gt;Tablet and below&lt;i&gt;991px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:128px;height:100%&quot;&gt;Desktop (base)&lt;i&gt;1024px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:160px;height:100%&quot;&gt;1280px and above&lt;i&gt;1280px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:180px;height:100%&quot;&gt;1280px and above&lt;i&gt;1440px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div style=&quot;width:240px;height:100%&quot;&gt;1280px and above&lt;i&gt;1920px&lt;/i&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class=&quot;centered&quot;&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Name&lt;/th&gt;&lt;th align=&quot;right&quot;&gt;Minimum width&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Mobile portrait and below&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;478px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Mobile landscape and below&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;767px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Tablet and below&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;991px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Desktop (base)&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1024px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;1280px and above&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1280px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;1280px and above&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1440px&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;1280px and above&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;1920px&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Find more information in the &lt;a href=&quot;https://university.webflow.com/lesson/intro-to-breakpoints&quot;&gt;Webflow documentation&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3 id=&quot;increasing-your-productivity-as-a-web-developer&quot;&gt;Increasing your productivity as a web developer&lt;/h3&gt;&lt;p&gt;Using a CSS framework is one of the
&lt;a href=&quot;/blog/ways-to-increase-your-productivity-as-a-web-developer/&quot;&gt;8 ways to increase your productivity as a web developer&lt;/a&gt;.
Check out the other 7 ways to improve your productivity!&lt;/p&gt;&lt;h3 id=&quot;ground-rules-for-responsive-design&quot;&gt;Ground rules for responsive design&lt;/h3&gt;&lt;p&gt;Though CSS frameworks help you with a lot of choices, building a solid responsive design still requires you to pay attention
to other parts of your page and design. Read about the &lt;a href=&quot;/blog/responsive-design-ground-rules/&quot;&gt;ground rules for responsive design&lt;/a&gt; to created solid responsive websites.&lt;/p&gt;&lt;h3 id=&quot;missing-a-css-framework&quot;&gt;Missing a CSS framework?&lt;/h3&gt;&lt;p&gt;Are we missing your favorite CSS framework? &lt;a href=&quot;/support/&quot;&gt;Reach out&lt;/a&gt; and we&amp;#x27;ll add it to the list!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[How Red Pixel Themes uses Polypane]]></title><description><![CDATA[The following article was written by Vivian of  Red Pixel Themes  on how they use Polypane in their
development process and is part of a…]]></description><link>https://polypane.app/blog/how-red-pixel-themes-uses-polypane/</link><guid isPermaLink="false">https://polypane.app/blog/how-red-pixel-themes-uses-polypane/</guid><pubDate>Fri, 03 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;The following article was written by Vivian of &lt;a href=&quot;https://redpixelthemes.com/&quot;&gt;Red Pixel Themes&lt;/a&gt; on how they use Polypane in their
development process and is part of a series of case studies by Polypane users.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;We’re &lt;a href=&quot;https://redpixelthemes.com/&quot;&gt;Red Pixel Themes&lt;/a&gt;, a web shop that produces web templates made with TailwindCSS. We’re a team of 2 sisters (Vivian and Daniela) who have a passion for beautiful design, have a soft spot for CSS and enjoy working with JavaScript, you can also hire us for custom work.
​&lt;/p&gt;&lt;h3 id=&quot;our-philosophy&quot;&gt;Our philosophy&lt;/h3&gt;&lt;p&gt;​
Since we’re building templates for other developers to use, we need to take into account lots of different decisions that we, too, have made while working with other templates.&lt;/p&gt;&lt;p&gt;We tend to ask things like “&lt;em&gt;what happens if section X needs to have double or triple the text?&lt;/em&gt;” or “&lt;em&gt;what if the customer deletes this section, how would the design accommodate that?&lt;/em&gt;” because we want to offer the best possible developer experience. We want to build stuff that we would enjoy using, today and in the future.
​&lt;/p&gt;&lt;h3 id=&quot;our-process&quot;&gt;Our Process&lt;/h3&gt;&lt;p&gt;Here’s how we typically develop one of our templates:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;We usually start with one of our starter projects, right now we’re really digging Jekyll.&lt;/li&gt;&lt;li&gt;We then open up Polypane and select our already &lt;a href=&quot;/docs/workspaces/&quot;&gt;created workspace&lt;/a&gt; with all our defined breakpoints, we zoom out until all breakpoints are visible.&lt;/li&gt;&lt;li&gt;We start coding and we focus on each section, making it look good for all our breakpoints before moving to the next one.&lt;/li&gt;&lt;li&gt;Once the HTML/CSS is done, we open up the &lt;a href=&quot;/docs/accessibility-panel/&quot;&gt;accessibility panel&lt;/a&gt; and check for any errors we may have.&lt;/li&gt;&lt;li&gt;Next, we open up the &lt;a href=&quot;/docs/meta-information/&quot;&gt;meta tags panel&lt;/a&gt; and fix any inconsistencies we see there, we also create a simple social image cover in Canva for each template so we can visualize the social cards better.&lt;/li&gt;&lt;li&gt;Lastly, we switch Polypane to &lt;a href=&quot;/docs/layouts/#focus-mode-shortcut-f&quot;&gt;focus mode&lt;/a&gt;, open the biggest breakpoint and start adding interactivity to the design using AlpineJS or Vue.JS.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;You can download the Polypane workspace that Red Pixel Themes uses here: &lt;a href=&quot;/blogs/tailwindmade/Tailwind-Made-Breakpoints.ppws&quot;&gt;Red Pixel Themes Breakpoints.ppws&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;a href=&quot;https://redpixelthemes.com/templates/elyssi/&quot; style=&quot;background:none;box-shadow:none&quot;&gt;&lt;img alt=&quot;Elyssi template by Red Pixel Themes&quot; src=&quot;/blogs/tailwindmade/template.jpg&quot; class=&quot;imgshadow&quot; style=&quot;margin:1rem auto 1rem;display:block;max-width:100%&quot;/&gt;&lt;/a&gt;&lt;h3 id=&quot;how-we-discovered-polypane&quot;&gt;How we discovered Polypane&lt;/h3&gt;&lt;p&gt;You probably all know the usual workflow of responsive design coding. You open Chrome, create a few “screens” and then constantly change the view to check each breakpoint for every code change you make. Some people prefer to do it by focusing on each breakpoint first and then take a quick look to all the breakpoints at the end to check for any visual bugs.&lt;/p&gt;&lt;p&gt;This is not an overly bad workflow, it&amp;#x27;s just &lt;em&gt;very time consuming&lt;/em&gt; and since we both freelance full time, we wanted to maximize our time spent on this project so we needed to find a more time efficient alternative to this, ASAP.&lt;/p&gt;&lt;p&gt;In our search, we first tested another developer focused browser called Sizzy since it seemed popular but found it a bit buggy, lacked good synchronized scrolling support and didn’t play well with Browsersync.&lt;/p&gt;&lt;p&gt;We actually discovered Polypane just by googling for other developer-focused browsers, we found similar tools on the market but &lt;strong&gt;nothing beat Polypane’s stability and we really liked the regular updates&lt;/strong&gt;, we thought the project had more potential and was better priced.&lt;/p&gt;&lt;p&gt;We signed up for the trial but didn’t start using it until a week or so later, we’re the kind of devs that read the entire documentation of any tool before using it and by doing that we realized Polypane had so many features it was surprising to find out it was made by a single dev!&lt;/p&gt;&lt;h3 id=&quot;why-we-stayed&quot;&gt;Why we stayed&lt;/h3&gt;&lt;p&gt;It was me (Vivian) who first started using it to try and see how it could be implemented as a regular tool in our coding workflow. I tested it on a few freelance projects and was sold.&lt;/p&gt;&lt;p&gt;I remember the thing that wow’ed me was the breakpoint detection functionality, it was incredibly useful for our freelance work because sometimes we worked with old CSS codebases that didn’t have clearly defined breakpoints like in Tailwind. Just this feature alone made us a paying customer.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The biggest benefit we got by using Polypane was &lt;em&gt;way shorter&lt;/em&gt; dev time. &lt;strong&gt;What we used to do in 1 hour in Chrome took 20 minutes in Polypane&lt;/strong&gt;. It was&lt;em&gt;that&lt;/em&gt; good.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;The second best was having less visual bugs&lt;/strong&gt;, now that we had clear visibility of all breakpoints at the same time and great synchronized scrolling, it was very easy to spot inconsistencies in the code.&lt;/p&gt;&lt;a href=&quot;https://redpixelthemes.com/templates/elyssi/&quot; style=&quot;background:none;box-shadow:none&quot;&gt;&lt;img alt=&quot;Elyssi template by Red Pixel Themes&quot; src=&quot;/blogs/tailwindmade/template2.jpg&quot; class=&quot;imgshadow&quot; style=&quot;margin:1rem auto 1rem;display:block;max-width:100%&quot;/&gt;&lt;/a&gt;&lt;h3 id=&quot;whats-next-for-red-pixel-themes&quot;&gt;What’s next for Red Pixel Themes&lt;/h3&gt;&lt;p&gt;We’re in the middle of finishing up for our big launch, if you love working with Tailwind and need a good start for your next project then check out our available templates, we got a &lt;a href=&quot;https://redpixelthemes.com/templates/elyssi/&quot;&gt;beautiful e-commerce one&lt;/a&gt;, one for &lt;a href=&quot;https://redpixelthemes.com/templates/thompson/&quot;&gt;lawyers/business&lt;/a&gt; and many more to come!.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Thank you Vivian for sharing your experiences getting started with and using Polypane! Vivian is also the author of &lt;a href=&quot;https://tailwindweekly.com&quot;&gt;Tailwind Weekly&lt;/a&gt;, which is a must-read if you do any Tailwind CSS development.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;To learn more about how Polypane can help you build Tailwind sites, &lt;a href=&quot;/tailwindcss/&quot;&gt;learn how well they work together&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 3.2: Accessibility and viewport sizing]]></title><description><![CDATA[We're introducing two big features in Polypane 3.2: The  accessibility panel  and  viewport sizing . Beyond that we added a whole lot of…]]></description><link>https://polypane.app/blog/polypane-3-2-accessibility-and-viewport-sizing/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-3-2-accessibility-and-viewport-sizing/</guid><pubDate>Fri, 12 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&amp;#x27;re introducing two big features in Polypane 3.2: The &lt;strong&gt;accessibility panel&lt;/strong&gt; and &lt;strong&gt;viewport sizing&lt;/strong&gt;. Beyond that we added a whole lot of smaller features and improvements, with nearly 40 items in our release notes.&lt;/p&gt;&lt;h2 id=&quot;accessibility-panel&quot;&gt;Accessibility panel&lt;/h2&gt;&lt;p&gt;Polypane has long had features to help build more accessible sites, like our contrast checker, outline panel and over a dozen different simulators to test your site for varous visual and other impairments.&lt;/p&gt;&lt;p&gt;In Polypane 3.2 we added an accessibility panel that does automated testing of your page. We spend a lot of time on making it as actionable as possible and really help you understand what the issues are, where they are and how you can solve them.&lt;/p&gt;&lt;p&gt;Issues are ordered by severity, so you just start at the top and work your way down. When you hover over the elements in the accessibility panel, the panes scroll to highlight the element. When you click on the inspect element icon the element will be selected in the Elements panel, where you can usually fix the issue.&lt;/p&gt;&lt;p&gt;The workflow is really enjoyable and we hope it makes you check and fix accessibility issues more often. See how we fix two (minor) issues in record time on our own homepage:&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-3-2/a11y.gif&quot; class=&quot;imgshadow&quot; alt=&quot;Video showing two accessibility bugs being fixed in Polypane&quot;/&gt;&lt;blockquote&gt;&lt;p&gt;Of course, you want to get to zero issues and if you do, Polypane has a little surprise waiting for you 🎉️&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;real-viewport-sizes&quot;&gt;Real viewport sizes&lt;/h2&gt;&lt;p&gt;Responsive design is best when it&amp;#x27;s based on your content. Device sizes change but if you make a responsive design that works well with your content it will keep looking great.&lt;/p&gt;&lt;p&gt;That being said, Polypane has always had a set of default devices with full emulation. The dimensions we used for these devices were the full screen sizes, perfect for developing SPA&amp;#x27;s or other fullscreen experiences. From Polypane 3.2 on, we&amp;#x27;ll default our devices to the real viewport size, which is the part of your screen that actually shows your site in the default browser.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-3-2/viewport.png&quot; class=&quot;imgshadow&quot; alt=&quot;A viewport and non-viewport pane in Polypane&quot;/&gt;&lt;p&gt;We gathered the data for all our devices and made sure we have the real viewport sizes for both portrait and landscape modes. Switching between viewport and no-viewport can be done in the device preset list and rotating devices will automatically use the correct viewport sizes for the device you&amp;#x27;ve selected.&lt;/p&gt;&lt;h2 id=&quot;elements-panel-improvements&quot;&gt;Elements panel improvements&lt;/h2&gt;&lt;p&gt;We&amp;#x27;ve been overwhelmed by the feedback you&amp;#x27;ve given on the elements panel. We&amp;#x27;re glad to hear we made something that has been so useful to you and are constantly working on making it better. In this release, we&amp;#x27;ve made it faster and more stable.&lt;/p&gt;&lt;p&gt;We&amp;#x27;ve added options to quickly hide the selected element (which comes in handy more often than you&amp;#x27;d think) and to collapse the box model so that the style panel has more room. Polypane now shows the line height of an element and if the list of classes is very long, it will make it scrollable so the rest of the panel is still usable&lt;/p&gt;&lt;p&gt;But the biggest update it the new popup when you inspect an element. You&amp;#x27;re probably familiar with it from other browser developer tools, but we think our version is quite a bit more useful. It shows an overview of the element, including the actual font information and the contrast ratio (for every element).&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-3-2/popup.png&quot; class=&quot;imgshadow&quot; alt=&quot;A viewport and non-viewport pane in Polypane&quot;/&gt;&lt;blockquote&gt;&lt;p&gt;We think we have a pretty good set of info right now, but we&amp;#x27;d love to hear from you what you want to see added in this popup!&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;overlay-updates&quot;&gt;Overlay updates&lt;/h3&gt;&lt;p&gt;All the overlays now have an &lt;svg id=&quot;i-info&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;16&quot; height=&quot;16&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;6.25%&quot;&gt;&lt;path d=&quot;M16 14 L16 23 M16 8 L16 10&quot;&gt;&lt;/path&gt;&lt;circle cx=&quot;16&quot; cy=&quot;16&quot; r=&quot;14&quot;&gt;&lt;/circle&gt;&lt;/svg&gt; icon that you can hover to get information on what the overlay does. For the simulators we show how many people are affected by it.&lt;/p&gt;&lt;p&gt;When you have an overlay selected we add a &amp;quot;clear overlay&amp;quot; button at the top of the overlay popup so you can quickly remove the overlay again.&lt;/p&gt;&lt;p&gt;Lastly, out color contrast overlay has seen some cool improvements in the past few releases, and we&amp;#x27;re adding a new one in 3.2. Now when you hover over the suggested color, we&amp;#x27;ll update the element with that color so you can immediatelly see how the suggested color will work in your design.&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-3-2/contrastupdate.mp4&quot; class=&quot;imgshadow&quot; controls=&quot;&quot;&gt;&lt;/video&gt;&lt;h3 id=&quot;reload-css&quot;&gt;Reload CSS&lt;/h3&gt;&lt;p&gt;Polypane&amp;#x27;s live reloading is a super powerful and low-effort way to get live and hot reloading set up regardless of which web server you use. It will update CSS and images in place for you with zero configuration. But sometimes you don&amp;#x27;t need live reloading, you just want to edit a single CSS file and see the changes.&lt;/p&gt;&lt;p&gt;With our new reload css function, you can press &lt;kbd&gt;alt + R&lt;/kbd&gt; or right-click the reload button and Polypane will reload just the CSS without refresing the page. It&amp;#x27;s a small feature but should be helpful!&lt;/p&gt;&lt;h3 id=&quot;random-pane-sizes-changes&quot;&gt;Random pane sizes changes&lt;/h3&gt;&lt;p&gt;For a long time Polypane had the &lt;kbd&gt;Shift cmd n&lt;/kbd&gt; shortcut. In the focus layout, it would resize the pane to random dimensions and in horizontal and vertical layouts it would add a new pane with random dimensions&lt;/p&gt;&lt;p&gt;We&amp;#x27;ve now updated the shortcut to resize all visible panes, regardless of layout. This is a great way to stress-test your responsive design and find screen sizes you might have overlooked. &lt;em&gt;It&amp;#x27;s also a lot of fun!&lt;/em&gt;&lt;/p&gt;&lt;h3 id=&quot;https-viewer&quot;&gt;HTTP(S) Viewer&lt;/h3&gt;&lt;p&gt;Polypane now announces itself to the operating system as a HTML file viewer that supports HTTP and HTTPS. This means it will show up in lists of browsers that various tools might show you.&lt;/p&gt;&lt;p&gt;Two such tools, &lt;a href=&quot;https://tumult.com/whisk/&quot;&gt;Whisk&lt;/a&gt; and &lt;a href=&quot;https://tumult.com/hype/&quot;&gt;Hype&lt;/a&gt;, both by the awesome folks at &lt;a href=&quot;https://tumult.com/&quot;&gt;Tumult&lt;/a&gt;, have added us to the whitelist in their tools so opening anything from them in Polypane is now super easy. Check out this video by Hype to show you how it works together with Polypane: &lt;a href=&quot;https://blog.tumult.com/2020/06/15/preview-all-your-responsive-layouts-at-once-with-hypes-new-polypane-integration/&quot;&gt;Hype and Polypane&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;If you use an app and would like it to support Polypane, let us know and we&amp;#x27;ll reach out to them.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;ui-updates&quot;&gt;UI updates&lt;/h3&gt;&lt;p&gt;We have a few smaller UI changes and improvements that will make using Polypane a little easier. This is part of an ongoing process to make the Polypane UI more friendly.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Polypane now starts about 1 second faster, and interactions between different panels are now about 300ms faster.&lt;/li&gt;&lt;li&gt;The scroll sync icon in the header now shows a &amp;quot;&lt;svg id=&quot;i-close&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;10&quot; height=&quot;10&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;16%&quot;&gt;&lt;path d=&quot;M2 30 L30 2 M30 30 L2 2&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&amp;quot; if it&amp;#x27;s disabled.&lt;/li&gt;&lt;li&gt;You can now permanently disable the cache across browser sessions.&lt;/li&gt;&lt;li&gt;We give a warning for pages that have CSRF tokens or SSO login. Logging in on those pages only works in the side panel or when isolated panes are on.&lt;/li&gt;&lt;li&gt;Documentation from the help menu is now opened in the side pane for easy access.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;full-changelog&quot;&gt;Full changelog&lt;/h2&gt;&lt;p&gt;There&amp;#x27;s more new features, improvements and fixes in this release so read through the full changelog below. All new features are fully documented in our &lt;a href=&quot;/docs/&quot;&gt;docs&lt;/a&gt; too.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Accessibility panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Real viewport sizes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Reload CSS option&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Elements panel: new element tooltip&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Elements panel: visibility toggle&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Elements panel: toggle box model visibility&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Color contrast previews new color on hover&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Right-click options for reload&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Polypane now registers as http/https protocol viewer to support Tumult Whisk and other tools&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Random size shortcut&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Preact devtools&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Overlays to warn for pages with CRSF or SSO&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Simplified getting started page&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Startup speed improved by ~1s&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Meta panel now warns for &lt;code class=&quot;language-text&quot;&gt;user-scalable=no&lt;/code&gt; in viewport&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Shows line-height in overview&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements panel: Long list of classes are now scrollable&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;window.__polypane&lt;/code&gt; object now also has the zoom value&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Overlays popover has a &amp;quot;clear overlay&amp;quot; button at the top&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; All overlays now have additional information&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Disable cache can now be set to permanent in the menu&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Scroll sync icon now has a &amp;quot;&lt;svg id=&quot;i-close&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;10&quot; height=&quot;10&quot; fill=&quot;none&quot; stroke=&quot;currentcolor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;16%&quot;&gt;&lt;path d=&quot;M2 30 L30 2 M30 30 L2 2&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&amp;quot; when it&amp;#x27;s off&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Elements &amp;amp; Live CSS panels: selecting an element no longer triggers a click&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Modes have been renamed to Layouts&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Vertical layout has less horizontal padding&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; LiveCSS uses the same selection mechanism as Elements panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Documentation and help is now opened in the side browser&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Click handling performance improvements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; Faster style detection&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved&lt;/strong&gt; First launch has zoomed out panes so more are visible&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Emulation is now re-applied when devtools are opened&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Workaround for stale devtools after opening a pane&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Panes in Vertical layout no longer overlap when they are higher than the viewport&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Editing attributes with a textnode selected now edit the element&amp;#x27;s attributes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Side panels should no longer disappear&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Polypane can no longer get into a reloading loop&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Workspace import menu is cleared after importing&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Hide menu bar is now removed on Linux&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;getting-polypane-32&quot;&gt;Getting Polypane 3.2&lt;/h2&gt;&lt;p&gt;Polypane will automatically update on Mac and Windows. Linux users need to download the new version from
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; and if you&amp;#x27;re on Mac and Windows but don&amp;#x27;t want to wait on the update popup, you can find
your download there as well.&lt;/p&gt;&lt;p&gt;If you don&amp;#x27;t have Polypane yet there is a free 14 day trial available. &lt;a href=&quot;/pricing/&quot;&gt;Get it here&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[The complete guide to CSS media queries]]></title><description><![CDATA[Media queries are what make modern responsive design possible. With them you can set different styling based on things like a users screen…]]></description><link>https://polypane.app/blog/the-complete-guide-to-css-media-queries/</link><guid isPermaLink="false">https://polypane.app/blog/the-complete-guide-to-css-media-queries/</guid><pubDate>Tue, 02 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Media queries are what make modern responsive design possible. With them you can set different styling based on things like a users screen size, device capabilities or user preferences. But how do they work, which ones are there and which ones should you use? Here&amp;#x27;s &lt;strong&gt;the complete guide to media queries.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;What this guide will go through:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;#what-are-media-queries&quot;&gt;What are media queries?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#how-a-media-query-is-structured&quot;&gt;How a media query is structured&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#media-types&quot;&gt;Media types&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#using-media-queries&quot;&gt;Using media queries&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#using-media-query-features&quot;&gt;Using media query features&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#upcoming-media-query-features&quot;&gt;Upcoming media queries&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#new-notations-in-media-query-levels-4-and-5&quot;&gt;New notations in Media query levels 4 and 5&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#deprecated-media-queries&quot;&gt;Deprecated media queries&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#using-media-queries-in-javascript&quot;&gt;Using Media Queries in JavaScript&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;blog-img-container&quot;&gt;&lt;img src=&quot;/blogs/complete/_digital_content_isometric.svg&quot; alt=&quot;&quot;/&gt;&lt;/div&gt;&lt;h2 id=&quot;what-are-media-queries&quot;&gt;What are media queries?&lt;/h2&gt;&lt;p&gt;What is a media query? A media query is a specific feature of CSS that lets you conditionally apply styling based on a
media type, a media feature or both. You use them primarily to check the screen dimensions and apply CSS based on that,
but media queries can do many other powerful things.&lt;/p&gt;&lt;h2 id=&quot;how-a-media-query-is-structured&quot;&gt;How a media query is structured&lt;/h2&gt;&lt;p&gt;Here&amp;#x27;s the general structure of a media query:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &amp;lt;media-type&amp;gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;media feature&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/*...*/&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It begins with the &lt;code class=&quot;language-text&quot;&gt;@media&lt;/code&gt; keyword, also called an &amp;quot;at-rule&amp;quot;, optionally followed by a &lt;a href=&quot;#media-types&quot;&gt;media type&lt;/a&gt; and zero or more &lt;a href=&quot;#using-media-query-features&quot;&gt;media features&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;A real example of a media query is:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; screen &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 400px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/*...*/&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In English, what this says is this: &amp;quot;if the site is being shown on a screen and that screen&amp;#x27;s width is at least 400px wide, apply this CSS&amp;quot;.&lt;/p&gt;&lt;p&gt;Both the media type and the media feature are optional, so this is a valid media rule:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; print&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/*...*/&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And this is a valid media query too:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 400px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/*...*/&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you leave out the media type, it will be seen as the media type &lt;code class=&quot;language-text&quot;&gt;all&lt;/code&gt;, which is usually fine.&lt;/p&gt;&lt;h3 id=&quot;logical-operators&quot;&gt;Logical operators&lt;/h3&gt;&lt;p&gt;Next to media type and media features, we also have a few &amp;quot;logical operators&amp;quot; that go inbetween those parts: &lt;code class=&quot;language-text&quot;&gt;and&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;or&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;not&lt;/code&gt;. Here&amp;#x27;s how those work:&lt;/p&gt;&lt;h4 id=&quot;the-and-operator&quot;&gt;The &lt;code class=&quot;language-text&quot;&gt;and&lt;/code&gt; operator&lt;/h4&gt;&lt;p&gt;You can use the &amp;quot;and&amp;quot; operator not just between a type and a feature, but you can also use it to &amp;quot;chain&amp;quot; multiple media features using &lt;code class=&quot;language-text&quot;&gt;and&lt;/code&gt;, like so:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 400px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 800px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/*...*/&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Which tells a browser to apply this CSS if the browser width is between 400 and 800 pixels.&lt;/p&gt;&lt;h4 id=&quot;the-or-operator--a-comma&quot;&gt;The or operator: &lt;code class=&quot;language-text&quot;&gt;,&lt;/code&gt; (a comma)&lt;/h4&gt;&lt;p&gt;You can use a comma to do &amp;quot;or&amp;quot;, like so:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; screen&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; print&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/*...*/&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;which applies to screen &lt;em&gt;or&lt;/em&gt; print. Each comma separated line is its own media query and as soon as one of them evaluates to true, the CSS in the media query is applied. In the future you&amp;#x27;ll also be able to &lt;a href=&quot;#or-keyword&quot;&gt;use &lt;code class=&quot;language-text&quot;&gt;or&lt;/code&gt; instead of a comma&lt;/a&gt;.&lt;/p&gt;&lt;h4 id=&quot;the-not-operator&quot;&gt;The &lt;code class=&quot;language-text&quot;&gt;not&lt;/code&gt; operator&lt;/h4&gt;&lt;p&gt;Lastly, there is &lt;code class=&quot;language-text&quot;&gt;not&lt;/code&gt;, which can be used to negate an &lt;em&gt;entire&lt;/em&gt; media query. So the following query will be applied everywhere except print:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; print&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/*...*/&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you use the &lt;code class=&quot;language-text&quot;&gt;not&lt;/code&gt; operator you &lt;em&gt;must&lt;/em&gt; set a media type (like screen or print) as well. If you don&amp;#x27;t, the media type will be &lt;code class=&quot;language-text&quot;&gt;all&lt;/code&gt;, and then your media query will read &amp;quot;not all&amp;quot; so it won&amp;#x27;t get applied anywhere.&lt;/p&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;not&lt;/code&gt; inverts the &lt;em&gt;entire&lt;/em&gt; media query. Scroll down to &lt;a href=&quot;#not-function&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;not()&lt;/code&gt; notation&lt;/a&gt; for an upcoming feature that will allow you to negate just a part of a media query.&lt;/p&gt;&lt;p&gt;&lt;em&gt;There&amp;#x27;s also the &lt;code class=&quot;language-text&quot;&gt;only&lt;/code&gt; logical operator, but in modern browsers you don&amp;#x27;t need to use this, so we&amp;#x27;ll pretend it doesn&amp;#x27;t exist.&lt;/em&gt;&lt;/p&gt;&lt;h3 id=&quot;nesting&quot;&gt;Nesting&lt;/h3&gt;&lt;p&gt;You can nest media queries in other media queries and that will work fine! So instead of&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 400px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 800px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/*...*/&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;you can also write&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 400px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 800px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/*...*/&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In this example it might not be so useful, but you could wrap your entire CSS in an &lt;code class=&quot;language-text&quot;&gt;@media screen {}&lt;/code&gt; and do your responsive design with nested media queries, and then have a fully custom print stylesheet. With this, that&amp;#x27;ll look a little cleaner.&lt;/p&gt;&lt;h3 id=&quot;imports&quot;&gt;Imports&lt;/h3&gt;&lt;p&gt;You can optionally append one or more comma-separated media queries to the import statement to conditionally import the file, for example like so:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;print.css&amp;#x27;&lt;/span&gt; print&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;dark.css&amp;#x27;&lt;/span&gt; screen &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-color-scheme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; dark&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If a media query does not match, the CSS won&amp;#x27;t be applied, but the file will still be downloaded.&lt;/p&gt;&lt;h3 id=&quot;media-query-in-html&quot;&gt;Media query in HTML&lt;/h3&gt;&lt;p&gt;You can also use a media query in your HTML, for example in a &lt;code class=&quot;language-text&quot;&gt;&amp;lt;style&amp;gt;&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;&amp;lt;link&amp;gt;&lt;/code&gt; tag, like so:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;style.css&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;media&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;screen and (min-width: 400px)&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;style&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;media&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;print&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token style&quot;&gt;&lt;span class=&quot;token language-css&quot;&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* ... */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It&amp;#x27;s worth noting that any linked files will still be downloaded by your browser even if they doesn&amp;#x27;t apply.&lt;/p&gt;&lt;p&gt;You can also use media queries to control which responsive image to load using the &lt;code class=&quot;language-text&quot;&gt;img&lt;/code&gt; element with a &lt;code class=&quot;language-text&quot;&gt;sizes&lt;/code&gt; attribute, or a &lt;code class=&quot;language-text&quot;&gt;picture&lt;/code&gt; element with different &lt;code class=&quot;language-text&quot;&gt;source&lt;/code&gt; elements that each have a &lt;code class=&quot;language-text&quot;&gt;media&lt;/code&gt; attribute, but since that&amp;#x27;s a large topic and does not concern CSS, we&amp;#x27;ll leave that for another guide.&lt;/p&gt;&lt;div class=&quot;blog-img-container&quot;&gt;&lt;img src=&quot;/blogs/complete/ui_design__isometric.svg&quot; alt=&quot;&quot;/&gt;&lt;/div&gt;&lt;h2 id=&quot;media-types&quot;&gt;Media types&lt;/h2&gt;&lt;p&gt;The media type is used to describe the type of device that a browser is running on. There used to be loads, but the level 4 specification deprecated a whole lot that were never implemented anyway, leaving us with 3 we should care about:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;all&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;screen&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;print&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;all&quot;&gt;All&lt;/h3&gt;&lt;p&gt;As mentioned earlier, if you don&amp;#x27;t specify a media type, it will default to &amp;quot;all&amp;quot;, which means the css will apply to all devices.&lt;/p&gt;&lt;h3 id=&quot;screen&quot;&gt;Screen&lt;/h3&gt;&lt;p&gt;Probably what you&amp;#x27;re reading this article on now!&lt;/p&gt;&lt;h3 id=&quot;print&quot;&gt;Print&lt;/h3&gt;&lt;p&gt;For when you print a page, or any &amp;quot;paged&amp;quot; media (Like a book! Did you know people use HTML and CSS to mark up books?)&lt;/p&gt;&lt;img src=&quot;/blogs/complete/print.jpg&quot; alt=&quot;&quot; async=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;width:500px&quot;/&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Did you know&lt;/strong&gt; you can easily switch between screen and print stylesheets in Polypane with our emulation features?&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;So just for completeness, here&amp;#x27;s all the other ones that you never got to use, and probably never will:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;aural&lt;/code&gt; (which was replaced by &lt;code class=&quot;language-text&quot;&gt;speech&lt;/code&gt;),&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;speech&lt;/code&gt; (...also deprecated. Originally for use with speech synthesizers, like screen readers. Never implemented in browsers.)&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;tty&lt;/code&gt; (for the terminal),&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;tv&lt;/code&gt; (... like a screen, but different...somehow?),&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;projection&lt;/code&gt; (projectors),&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;handheld&lt;/code&gt; (for phones, they were actually used for a while before media expressions were a thing),&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;braille&lt;/code&gt; (for braille devices) and&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;embossed&lt;/code&gt; (like a combination of print and braille, so for printed braille).&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;blog-img-container&quot;&gt;&lt;img src=&quot;/blogs/complete/code_development__isometric.svg&quot; alt=&quot;&quot;/&gt;&lt;/div&gt;&lt;h2 id=&quot;using-media-queries&quot;&gt;Using media queries&lt;/h2&gt;&lt;p&gt;When using media queries it&amp;#x27;s good to give yourself a few rules, so you don&amp;#x27;t randomly add media queries and end up with CSS that behaves unpredictably and is hard to maintain.&lt;/p&gt;&lt;p&gt;When starting fresh, I recommend to write CSS from narrow (mobile) to wide (desktop) and then only using &lt;code class=&quot;language-text&quot;&gt;min-width&lt;/code&gt; for your styling. That way you&amp;#x27;re always designing &amp;quot;up&amp;quot; and your CSS remains easy to reason about: All the CSS you write will be &lt;em&gt;additive&lt;/em&gt; compared to the base styling. Your original CSS might place things in a column:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;main&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; flex&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;flex-direction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; column&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and when you get wide enough to show two columns, you switch to horizontal:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 40rem&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;main&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;flex-direction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; row&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Because the &lt;code class=&quot;language-text&quot;&gt;main&lt;/code&gt; element already has &lt;code class=&quot;language-text&quot;&gt;display: flex;&lt;/code&gt;, all we needed to do at the wider breakpoint is change the &lt;code class=&quot;language-text&quot;&gt;flex-direction&lt;/code&gt;. We prevent code duplication and everything is more readable and faster to download.&lt;/p&gt;&lt;p&gt;We can extend this reasoning to all the media features described below. Write your CSS for the starting point: the most well-supported, the smallest or the most accessible version. Then progressively add more styling using media queries.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;For more in-depth tips on how to develop a responsive website, read our article &lt;a href=&quot;/blog/responsive-design-ground-rules/&quot;&gt;Responsive design ground rules&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;div class=&quot;blog-img-container&quot;&gt;&lt;img src=&quot;/blogs/complete/coding__isometric.svg&quot; alt=&quot;&quot;/&gt;&lt;/div&gt;&lt;h2 id=&quot;using-media-query-features&quot;&gt;Using media query features&lt;/h2&gt;&lt;p&gt;Media query feature make up the main part of a media query and have the most influence on what you&amp;#x27;re designing. Media feature do &lt;em&gt;a lot&lt;/em&gt;. They let you check for device and browser capabilities, settings and user preferences beyond just the type of device.&lt;/p&gt;&lt;h3 id=&quot;dimensions&quot;&gt;Dimensions&lt;/h3&gt;&lt;p&gt;By far the most used media features are related to browser dimensions. Here are they:&lt;/p&gt;&lt;h4 id=&quot;width-and-height&quot;&gt;Width and Height&lt;/h4&gt;&lt;p&gt;You can check for exact &lt;code class=&quot;language-text&quot;&gt;width&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;min-width&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;max-width&lt;/code&gt;, and exact &lt;code class=&quot;language-text&quot;&gt;height&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;min-height&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;max-height&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;width&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;height&lt;/code&gt; you&amp;#x27;ll probably never want to use, they only apply at that exact width.&lt;/p&gt;&lt;p&gt;More useful are the &lt;code class=&quot;language-text&quot;&gt;min-*&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;max-*&lt;/code&gt; values, which let you write CSS for screens starting at a certain size and larger (using &lt;code class=&quot;language-text&quot;&gt;min-*&lt;/code&gt;), or up to a certain size (using &lt;code class=&quot;language-text&quot;&gt;max-*&lt;/code&gt;).&lt;/p&gt;&lt;p&gt;All the width and height media features support the regular CSS units like pixels and ems. &lt;strong&gt;It&amp;#x27;s recommended to use the &lt;code class=&quot;language-text&quot;&gt;em&lt;/code&gt; unit for media queries, so it scales nicely when people zoom in their browser&lt;/strong&gt;. This won&amp;#x27;t happen with pixels, and &lt;code class=&quot;language-text&quot;&gt;rem&lt;/code&gt; is the same size as an &lt;code class=&quot;language-text&quot;&gt;em&lt;/code&gt; when it&amp;#x27;s used in media queries. &lt;code class=&quot;language-text&quot;&gt;rem&lt;/code&gt; also has some bugs in Safari. So, &lt;code class=&quot;language-text&quot;&gt;em&lt;/code&gt;&amp;#x27;s are best.&lt;/p&gt;&lt;p&gt;If you think sizing in &lt;code class=&quot;language-text&quot;&gt;em&lt;/code&gt;s is hard because you don&amp;#x27;t know how large an &lt;code class=&quot;language-text&quot;&gt;em&lt;/code&gt; is: media queries are handled at the top level, so 1 em is always 16 pixels or what the browser set as the default font size (and so are rems).&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Did you know&lt;/strong&gt; Polypane automatically detects the width and height media queries in a site and creates panes for them? That way, you&amp;#x27;re always building sites to your own specifications. It also supports sizing panes in ems so you don&amp;#x27;t even have to calculate between pixels and ems!&lt;/p&gt;&lt;/blockquote&gt;&lt;h4 id=&quot;aspect-ratio&quot;&gt;Aspect ratio&lt;/h4&gt;&lt;p&gt;You can also test for the &lt;em&gt;relation&lt;/em&gt; between width and height, with the &lt;code class=&quot;language-text&quot;&gt;aspect-ratio&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;orientation&lt;/code&gt; media features.&lt;/p&gt;&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;aspect-ratio&lt;/code&gt; media feature takes a fraction, and also has the more useful &lt;code class=&quot;language-text&quot;&gt;min-aspect-ratio&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;max-aspect-ratio&lt;/code&gt; media features. It will lets you check if a browser has a certain ratio between width and height. The way to think about it is: the first number represents the width, the second number represents the height. This means an aspect ratio of 2/1 is twice as wide as it is high.&lt;/p&gt;&lt;p&gt;You can test for (only) square screens:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;aspect-ratio&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1/1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/*...*/&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or check for screens that are 16 by 9:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;aspect-ratio&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 16/9&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/*...*/&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Like width and height, you&amp;#x27;d usually use the &lt;code class=&quot;language-text&quot;&gt;min-*&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;max-*&lt;/code&gt;variants. With a certain aspect ratio you can decide to show images in a portrait or landscape mode, for example.&lt;/p&gt;&lt;p&gt;With &lt;code class=&quot;language-text&quot;&gt;min-aspect-ratio&lt;/code&gt;, you can check for screens that are wider than they are high:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-aspect-ratio&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1/1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/*...*/&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Conversely, by using to &lt;code class=&quot;language-text&quot;&gt;max-aspect-ratio: 1/1&lt;/code&gt;, you switch that around to only screens that are higher than they are wide.&lt;/p&gt;&lt;p&gt;Instead of doing that though, you can also just use &lt;code class=&quot;language-text&quot;&gt;orientation: landscape&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;orientation: portrait&lt;/code&gt;, which mean the same thing and are a little clearer.&lt;/p&gt;&lt;h3 id=&quot;prefers-color-scheme&quot;&gt;Prefers-color-scheme&lt;/h3&gt;&lt;p&gt;With &lt;code class=&quot;language-text&quot;&gt;prefers-color-scheme&lt;/code&gt; you can check if a user prefers to see a dark mode or light mode version of your website.&lt;/p&gt;&lt;p&gt;Some users might prefer dark mode because it&amp;#x27;s easier on their eyes, because their environment is dark or because they&amp;#x27;re sensitive to bright lights. Conversely, users might prefer your light mode for the usually increased contrast or because they visit your site in a bright space.&lt;/p&gt;&lt;p&gt;Here&amp;#x27;s how to test for both:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-color-scheme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; dark&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* wants dark mode */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-color-scheme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; light&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* wants light mode */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Between, these, &lt;code class=&quot;language-text&quot;&gt;light&lt;/code&gt; is considered to be the default. So much so, that a third option &lt;code class=&quot;language-text&quot;&gt;no-preference&lt;/code&gt; was recently removed from the specifications due to lack of implementations.&lt;/p&gt;&lt;img src=&quot;/blogs/complete/darkmodeemulation.png&quot; alt=&quot;&quot; async=&quot;&quot; class=&quot;imgshadow&quot; style=&quot;width:500px&quot;/&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Did you know&lt;/strong&gt; Polypane&amp;#x27;s emulation mode makes it really easy to test both a dark and light theme side-by-side.&lt;/p&gt;&lt;/blockquote&gt;&lt;h4 id=&quot;implementing-a-dark-mode&quot;&gt;Implementing a dark mode&lt;/h4&gt;&lt;p&gt;If you already have a website and want to add dark mode, the neatest way to go about it is to redesign each part. This will give you the most control and highest quality implementation.&lt;/p&gt;&lt;p&gt;For many sites, it might be hard to go through all parts of a site, or there&amp;#x27;s no time or budget available. For those sites, there&amp;#x27;s a thing I like to call &amp;quot;cheap dark mode&amp;quot;, and it looks like this:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-color-scheme&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; dark&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;:root&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #111&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;invert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;hue-rotate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;180deg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;img,
  video&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;invert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;hue-rotate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;180deg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here&amp;#x27;s how it works: First we set a dark background on the &lt;code class=&quot;language-text&quot;&gt;:root&lt;/code&gt;, which is basically the &lt;code class=&quot;language-text&quot;&gt;html&lt;/code&gt; element. This doesn&amp;#x27;t have to be #111 (very dark gray), it can also be pure black (#000) or you can add a little color to it. That all depends on your brand and design, so pick one that works for you.&lt;/p&gt;&lt;p&gt;The next line is where the magic happens. With &lt;code class=&quot;language-text&quot;&gt;filter&lt;/code&gt; we can &lt;code class=&quot;language-text&quot;&gt;invert&lt;/code&gt; all the colors. This will make light dark and dark light. It won&amp;#x27;t affect the background which is why we defined that ourselves.&lt;/p&gt;&lt;p&gt;Invert also has another effect though, it also inverts colors. So blue will become orange, green becomes pink and so on. That&amp;#x27;s not great, because it means you just lost your brand colors. Fear not though, we can get them back by rotating the hue back to the original colors with &lt;code class=&quot;language-text&quot;&gt;hue-rotate(180deg)&lt;/code&gt;, undoing the invert specifically for the &lt;em&gt;hue&lt;/em&gt; of your colors.&lt;/p&gt;&lt;p&gt;At this point, all images and videos on your site look super weird, so what we need to do there is double-apply the invert and hue-rotate, turning both back to their original colors. Now you have a site in dark mode, where all images and videos are shown as they are. Not bad for just a few lines of CSS!&lt;/p&gt;&lt;h3 id=&quot;prefers-reduced-motion&quot;&gt;Prefers-reduced-motion&lt;/h3&gt;&lt;p&gt;With &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-motion&lt;/code&gt;, users can indicate they want to see less stuff happening on screen. The reason they want to do this can be things like motion sickness, vestibular disorders or they just plainly don&amp;#x27;t want to wait for your nice animations to finish.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-reduced-motion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; reduce&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* wants reduced motion */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-reduced-motion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no-preference&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* doesn&amp;#x27;t want reduced motion */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If a users has prefers-reduced-motion turned on it doesn&amp;#x27;t mean they want &lt;strong&gt;no&lt;/strong&gt; motion, but you have to be mindful: use motion only where it helps understanding and if you do, keep the motion small (so &lt;em&gt;fade&lt;/em&gt; instead of &lt;em&gt;swoosh&lt;/em&gt;). Otherwise just turn them off. And for video&amp;#x27;s, &lt;a href=&quot;#using-media-queries-in-javascript&quot;&gt;make sure you don&amp;#x27;t auto-play them&lt;/a&gt;.&lt;/p&gt;&lt;h4 id=&quot;implementing-reduced-motion&quot;&gt;Implementing reduced motion&lt;/h4&gt;&lt;p&gt;If you&amp;#x27;re starting a new project and want to incorporate support for reduced motion it&amp;#x27;s a good idea to consider motion an enhancement: have no or little motion as the default, and only when &lt;code class=&quot;language-text&quot;&gt;refers-reduced-motion: no-preference&lt;/code&gt; is set, add additional motion to your website. That way, the default experience is the more accessible one.&lt;/p&gt;&lt;p&gt;For an existing site, this might be a lot of work, so we also have a cheap reduced motion script:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-reduced-motion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; reduce&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;::root&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;view-transition-name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;body *,
  body *::before,
  body *::after&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;animation-delay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; -1ms &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;animation-duration&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1ms &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;animation-iteration-count&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1 &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;transition-duration&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1ms &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;transition-delay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; -1ms &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;scroll-behavior&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;background-attachment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; initial &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;view-transition-name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none &lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will turn off all animation for all elements so it&amp;#x27;s as relatively blunt method, but it&amp;#x27;s perfect to retroactively add to a site to make it more accessible. The animation is set to &lt;code class=&quot;language-text&quot;&gt;1ms&lt;/code&gt; so the &lt;code class=&quot;language-text&quot;&gt;animationend&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;transitionend&lt;/code&gt; events are still fired because your javascript might depend on them, but with the negative delay you won&amp;#x27;t notice the difference.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Did you know&lt;/strong&gt; Polypane makes it really easy to test your prefers-reduced-motion implementation side-by-side with a regular pane.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;prefers-contrast&quot;&gt;Prefers-contrast&lt;/h3&gt;&lt;p&gt;Prefers contrast indicates whether a users prefers more or less contrast in their interface. For example visual impairments can make it difficult to make out details or subtle differences in color so people that have that will prefer higher contrast. On the other hand, other people might be sensitive to harsh high contrast and prefer colors to be closer to each other.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-contrast&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; more&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-contrast&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no-preference&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-contrast&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; less&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-contrast&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; custom&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;prefers-contrast: custom&lt;/code&gt; is an odd one out. If you dont prefer &lt;code class=&quot;language-text&quot;&gt;more&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;less&lt;/code&gt; or the same (&lt;code class=&quot;language-text&quot;&gt;no-preference&lt;/code&gt;) contrast, why does this exist? The &lt;code class=&quot;language-text&quot;&gt;custom&lt;/code&gt; value will match when &lt;code class=&quot;language-text&quot;&gt;forced-colors&lt;/code&gt; is active but the user doesn&amp;#x27;t have a high or low constrast theme selected, but something in the middle. This way, &lt;code class=&quot;language-text&quot;&gt;@media (prefers-contrast)&lt;/code&gt; without a value will still match and that will let you re-use the media query to reduce visual complexity.&lt;/p&gt;&lt;p&gt;The &amp;quot;increase contrast&amp;quot; option in the macOS accessibility menu will trigger &lt;code class=&quot;language-text&quot;&gt;prefers-contrast: more&lt;/code&gt;:&lt;/p&gt;&lt;img alt=&quot;The macOS settings with increase contrast turned on&quot; src=&quot;/blogs/forcedcolors/prefers-contrast.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;When you turn it on, your entire operating system also switches to an increased contrast mode which you can use for inspiration on your site. As you can see from the screenshot, macOS doesn&amp;#x27;t turn everything full black on full white (though it does bump up the text contrast), but instead it increases the contrast between sections, by adding clear borders instead of soft shadows and suble background tints.&lt;/p&gt;&lt;p&gt;On Windows, &lt;code class=&quot;language-text&quot;&gt;prefers-contrast&lt;/code&gt; is turned on when you turn on &lt;a href=&quot;#forced-colors-support-in-chromium-browsers-and-firefox-available-for-testing-in-polypane&quot;&gt;forced-colors&lt;/a&gt; and will match &lt;code class=&quot;language-text&quot;&gt;more&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;less&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;custom&lt;/code&gt; depending on the contrast ratio between the background and default text color.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Did you know&lt;/strong&gt; Polypane makes it really easy to test your prefers-contrast ands forced-colors implementation side-by-side with regular panes.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;color-gamut&quot;&gt;Color-gamut&lt;/h3&gt;&lt;p&gt;Colors on the web so far have been limited to just the sRGB color gamut, but modern screens are able to display much more colors, like the p3 color space. With the &lt;code class=&quot;language-text&quot;&gt;color-gamut&lt;/code&gt; you can test if a device has such a wider color space.&lt;/p&gt;&lt;p&gt;There are three potential options, and if it supports the larger color space, it automatically includes support for the smaller color space.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;srgb&lt;/code&gt; This is the one we all know :)&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;p3&lt;/code&gt; This is what for example modern iPhones use, often called &amp;quot;wide gamut&amp;quot;&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;rec2020&lt;/code&gt;, this is the largest color space available right now, but you basically won&amp;#x27;t find this in the wild.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If a user has a display with a wider gamut, you can use images in that color space and they&amp;#x27;ll be more vibrant than ones in sRGB.&lt;/p&gt;&lt;p&gt;Not supported yet, but coming soon are new CSS notations you can use to describe colors in these wider color space (since this is not possible with &lt;code class=&quot;language-text&quot;&gt;rgb&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;hsl&lt;/code&gt; or hex, which are limited to sRGB).&lt;/p&gt;&lt;p&gt;For these new colors, there are three new css functions: &lt;code class=&quot;language-text&quot;&gt;lab()&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;lch()&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;color()&lt;/code&gt;. For now, only Safari supports the &lt;code class=&quot;language-text&quot;&gt;color()&lt;/code&gt; function, and the other two are supported nowhere.&lt;/p&gt;&lt;p&gt;Lab and lch allow you to describe more precise colors than rgb and hsl, but with &lt;code class=&quot;language-text&quot;&gt;color()&lt;/code&gt; you can explicitly opt-in to a color gamut, like so:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* the reddest red that sRGB has */&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rgb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;255 0 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;color-gamut&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; p3&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;display-p3 1 0 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* The reddest red the display can show */&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;display-p3&lt;/code&gt; is the only value supported for now, and the three numbers are floating point numbers for the R, G and B channel.&lt;/p&gt;&lt;h3 id=&quot;display-mode&quot;&gt;Display-mode&lt;/h3&gt;&lt;p&gt;If you&amp;#x27;re designing a game or video player, you might have more than just the game/video on the page but when someone switches to fullscreen you only want to show the game/video. This media query lets you do that. &lt;code class=&quot;language-text&quot;&gt;display-mode&lt;/code&gt; is supported by all modern evergreen browsers, and will let you test for how your site is shown with four possible options:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;browser&lt;/code&gt; &lt;br/&gt;This is the default mode, where your page is shown in a regular browser window.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;fullscreen&lt;/code&gt; &lt;br/&gt;Your page is displayed full screen and there is no browser chrome visible. If there is no fullscreen media query defined, your browser will instead apply styles defined in a &lt;code class=&quot;language-text&quot;&gt;standalone&lt;/code&gt; media query.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;standalone&lt;/code&gt; &lt;br/&gt;The page is not shown fullscreen, but also doesn&amp;#x27;t have all of the regular browser chrome, Instead it looks like a standalone (desktop) application. If there is no &lt;code class=&quot;language-text&quot;&gt;standalone&lt;/code&gt; media query defined, your browser will instead apply styles defined in a &lt;code class=&quot;language-text&quot;&gt;minimal-ui&lt;/code&gt; media query.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;minimal-ui&lt;/code&gt; &lt;br/&gt;Your page is shown in its own window, but the browser will still show some chrome for controlling navigation (like popup windows). If there is no &lt;code class=&quot;language-text&quot;&gt;minimal-ui&lt;/code&gt; media query defined, your browser will instead apply styles defined in a &lt;code class=&quot;language-text&quot;&gt;browser&lt;/code&gt; media query.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;As you can see, most of these values fall back to the next one, so if you define a &lt;code class=&quot;language-text&quot;&gt;minimal-ui&lt;/code&gt; style, that will also be applied to &lt;code class=&quot;language-text&quot;&gt;standalone&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;fullscreen&lt;/code&gt;.&lt;/p&gt;&lt;h3 id=&quot;resolution-webkit-device-pixel-ratio&quot;&gt;Resolution/-webkit-device-pixel-ratio&lt;/h3&gt;&lt;p&gt;With the &lt;code class=&quot;language-text&quot;&gt;resolution&lt;/code&gt; media query you can test for a displays pixel density. There is &lt;code class=&quot;language-text&quot;&gt;resolution&lt;/code&gt;, which tests for a single specific pixel density and &lt;code class=&quot;language-text&quot;&gt;min-resolution&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;max-resolution&lt;/code&gt; which give a lower and upper bound.&lt;/p&gt;&lt;p&gt;You can use this to serve retina background images to displays that support it, for example.&lt;/p&gt;&lt;p&gt;Resolution takes a number with either a &lt;code class=&quot;language-text&quot;&gt;dpi&lt;/code&gt; (dots per inch), &lt;code class=&quot;language-text&quot;&gt;dpcm&lt;/code&gt; (dots per centimeter) or &lt;code class=&quot;language-text&quot;&gt;dppx&lt;/code&gt; (dots per pixel). In CSS, a pixel is always &lt;code class=&quot;language-text&quot;&gt;96dpi&lt;/code&gt;, so &lt;code class=&quot;language-text&quot;&gt;1dppx&lt;/code&gt; is a regular screen resolution, and &lt;code class=&quot;language-text&quot;&gt;2dppx&lt;/code&gt; is &amp;#x27;retina&amp;#x27;.&lt;/p&gt;&lt;p&gt;Instead of &lt;code class=&quot;language-text&quot;&gt;dppx&lt;/code&gt; you can also just use &lt;code class=&quot;language-text&quot;&gt;x&lt;/code&gt;, so your CSS could look like this:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-resolution&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* your regular background here */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-resolution&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* your retina background here */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Older versions of Safari (before TP Release 138) don&amp;#x27;t support the resolution media query. They have a similar feature called &lt;code class=&quot;language-text&quot;&gt;-webkit-device-pixel-ratio&lt;/code&gt; (as well as &lt;code class=&quot;language-text&quot;&gt;-webkit-min-device-pixel-ratio&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;-webkit-max-device-pixel-ratio&lt;/code&gt;), which accepts a number without a unit. The implied unit is the same as &lt;code class=&quot;language-text&quot;&gt;dppx&lt;/code&gt; though, so the following CSS has the same effect as the &lt;code class=&quot;language-text&quot;&gt;resolution&lt;/code&gt; sample above:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;-webkit-min-device-pixel-ratio&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* your regular background here */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;-webkit-min-device-pixel-ratio&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* your retina background here */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To improve support, all other modern browser also support the &lt;code class=&quot;language-text&quot;&gt;-webkit-device-pixel-ratio&lt;/code&gt; notation so between &lt;code class=&quot;language-text&quot;&gt;resolution&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;-webkit-device-pixel-ratio&lt;/code&gt;, you can safely use the latter for the widest support. Consider switching to &lt;code class=&quot;language-text&quot;&gt;resolution&lt;/code&gt; though, unless you also need to support older versions of Safari.&lt;/p&gt;&lt;h3 id=&quot;overflow&quot;&gt;Overflow&lt;/h3&gt;&lt;p&gt;Overflow can test how a device handles content that&amp;#x27;s larger than fits. It exists of two properties, &lt;code class=&quot;language-text&quot;&gt;overflow-block&lt;/code&gt;, for the block direction (usually top to bottom) and &lt;code class=&quot;language-text&quot;&gt;overflow-inline&lt;/code&gt; for the inline direction (usually left to right).&lt;/p&gt;&lt;p&gt;For &lt;code class=&quot;language-text&quot;&gt;overflow-block&lt;/code&gt; there are 4 potential values to check against:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;none&lt;/code&gt;, meaning that anything that overflows is simply not displayed&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;scroll&lt;/code&gt;, you can scroll to content that overflows&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;optional-paged&lt;/code&gt;, you can scroll but page breaks can be manually triggered&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;paged&lt;/code&gt;, content that overflows is shown on a next page.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;And &lt;code class=&quot;language-text&quot;&gt;overflow-inline&lt;/code&gt; only has two values:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;none&lt;/code&gt;, meaning that anything that overflows is simply not displayed&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;scroll&lt;/code&gt;, you can scroll to content that overflows&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;update&quot;&gt;Update&lt;/h3&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;update&lt;/code&gt; is used to detect how often the media type can update. Possible values are:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;none&lt;/code&gt;, meaning it can&amp;#x27;t update, like printed paper.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;slow&lt;/code&gt;, where updating is slow like on e-book readers or low power devices.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;fast&lt;/code&gt; where updating is not constraint by device capabilities, like regular screens.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;inverted-colors-safari-only&quot;&gt;Inverted colors (Safari only)&lt;/h3&gt;&lt;p&gt;This media query indicates that the operating system has inverted all colors. The operating system in this instance is MacOs, the only operating system that supports this (and conversely, only Safari supports this media query). It&amp;#x27;s either off or on:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;inverted-colors&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* colors are normal */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;inverted-colors&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inverted&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* colors are inverted */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You might think that you&amp;#x27;d use this to double-invert your images and videos like we did with our &lt;a href=&quot;#implementing-a-dark-mode&quot;&gt;cheap dark mode&lt;/a&gt;, but Safari already does this for you. You can however, still hue shift your entire site to make sure your brand colors are followed.&lt;/p&gt;&lt;div class=&quot;blog-img-container&quot;&gt;&lt;img src=&quot;/blogs/complete/gaming__isometric.svg&quot; alt=&quot;&quot;/&gt;&lt;/div&gt;&lt;h3 id=&quot;dynamic-range&quot;&gt;Dynamic-range&lt;/h3&gt;&lt;p&gt;Some displays can display &amp;quot;HDR&amp;quot;, or &amp;quot;high dynamic range&amp;quot;, characterized by large contrast, brightness and color depth. The specification gives two options: &lt;code class=&quot;language-text&quot;&gt;high&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;standard&lt;/code&gt;. If it&amp;#x27;s high, this means that you can use display-p3 colors (currently only supported in Safari) to provide more vibrant colors for your visitors. To test for support for specific color spaces, you can use the &lt;a href=&quot;#color-gamut-supported-in-chromium-browsers-and-safari-available-for-testing-in-polypane&quot;&gt;color-gamut media feature&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;interaction-pointer-and-hover&quot;&gt;Interaction: &lt;code class=&quot;language-text&quot;&gt;pointer&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;hover&lt;/code&gt;&lt;/h3&gt;&lt;p&gt;We have many more different input/pointing devices now compared to when the web got started. Mouse pointers still exist, but we also have touch, external controllers like Wii remotes and even things like AR hand detection.&lt;/p&gt;&lt;p&gt;Some things that are easy to do with a mouse are harder or impossible to do with touch devices, like hitting small targets or even hovering. With the interaction media features you can adapt to these devices in clever ways.&lt;/p&gt;&lt;p&gt;The way I would go about this is consider a touch device as the most minimal implementation. It won&amp;#x27;t have hover effects, and the precision of your input device is &lt;code class=&quot;language-text&quot;&gt;coarse&lt;/code&gt; (It&amp;#x27;s the size of your thumb).&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;hover&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;pointer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; coarse&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* you&amp;#x27;re on a touch-only device */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For this group, you can&amp;#x27;t have things popping up on hover so they need to be visible or behind an explicit toggle, and your tap targets will need to be larger.&lt;/p&gt;&lt;p&gt;But those devices could also have support for a stylus, still not allowing hover, but making it easier to point to specific parts on the screen. While it&amp;#x27;s a good idea to have large enough clickable targets even if pointer: fine, you can for example place them closer and make more efficient use of the space.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;hover&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;pointer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; fine&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* you&amp;#x27;re on a device without hover but with a stylus
     or other fine pointing device */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then as you start to get hover capabilities, you can add those with:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;hover&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hover&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;pointer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; coarse&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* you&amp;#x27;re on a device with hover but a coarse pointer*/&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Devices that allow for hovering but have a coarse pointer are things like Wii controllers and Kinect. They let you point at things but without great precision. You&amp;#x27;ll want large enough targets and you can add hover effects as an indication of where they&amp;#x27;re pointing.&lt;/p&gt;&lt;p&gt;Lastly, we end at what many will think of as &amp;quot;normal&amp;quot;, but is actually the most well-featured situation: a device with a mouse/trackpad.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;hover&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hover&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;pointer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; fine&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* you&amp;#x27;re on a device with a mouse or trackpad */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;These devices can hover over elements and precisely target them. Users of these devices might still have different capabilities (Not just permanent! They also might be tired, or have greasy fingers) so design accordingly.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Though iOS 13.4+ support these media features, it will always match &lt;code class=&quot;language-text&quot;&gt;pointer:coarse&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;hover:none&lt;/code&gt; (and their &lt;code class=&quot;language-text&quot;&gt;any-&lt;/code&gt; counterparts), even when using the new trackpad or the pencil.&lt;/p&gt;&lt;/blockquote&gt;&lt;h4 id=&quot;multiple-pointing-devices&quot;&gt;Multiple pointing devices&lt;/h4&gt;&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;pointer&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;hover&lt;/code&gt; media queries give you information about the &lt;em&gt;primary&lt;/em&gt; pointing device. But what about the touchscreen-with-stylus example where you have a coarse and a fine pointing device simultaneously? Even if the user has a stylus, the primary pointing device is still a touch screen, so coarse. For those situations you can use &lt;code class=&quot;language-text&quot;&gt;any-hover&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;any-pointer&lt;/code&gt;. This will test if &lt;em&gt;any&lt;/em&gt; pointing device exists that matches the criteria.&lt;/p&gt;&lt;h3 id=&quot;less-interesting-media-queries&quot;&gt;Less interesting media queries&lt;/h3&gt;&lt;p&gt;There are a few more media queries that are not as useful in daily usage but I didn&amp;#x27;t want to leave out.&lt;/p&gt;&lt;h4 id=&quot;color&quot;&gt;Color&lt;/h4&gt;&lt;p&gt;the &lt;code class=&quot;language-text&quot;&gt;color&lt;/code&gt; media query (and it&amp;#x27;s &lt;code class=&quot;language-text&quot;&gt;min-*&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;max-*&lt;/code&gt; variants) lets you detect if the screen your page is being shown on has &lt;em&gt;any&lt;/em&gt; color, and if so, how much:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* you&amp;#x27;re on a color screen */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can also give it a value which translates to the number of bits per color component, so for each of red, green and blue separately. Most modern screens have 8 bits per channel, but 10 bit screens and even 12 bit screens are becoming more common. The value is &lt;strong&gt;not&lt;/strong&gt; the total number of colors, but the bits per color, so don&amp;#x27;t confuse it with &amp;quot;8-bit color&amp;quot;, which is something different. 8 bits per color channel corresponds to a 24-bit color screen.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 8&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* you&amp;#x27;re on a &amp;quot;full&amp;quot; color screen */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&quot;monochrome&quot;&gt;Monochrome&lt;/h4&gt;&lt;p&gt;Somewhat the inverse, &lt;code class=&quot;language-text&quot;&gt;monochrome&lt;/code&gt; (and it&amp;#x27;s &lt;code class=&quot;language-text&quot;&gt;min-*&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;max-*&lt;/code&gt; variants) lets you detect if the screen is shown on a monochrome (like greyscale) media type. You can again use just the value to detect &lt;em&gt;a&lt;/em&gt; monochrome media type:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;monochrome&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* you&amp;#x27;re on a monochrome media type */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And like &lt;code class=&quot;language-text&quot;&gt;color&lt;/code&gt;, it also has an optional value that&amp;#x27;s the number of bits per pixel. If you test for &lt;code class=&quot;language-text&quot;&gt;monochrome: 0&lt;/code&gt;, that will check if the device is &lt;em&gt;not&lt;/em&gt; monochrome (so it has colors). &lt;code class=&quot;language-text&quot;&gt;monochrome: 1&lt;/code&gt; will detect a device with pixels that are either on or off (like e-paper).&lt;/p&gt;&lt;p&gt;An interesting use-case for monochrome is that you can use it to detect when a page is printed in color or in monochrome:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; print &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;monochrome&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* you&amp;#x27;re printing in color */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; print &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;monochrome&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* you&amp;#x27;re printing in monochrome */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&quot;grid&quot;&gt;Grid&lt;/h4&gt;&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;grid&lt;/code&gt; media query will let you detect when a page is shown in text-only terminals or basic phones with fixed fonts. It&amp;#x27;s value is either a 0 or a 1, and unlike &lt;code class=&quot;language-text&quot;&gt;color&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;monochrome&lt;/code&gt;, you need to explicitly add it:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;grid&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* shown on a regular screen */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;grid&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* shown on a grid device  */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;blog-img-container&quot;&gt;&lt;img src=&quot;/blogs/complete/wireframe_isometric.svg&quot; alt=&quot;&quot;/&gt;&lt;/div&gt;&lt;h2 id=&quot;upcoming-media-query-features&quot;&gt;Upcoming media query features&lt;/h2&gt;&lt;p&gt;While all the previous features have pretty good support across modern browsers, there are also many upcoming features that are only supported by a few browsers or that will hopefully be implemented soon.&lt;/p&gt;&lt;p&gt;Please note that some of these are still in a drafting phase, which means they might be changed or scrapped before becoming part of a specification. I&amp;#x27;ll try to keep this document updated!&lt;/p&gt;&lt;h3 id=&quot;prefers-reduced-data-no-support-available-for-testing-in-polypane&quot;&gt;Prefers-reduced-data &lt;em&gt;(no support)&lt;/em&gt; &lt;strong&gt;Available for testing in Polypane&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Not everyone is lucky enough to have fast, or reliable, or unlimited data plans. Browsers can send the &lt;code class=&quot;language-text&quot;&gt;Save-data: on&lt;/code&gt; header, and web servers can then choose to send smaller images and videos and disable any form of polling or preloading.
Even though turning on the sending of that header is hidden deep in settings (on mobile) or requires a third-party plugin (on desktop), a large number of people still end up use this header.&lt;/p&gt;&lt;p&gt;Unfortunately dealing with this on a web server level is often hard to do, either because you lack access, or the configuration requirements to make it work are just too complex. That&amp;#x27;s unfortunate because it&amp;#x27;s potentially very impactful.&lt;/p&gt;&lt;p&gt;Coming up is a &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data: reduce&lt;/code&gt; media query, which will let you target this situation in CSS. Though you can do less with that compared to a save-data header (which you could use to send an entirely different website, basically), you can still use it to prevent downloading unneeded fonts and background images, or to request smaller background images.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;You can emulate the &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt; media query in Polypane using the emulation panel&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;While we wait on this feature to land, we can already use JavaScript instead to detect the save data preference or a slow connection using the Network Information API:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; connection &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;connection &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mozConnection &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;webkitConnection &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;connection&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;saveData &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;slow-2g&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;2g&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;3g&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;connection&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;effectiveType&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* data-saving measures like not preloading videos */&lt;/span&gt;
  preloadVideo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The Network Information API is available in Chromium browsers and behind a flag in Firefox. It can tell if you &lt;code class=&quot;language-text&quot;&gt;saveData&lt;/code&gt; is on and gives you rough information on the type of connection. &lt;code class=&quot;language-text&quot;&gt;effectiveType&lt;/code&gt; takes into account not just the type (wifi, cellular etc) but also how long previous roundtrips to the server took and what the download speed is. There&amp;#x27;s &lt;code class=&quot;language-text&quot;&gt;slow-2g&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;2g&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;3g&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;4g&lt;/code&gt; as possible values.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;To learn more about how to design for &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt;, read our article &lt;a href=&quot;/blog/creating-websites-with-prefers-reduced-data/&quot;&gt;Creating websites with prefers-reduced-data&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;prefers-reduced-transparency-chromium-118-supported-behind-a-flag-in-firefox&quot;&gt;Prefers-reduced-transparency &lt;em&gt;(Chromium 118, Supported behind a flag in Firefox)&lt;/em&gt;&lt;/h3&gt;&lt;p&gt;User can use this to indicate they prefer to see things on solid colors, usually due to visual impairments making it hard to read text on, for example, background images. But it can also help people with for example dyslexia or concentration problems to read your content easier. Note it doesn&amp;#x27;t say &lt;em&gt;no-transparency&lt;/em&gt;.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-reduced-transparency&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; reduce&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;prefers-reduced-transparency&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no-preference&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;Wanting less transparency is not the same as wanting more contrast and should not be lumped together. &lt;code class=&quot;language-text&quot;&gt;prefers-contrast&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-transparency&lt;/code&gt; are there for different reasons and can be compensated differently for.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;forced-colors-support-in-chromium-browsers-and-firefox-available-for-testing-in-polypane&quot;&gt;Forced-colors &lt;em&gt;(Support in Chromium browsers and Firefox)&lt;/em&gt; &lt;strong&gt;Available for testing in Polypane&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Forced colors, or high contrast, will strip out all your background images if there&amp;#x27;s text over them and overwrite all your other colors, making everything uniform with the rest of the operating system. This helps people with visual impairments by making all text easier to read for them.&lt;/p&gt;&lt;img alt=&quot;The Polypane homepage shown side-by-side, with the right side showing the site in dark forced color mode.&quot; src=&quot;/blogs/forcedcolors/side-by-side.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;Those of you that have been doing web development for a bit longer might remember that we could style things with &amp;quot;system colors&amp;quot;. That&amp;#x27;s no longer possible due to security implications, but in the forced colors mode a subset of them are back:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;CanvasText&lt;/code&gt;: the color of text content.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;LinkText&lt;/code&gt;: the color of links.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;GrayText&lt;/code&gt;: the color of disabled content&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;HighlightText&lt;/code&gt;: the color of selected text.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Highlight&lt;/code&gt;: the background color of selected text.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;ButtonText&lt;/code&gt;: the color of a &amp;lt;button&amp;gt; element&amp;#x27;s text.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;ButtonFace&lt;/code&gt;: the color of a &amp;lt;button&amp;gt; element&amp;#x27;s background.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Canvas&lt;/code&gt;: controls the color of the background.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These color names are not here for you to pick and choose, high color mode already overwrite all your text, background, border and button colors. They&amp;#x27;re there for you to use on other elements (like icons) to make them fit the rest of the site.&lt;/p&gt;&lt;p&gt;Forced-colors has two possible values:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;forced-colors&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;forced-colors&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; active&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When &lt;code class=&quot;language-text&quot;&gt;forced-colors&lt;/code&gt; is active, &lt;a href=&quot;#prefers-color-scheme&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;prefers-color-scheme&lt;/code&gt;&lt;/a&gt; can be used to detect if there is white text on a black background, or black text on a white background.&lt;/p&gt;&lt;p&gt;On Windows, &lt;code class=&quot;language-text&quot;&gt;forced-colors&lt;/code&gt; will also activate &lt;a href=&quot;##prefers-contrast&quot;&gt;prefers-contrast&lt;/a&gt; with a value of more, less or custom depending on whether you have high, low or average contrast between the text and background colors.&lt;/p&gt;&lt;h4 id=&quot;overwriting-forced-colors&quot;&gt;Overwriting forced colors&lt;/h4&gt;&lt;p&gt;It&amp;#x27;s not always desirable for &lt;code class=&quot;language-text&quot;&gt;forced-colors&lt;/code&gt; to overwrite all the colors, for example in a color selector on an ecommerce website. To disable forced colors for specific elements you can use the css property &lt;code class=&quot;language-text&quot;&gt;forced-color-adjust: none;&lt;/code&gt;.&lt;/p&gt;&lt;h4 id=&quot;-ms-high-contrast-supported-in-old-edge&quot;&gt;-ms-high-contrast &lt;em&gt;(supported in old Edge)&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;-ms-high-contrast&lt;/code&gt; was the implementation of forced colors in the old EdgeHTML version of Edge. It has three possible values to check for, which includes the color scheme:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;-ms-high-contrast&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; active&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;-ms-high-contrast&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; black-on-white&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;-ms-high-contrast&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; white-on-black&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It similarly has color keywords for you to use, but they&amp;#x27;re slightly different:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;WindowText&lt;/code&gt;: the color of text content.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;-ms-hotlight&lt;/code&gt;: the color of links.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;GrayText&lt;/code&gt;: the color of disabled content&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;HighlightText&lt;/code&gt;: the color of selected text.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Highlight&lt;/code&gt;: the background color of selected text.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;ButtonText&lt;/code&gt;: the color of a &amp;lt;button&amp;gt; element&amp;#x27;s text.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;ButtonFace&lt;/code&gt;: the color of a &amp;lt;button&amp;gt; element&amp;#x27;s background.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Window&lt;/code&gt;: controls the color of the background.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;light-level-no-support&quot;&gt;Light-level &lt;em&gt;(no support)&lt;/em&gt;&lt;/h3&gt;&lt;p&gt;Light-level comes with three possible values: &lt;code class=&quot;language-text&quot;&gt;dim&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;normal&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;washed&lt;/code&gt;. What those mean exactly and when they get triggered is up to the operating system.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;light-level&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; dim&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;light-level&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; normal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;light-level&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; washed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Light-level will be dim if the screen is in a dark place, like at night, whereas washed means that it&amp;#x27;s shown under bright lights or in outdoor conditions with lots of sunlight.&lt;/p&gt;&lt;p&gt;Operating systems nowadays already compensate for these situations by increasing or decreasing brightness, but a website owners we can improve the experience more. In dim situations, you might opt to decrease strong contrast here and there and decrease overall brightness. In washed situations you might want to increase the contrast of all text compared to the background.&lt;/p&gt;&lt;h3 id=&quot;scripting-supported-in-firefox-113-safari-17-and-chromium-120&quot;&gt;Scripting &lt;em&gt;(Supported in Firefox 113, Safari 17 and Chromium 120)&lt;/em&gt;&lt;/h3&gt;&lt;p&gt;Scripting will let you test if JavaScript is available. It has three possible features:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;none&lt;/code&gt;, JavaScript is not available&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;initial-only&lt;/code&gt;, JavaScript is only available during page load, but not after&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;enabled&lt;/code&gt;, JavaScript is available&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;nav-controls-no-support&quot;&gt;Nav-controls &lt;em&gt;(no support)&lt;/em&gt;&lt;/h3&gt;&lt;p&gt;Nav controls is used to detect if the page is being viewed in a user agent that has navigation controls (specifically, a back button). It has two possible values:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;none&lt;/code&gt;, meaning there are no navigation controls&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;back&lt;/code&gt;, meaning there is are navigation controls and they&amp;#x27;re visible (&amp;quot;obviously discoverable&amp;quot;, according to the spec, which they explain as UI that&amp;#x27;s visible as opposed to a shortcut or gesture)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This is useful when your website is shown in a webview in an app, where the app might not have its own navigation controls. This way you can still provide a back button or other means of navigating.&lt;/p&gt;&lt;h3 id=&quot;environment-blending-no-support&quot;&gt;Environment-blending &lt;em&gt;(no support)&lt;/em&gt;&lt;/h3&gt;&lt;p&gt;Environment blending lets you test whether or not your screen blends with the environment, for example if it&amp;#x27;s projected onto a piece of glass. There&amp;#x27;s three potential values:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;opaque&lt;/code&gt;. Like a regular monitor, or paper (think of this as the default)&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;additive&lt;/code&gt;. For example, a heads-up display like Hololens. Black is transparent, and white is 100% light.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;subtractive&lt;/code&gt;. For example, an LCD display like a Gameboy screen, embedded in a mirror. Here the opposite happens: &amp;#x27;white&amp;#x27; is fully transparent and black has the most contrast.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;screen-spanning-supported-in-chromium-browsers&quot;&gt;Screen-spanning &lt;em&gt;(supported in Chromium browsers)&lt;/em&gt;&lt;/h3&gt;&lt;p&gt;The screen-spanning media feature (which used to be called just &amp;quot;spanning&amp;quot;) is made to support devices with multiple screens. It will tell you if a browser spans multiple screens and if those screens are aligned horizontally or vertically. It has three possible values:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;none&lt;/code&gt;, when the browser does not span multiple screens.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;single-fold-horizontal&lt;/code&gt;, when the browser spans two screens, with the fold horizontally in the middle.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;single-fold-vertical&lt;/code&gt;, when the browser spans two screens, with the fold vertically in the middle.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The specification for this is not yet final, and it might get new names and values, in particularly being more explicit about spanning horizontally or verticallym with integer values to support more than two screens.&lt;/p&gt;&lt;p&gt;Your site will work fine spanning across two screens because the browser will just pretend that it&amp;#x27;s a single screen, but you can use the values above, along with a new set of &lt;code class=&quot;language-text&quot;&gt;env()&lt;/code&gt; css environment variables that show you where the fold is so you can lay out things on both screens (For example you could use it to have a list on one screen and a map on the other.)&lt;/p&gt;&lt;ul&gt;&lt;li&gt;fold-left&lt;/li&gt;&lt;li&gt;fold-top&lt;/li&gt;&lt;li&gt;fold-height&lt;/li&gt;&lt;li&gt;fold-width&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These give you an offset for the fold, and you can combine these with &lt;code class=&quot;language-text&quot;&gt;calc()&lt;/code&gt; to target each screen individually. For Javascript, there&amp;#x27;s a new api called &lt;code class=&quot;language-text&quot;&gt;window.getWindowSegments()&lt;/code&gt; that will return an array of your screens. These are static values so won&amp;#x27;t update if a user rotates their device.&lt;/p&gt;&lt;div class=&quot;blog-img-container&quot;&gt;&lt;img src=&quot;/blogs/complete/notes_isometric.svg&quot; alt=&quot;&quot;/&gt;&lt;/div&gt;&lt;h2 id=&quot;new-notations-in-media-query-levels-4-and-5&quot;&gt;New notations in Media query levels 4 and 5&lt;/h2&gt;&lt;p&gt;Alongside the new media queries, the latest specifications (4 and 5) also comes with some new notations. They&amp;#x27;re useful improvements that are slowly finding their way into browsers.&lt;/p&gt;&lt;h3 id=&quot;range-replacing-min--and-max-&quot;&gt;Range: Replacing &lt;code class=&quot;language-text&quot;&gt;min-*&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;max-*&lt;/code&gt;&lt;/h3&gt;&lt;p&gt;In media query level 4 you can do away with the &lt;code class=&quot;language-text&quot;&gt;min-*&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;max-*&lt;/code&gt; versions of media features that have a &amp;quot;range context&amp;quot; (e.g., a min and max version) and instead write them as a simple equation.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* old notation */&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 300px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* new notation */&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;width &amp;gt;= 300px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you have both a &lt;code class=&quot;language-text&quot;&gt;min-width&lt;/code&gt; and a &lt;code class=&quot;language-text&quot;&gt;max-width&lt;/code&gt;, you can even combine them into one equation:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* old notation */&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 300px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 750px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* new notation */&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;300px &amp;lt;= width &amp;lt;= 750px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can use both &lt;code class=&quot;language-text&quot;&gt;&amp;lt;&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;&amp;gt;&lt;/code&gt; as well as &lt;code class=&quot;language-text&quot;&gt;&amp;lt;=&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;&amp;gt;=&lt;/code&gt;. The first two will exclude the edges (so &lt;code class=&quot;language-text&quot;&gt;(width &amp;gt; 300px)&lt;/code&gt; works like &lt;code class=&quot;language-text&quot;&gt;(min-width:301px)&lt;/code&gt;), while the last two will include them (and work the same as the &lt;code class=&quot;language-text&quot;&gt;min-*&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;max-*&lt;/code&gt; versions).&lt;/p&gt;&lt;p&gt;The range syntax has been supported in &lt;strong&gt;Firefox&lt;/strong&gt; for a long time, &lt;strong&gt;Chromium&lt;/strong&gt; supports it since 104 and &lt;strong&gt;Safari&lt;/strong&gt; since 16.4.&lt;/p&gt;&lt;p&gt;The next few notations aren&amp;#x27;t supported anywhere yet.&lt;/p&gt;&lt;h3 id=&quot;or-keyword&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;or&lt;/code&gt; keyword&lt;/h3&gt;&lt;p&gt;Instead of a comma, you can now also write &lt;code class=&quot;language-text&quot;&gt;or&lt;/code&gt; just like how you could already write &lt;code class=&quot;language-text&quot;&gt;and&lt;/code&gt;. The entire query will then evaluate to true as soon as one of them matches.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* old notation */&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 300px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;orientation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; landscape&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* new notation */&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 300px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;orientation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; landscape&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;not-function&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;not()&lt;/code&gt; function&lt;/h3&gt;&lt;p&gt;You can prepend &lt;code class=&quot;language-text&quot;&gt;not&lt;/code&gt; to the entire media query, but what if you only want to check a single value? You can do that with the &lt;code class=&quot;language-text&quot;&gt;not()&lt;/code&gt; notation:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* instead of this: */&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 300px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;hover&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* you can also write this: */&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 300px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hover&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;custom-media-queries&quot;&gt;Custom media queries&lt;/h3&gt;&lt;p&gt;Custom media queries let you define a media query once and then use that media query in multiple places without repeating yourself, just like how css custom properties (&amp;quot;variables&amp;quot;) work. They even have the same notation.&lt;/p&gt;&lt;p&gt;Here&amp;#x27;s an example:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* Define your custom media query */&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@custom-media&lt;/span&gt; --small-screen &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 768px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* Then use it somewhere in your stylesheet */&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--small-screen&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* You can also combine it with other media features */&lt;/span&gt;
&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;--small-screen&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;pointer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; fine&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;/* styling for small screens with a stylus */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;blog-img-container&quot;&gt;&lt;img src=&quot;/blogs/complete/problem_solving_isometric.svg&quot; alt=&quot;&quot;/&gt;&lt;/div&gt;&lt;h2 id=&quot;deprecated-media-queries&quot;&gt;Deprecated media queries&lt;/h2&gt;&lt;p&gt;Despite all the new features coming out, there&amp;#x27;s also parts older specifications that are not recommended for use anymore. You might still see them in the wild here and there, but you shouldn&amp;#x27;t add them to new projects and if you find them in existing projects, try and refactor them.&lt;/p&gt;&lt;h3 id=&quot;device--media-queries&quot;&gt;Device-* media queries&lt;/h3&gt;&lt;p&gt;When media queries were first implemented, the main idea was that they reasoned about the &lt;em&gt;device&lt;/em&gt;, so there were media features like &lt;code class=&quot;language-text&quot;&gt;device-width&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;device-height&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;device-aspect-ratio&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;But the size of the device is not always the size of the viewport, so styling based on these makes no sense.&lt;/p&gt;&lt;h3 id=&quot;prefers-color-scheme-lost-a-value&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;prefers-color-scheme&lt;/code&gt; lost a value&lt;/h3&gt;&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;no-preference&lt;/code&gt; value for &lt;code class=&quot;language-text&quot;&gt;prefers-color-scheme&lt;/code&gt; was recently removed from the specification so there will only be &lt;code class=&quot;language-text&quot;&gt;dark&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;light&lt;/code&gt; as possible values. They removed it because most browsers implemented this media feature with the default being &lt;code class=&quot;language-text&quot;&gt;light&lt;/code&gt; and never implemented &lt;code class=&quot;language-text&quot;&gt;no-preference&lt;/code&gt; anyway. The door is left open for re-introducing it in the future, as well as introducing other color scheme preferences, such as &amp;quot;sepia&amp;quot;.&lt;/p&gt;&lt;h3 id=&quot;scan&quot;&gt;Scan&lt;/h3&gt;&lt;p&gt;No browser actually supports this feature and it was to be used in tandem with the deprecated &lt;code class=&quot;language-text&quot;&gt;tv&lt;/code&gt; media type so we&amp;#x27;ll probably never see support again, but I&amp;#x27;ll explain it anyway. The &lt;code class=&quot;language-text&quot;&gt;scan&lt;/code&gt; media query can be used to test for the scanning process that is used to paint an image on a screen (like on a CRT monitor). It has two options:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;interlace&lt;/code&gt;, where odd and even lines are drawn alternately.&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;progressive&lt;/code&gt; where all lines are drawn one by one.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;progressive&lt;/code&gt; is described as a screen that is slower to update and probably fuzzier.&lt;/p&gt;&lt;div class=&quot;blog-img-container&quot;&gt;&lt;img src=&quot;/blogs/complete/bug_fixed_isometric.svg&quot; alt=&quot;&quot;/&gt;&lt;/div&gt;&lt;h2 id=&quot;using-media-queries-in-javascript&quot;&gt;Using media queries in JavaScript&lt;/h2&gt;&lt;p&gt;Lastly, I want to point out that you can&amp;#x27;t just use media queries in CSS, you can reason about them in JavaScript as well. You can do this with the &lt;code class=&quot;language-text&quot;&gt;window.matchMedia()&lt;/code&gt; function.&lt;/p&gt;&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;window.matchMedia()&lt;/code&gt; function takes a media query string and return a &amp;quot;MediaQueryList&amp;quot; object with information on if that particular media query matches:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; match &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;(min-width: 400px)&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// match output:&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;matches&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;media&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;(min-width: 400px)&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;matches&lt;/code&gt; value will tell you if the media query evaluates to &lt;code class=&quot;language-text&quot;&gt;true&lt;/code&gt;. So if you had video that you wanted to autoplay, you could use a &lt;code class=&quot;language-text&quot;&gt;matchMedia&lt;/code&gt; function to do that only for people that don&amp;#x27;t have &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-motion: reduce&lt;/code&gt;:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; video &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;video&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; canAutoPlay &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;(prefers-reduced-motion: no-preference)&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matches&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

video&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;autoplay&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; canAutoPlay&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can also add a listener to the &lt;code class=&quot;language-text&quot;&gt;MediaQueryList&lt;/code&gt; object. This will let you respond to changes in the document that cause the media query to go from &lt;code class=&quot;language-text&quot;&gt;false&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;true&lt;/code&gt;, or the other way around.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; match &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;(min-width: 400px)&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

match&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;change&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;matches&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/* do a thing */&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/* do another thing */&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;matchMedia&lt;/code&gt; object also used to have an &lt;code class=&quot;language-text&quot;&gt;addListener&lt;/code&gt; function that you could use for the same purpose, but that has been deprecated.&lt;/p&gt;&lt;div class=&quot;blog-img-container&quot;&gt;&lt;img src=&quot;/blogs/complete/mobile_testing_isometric.svg&quot; alt=&quot;&quot;/&gt;&lt;/div&gt;&lt;h2 id=&quot;test-your-media-queries-with-polypane-the-browser-for-developers-and-designers&quot;&gt;Test your media queries with Polypane, the browser for developers and designers&lt;/h2&gt;&lt;p&gt;Polypane lets you test your website in many different screen sizes and against different media queries like &lt;code class=&quot;language-text&quot;&gt;prefers-color-scheme&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;print&lt;/code&gt; stylesheets and &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-motion&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;It&amp;#x27;s the fastest way to develop and test websites, and &lt;a href=&quot;https://polypane.app/pricing/&quot;&gt;you can try it for free&lt;/a&gt;!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 3.1: New elements panel]]></title><description><![CDATA[Polypane 3.1 is now available and with over 30 new and improved features it's our biggest release ever. With Polypane 3.1 we're introducing…]]></description><link>https://polypane.app/blog/polypane-3-1-new-elements-panel/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-3-1-new-elements-panel/</guid><pubDate>Wed, 22 Apr 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 3.1 is now available and with over 30 new and improved features it&amp;#x27;s our biggest release ever.&lt;/p&gt;&lt;p&gt;With Polypane 3.1 we&amp;#x27;re introducing the Polypane elements panel: &lt;strong&gt;A completely new elements panel
written for Polypane&lt;/strong&gt; that syncs between all panes letting you easily update styles, content and attributes.&lt;/p&gt;&lt;p&gt;But with 32 other new and improved features there&amp;#x27;s way more to explore. There are 2 other new panels: Storage and Outline.
There&amp;#x27;s an updated Meta panel that highlights issues, a new Discord preview and updated Twitter and Facebook previews.
We&amp;#x27;ve added the ability to import and export workspaces and added some default workspaces for convenience.
There&amp;#x27;s new overlays, updated existing ones and improved performance all around.&lt;/p&gt;&lt;h2 id=&quot;polypane-element-inspector&quot;&gt;Polypane element inspector&lt;/h2&gt;&lt;p&gt;In Polypane you&amp;#x27;ve had access to the Chromium devtools element inspector and while it works fine it was never developed to
support multiple panes.&lt;/p&gt;&lt;p&gt;So we built our own:&lt;/p&gt;&lt;img alt=&quot;Polypane element inspector&quot; src=&quot;/blogs/polypane-3-1/elements.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:1rem auto 1rem;display:block;max-width:100%&quot;/&gt;&lt;p&gt;The Polypane element inspector is extremely fast and makes common tasks really easy. All synced
with all panes, of course. Here&amp;#x27;s a quick video showing it in action:&lt;/p&gt;&lt;div style=&quot;position:relative;width:100%;padding-top:56.25%&quot;&gt;&lt;a id=&quot;video&quot; style=&quot;position:absolute;top:-100px&quot;&gt;&lt;/a&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/_Unq1DDKY-g?&amp;amp;autoplay=false&amp;amp;start=0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; style=&quot;position:absolute;top:0px;left:0px;width:100%;height:100%&quot; frameBorder=&quot;0&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;The element inspector is filled with smart features and it s a joy to use. Listing all the features would make this
announcement twice as long. Very quickly: select elements in all panes at the same time, live editing of content and attributes, custom widgets for styling, one-click
copying of CSS rule sets, automatic contrast checking and so much more. For a full rundown, read the &lt;a href=&quot;https://polypane.app/docs/elements-panel/&quot;&gt;documentation&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;meta-panel-updates&quot;&gt;Meta panel updates&lt;/h2&gt;&lt;p&gt;One important theme in Polypane is that we want to help you create better sites. That&amp;#x27;s why we added warnings for common issues
in the Meta panel. We show warnings for missing but important meta elements or when your title
and description are too long or short.&lt;/p&gt;&lt;img alt=&quot;Meta preview warnings&quot; src=&quot;/blogs/polypane-3-1/warnings.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:1rem auto 1rem;display:block&quot;/&gt;&lt;p&gt;If you define certain meta values more than once, we&amp;#x27;ll show you a warning indicator for that too. Other new things are
more prominent place for the canonical url, all icons are now downloadable and if your page supplies
oEmbed information that information is now also shown.&lt;/p&gt;&lt;h3 id=&quot;social-media-previews&quot;&gt;Social media previews&lt;/h3&gt;&lt;p&gt;All social media cards now have a background color that matches their websites for both dark and light mode, so the
preview is even more accurate and you get a better idea of the context where your card is shown.&lt;/p&gt;&lt;p&gt;We added a new social media preview: Discord, in dark and light mode. One of the cool things in the Discord share card is
that is uses your site&amp;#x27;s theme color for the border.&lt;/p&gt;&lt;img alt=&quot;Discord light&quot; src=&quot;/blogs/polypane-3-1/discord-light.png&quot; class=&quot;imgshadow&quot; style=&quot;max-width:48%;margin:1rem 0rem 1rem;float:left&quot;/&gt;&lt;img alt=&quot;Discord dark&quot; src=&quot;/blogs/polypane-3-1/discord-dark.png&quot; class=&quot;imgshadow&quot; style=&quot;max-width:48%;margin:1rem 0rem 1rem;float:right&quot;/&gt;&lt;div style=&quot;clear:both;height:1rem&quot;&gt;&lt;/div&gt;&lt;p&gt;Since the last release of Polypane, Facebook updated it&amp;#x27;s design and added a dark mode, so that is now updated in Polypane.
New (or rather, back again) in this design is that Facebook will show a part of your og:description again but only if your title fits on a
single line.&lt;/p&gt;&lt;h2 id=&quot;other-new-panels&quot;&gt;Other new panels&lt;/h2&gt;&lt;p&gt;We also added two new panels: Storage and Outline.&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;Storage panel&lt;/strong&gt; has been in the works for a while (I hinted about it
in an article in December of 2019) and it makes it super easy to inspect and edit your localStorage, sessionStorage
and cookies, including cookies that are httpOnly, which you don&amp;#x27;t have access to in your own JavaScript.&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;Outline panel&lt;/strong&gt; shows an outline of your headings according to the HTML5 outline algorithm. Easy to quickly check if your
page has a logical heading structure or if you&amp;#x27;re missing steps or have sections that need a title but don&amp;#x27;t have one.&lt;/p&gt;&lt;img alt=&quot;Storage panel&quot; src=&quot;/blogs/polypane-3-1/storage.png&quot; class=&quot;imgshadow&quot; style=&quot;max-width:48%;margin:1rem 0rem 1rem;float:left&quot;/&gt;&lt;img alt=&quot;Outline panel&quot; src=&quot;/blogs/polypane-3-1/outline.png&quot; class=&quot;imgshadow&quot; style=&quot;max-width:48%;margin:1rem 0rem 1rem;float:right&quot;/&gt;&lt;div style=&quot;clear:both;height:1rem&quot;&gt;&lt;/div&gt;&lt;h2 id=&quot;workspace-import-and-export&quot;&gt;Workspace import and export&lt;/h2&gt;&lt;p&gt;We heard from many of you that you wanted to share your workspaces with your colleagues, so we&amp;#x27;ve added the ability to export
and import workspaces. Export your favorite workspaces to Polypane workspace files, share them with your team and they can
import them into their own workspaces.&lt;/p&gt;&lt;h2 id=&quot;default-workspaces&quot;&gt;Default workspaces&lt;/h2&gt;&lt;p&gt;We&amp;#x27;ve also added a new tab with default workspaces. They include our default three-pane layout, the device lab, all our
iOS devices, all our Android devices (including a new Moto G4 preset), the 6 most common screen sizes used worldwide and the default
breakpoint for Bootstrap, Material UI, Tailwind and Bulma.&lt;/p&gt;&lt;img alt=&quot;default workspaces&quot; src=&quot;/blogs/polypane-3-1/workspaces.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:1rem auto 1rem;display:block;max-width:100%&quot;/&gt;&lt;h2 id=&quot;new-overlay&quot;&gt;New overlay&lt;/h2&gt;&lt;p&gt;We added a new overlay, Hostile CSS. Hostile CSS will inject styling for all default elements. You can use it to check if your component styles are properly
isolated from any default CSS.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/doc-img/overlays/hostilecss.png&quot; alt=&quot;screenshot of hostile CSS&quot;/&gt;&lt;/p&gt;&lt;h2 id=&quot;color-overlay-now-suggests-alternatives&quot;&gt;Color overlay now suggests alternatives&lt;/h2&gt;&lt;p&gt;Like our free online &lt;a href=&quot;/color-contrast/&quot;&gt;Color contrast checker&lt;/a&gt;, the Contrast checker overlay will suggest improved
colors that have enough contrast. This makes fixing your colors really easy.&lt;/p&gt;&lt;img alt=&quot;Color suggestion&quot; src=&quot;/blogs/polypane-3-1/coloroverlay.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:1rem auto 1rem&quot;/&gt;&lt;h2 id=&quot;set-your-own-tab-homepage&quot;&gt;Set your own tab homepage&lt;/h2&gt;&lt;p&gt;When you open a new tab we show the default 3 panes and the getting started page. in 3.1 you can now change this &amp;#x27;homepage&amp;#x27; to whatever
configuration you want. Arrange your tabs the way you like, pick a URL, then set the homepage to your current view from the main menu.&lt;/p&gt;&lt;h2 id=&quot;full-changelog&quot;&gt;Full changelog&lt;/h2&gt;&lt;p&gt;There&amp;#x27;s more new features, improvements and fixes in this release so read through the full changelog below. All new features are fully documented in our &lt;a href=&quot;/docs/&quot;&gt;docs&lt;/a&gt; too.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Polypane Element Inspector&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Storage panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; HTML5 Outline panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Default workspaces&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Exportable and importable workspaces&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Meta Panel: Discord preview&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Meta Panel: warnings for issues&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Ability to set new tab layout + url&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Hostile CSS overlay&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Color contrast overlay now suggest color&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Color contrast overlay supports testing numerical font-weights&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Meta panel: downloadable images&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Meta Panel: Facebook preview updated&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Meta Panel: Twitter dark mode preview updated&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Meta Panel: Social media previews are now shown on their real background color&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Meta panel: shows oEmbed info&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Panes no longer refresh when switching between horizontal and vertical mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Panel settings are stored per tab&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Updated default paneset&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Screenshots now include timestamp&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Disable cache now identical to devtools&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Right click to open links in side browser&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Support for Meteor devtools&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Dragging links or files to tab bar opens them in new tab&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Double click vertical resize to scale panes to 100%&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Polypane loading looks better&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Add Moto G4 pane preset&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; On Mac, Polypane now keeps running after last window is closed&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Panel resizing is now faster&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Updated UI of devtools extension manager&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Urls with &lt;code class=&quot;language-text&quot;&gt;target=&amp;quot;_blank&amp;quot;&lt;/code&gt; now open in a new tab&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Scroll position is now saved per tab&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Updated Electron&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Full page screenshot now works with more websites&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Zooming shortcuts work again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; F12 now turns on inspect element in Isolate pane mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Figma sign in with Google now works&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Screenshot in browser mode now has correct dimensions&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; No internet message in dark mode now has correct border color&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Custom headers are also applied on first load when switching modes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Updated shortcut for fullscreen on Mac&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;3.1.1&lt;/strong&gt; (bugfix update)&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Crashes in the panel no longer crash Polypane&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Element inspector now understands CSS custom properties with fallback values&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Element inspector now understands currentcolor&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Updated Codemirror for Live CSS&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Updated Electron&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Support Google login for isolated panes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Setting panes from a workspace correctly sets pane names&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Clicking on dimensions in device chooser sets correct device&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent crash when meta description exists but has no content&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Live CSS shows Google Fonts as suggestions again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Issue where side panel sometimes disappeared&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Opening links with target=&amp;quot;_blank&amp;quot; in isolate pane mode no longer opens multiple tabs&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;getting-polypane-31&quot;&gt;Getting Polypane 3.1&lt;/h2&gt;&lt;p&gt;Polypane will automatically update on Mac and Windows. Linux users need to download the new version from
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; and if you&amp;#x27;re on Mac and Windows but don&amp;#x27;t want to wait on the update popup, you can find
your download there as well.&lt;/p&gt;&lt;p&gt;If you don&amp;#x27;t have Polypane yet there is a free 14 day trial available. &lt;a href=&quot;/pricing/&quot;&gt;Get it here&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[8 ways to increase your productivity as a web developer (in 2021)]]></title><description><![CDATA[Making websites takes time. There are a lot of parts you have to think about if you want to create a good, solid website and sometimes it…]]></description><link>https://polypane.app/blog/ways-to-increase-your-productivity-as-a-web-developer/</link><guid isPermaLink="false">https://polypane.app/blog/ways-to-increase-your-productivity-as-a-web-developer/</guid><pubDate>Tue, 14 Apr 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Making websites takes time. There are a lot of parts you have to think about if you want to create a good, solid website and sometimes it might feel like there just isn&amp;#x27;t a way to go through the work faster. Whether you work alone or with a team of designers and back-end developers, there are a lot of way to be more productive.&lt;/p&gt;&lt;p&gt;A mistake many people and many companies make is that they set out to standardize their product. They only build based on a single Wordpress theme, or all their sites have the same features. If you want to work with bigger clients they almost never want standard work though. They instead want something custom-fit to their needs and requirements. That&amp;#x27;s more interesting work, more challenging and pays more. But it also means you you can&amp;#x27;t standardize your product.&lt;/p&gt;&lt;p&gt;You can&amp;#x27;t (and don&amp;#x27;t want to) standardize your &lt;strong&gt;product&lt;/strong&gt;, but what you can do is standardize your &lt;strong&gt;process&lt;/strong&gt;. As a lead front-end developer with over 15 years of experience, I spent a lot of time thinking about how to optimally configure this process. If you&amp;#x27;re intentional about it you can get some impressive productivity gains in all areas of the process. Here&amp;#x27;s 8 ways to do that, from the beginning of the project through to the end:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Start from a solid base&lt;/li&gt;&lt;li&gt;Agree on design shortcuts&lt;/li&gt;&lt;li&gt;Use handoff tools&lt;/li&gt;&lt;li&gt;Use a CSS framework&lt;/li&gt;&lt;li&gt;Re-use your components&lt;/li&gt;&lt;li&gt;Use Emmet&lt;/li&gt;&lt;li&gt;Use Polypane&lt;/li&gt;&lt;li&gt;Set up automated quality checking&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;start-from-a-solid-base&quot;&gt;Start from a solid base&lt;/h3&gt;&lt;p&gt;If you start from scratch every single time, you can be sure you&amp;#x27;re never going to be faster than the last time. By creating or using a solid base for your website, you can save time on the things you&amp;#x27;re doing every time.&lt;/p&gt;&lt;p&gt;Backend developers already know this. Many will create their own starter project based on a language and framework of their choice, rather than a CMS. Where a CMS usually has a set number of functionality that you can only used in the way the CMS intended, a framework is more like a big box of building blocks that you can combine in ways that work best for your current project. This concept can be extended to your front-end too.&lt;/p&gt;&lt;p&gt;Take the last few projects and see which HTML is similar. Every website is going to have roughly the same elements: There&amp;#x27;s always a &lt;code class=&quot;language-text&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt; with a title, favicon, opengraph info an links to your CSS and JS. 99% of the time a website will have a header with a logo and some form of navigation, and a footer with a copyright rule and some additional links, and most pages will have a content area for your CMS. Making that part of your &amp;quot;starter&amp;quot; or &amp;quot;base&amp;quot; HTML will save you a lot of time.&lt;/p&gt;&lt;p&gt;Additionally, though most of us love checking out new JavaScript frameworks, for your starter base you can probably get away with a few little JavaScript snippets. Cross-platform JavaScript is much easier than it was a few years ago, and most things can be solved with small &amp;quot;vanilla&amp;quot; scripts.&lt;/p&gt;&lt;h3 id=&quot;agree-on-design-shortcuts&quot;&gt;Agree on design shortcuts&lt;/h3&gt;&lt;p&gt;Design tools give designers access to all widths, all colors and all font sizes. But in reality your websites will only use a few of each. You can save time during design and during implementation not by cutting corners, but by laying down some ground rules.&lt;/p&gt;&lt;p&gt;This can be super expansive, by creating a full design system, for example in the soon-to-be-released &lt;a href=&quot;https://modulz.app&quot;&gt;Modulz&lt;/a&gt;, where all the available design elements and variants are pre-designed and generated from actual code. You spend more time up front, but the result is something that can be quickly designed and build, often in tandem.&lt;/p&gt;&lt;p&gt;But design shortcuts can also be super simple: get your team to agree on set of design shortcuts that you apply to every part of the design.&lt;/p&gt;&lt;p&gt;For example, agree on a set of margins you re-use for every design element (like 8px/16px/32px/64px) and a designer will never have to worry about making sure all the margins are perfectly 64px instead of 63px (or worse, 63.47845px. Thanks Sketch!). On the flip side, you as a web developer will never have to waste time asking designers if they actually meant to use 60px this one time, or if it should just be 64 like all the rest. You can do the same for font-sizes and even colors.&lt;/p&gt;&lt;p&gt;This simple, low-tech piece of &lt;em&gt;communication&lt;/em&gt; can save you hours of (re)development time. If you already agreed on potential margins everywhere, and any design element that uses a slightly different one you can just use the nearest matching one, then you also don&amp;#x27;t have to do any pixel-bleep-ing sessions with your designer. Or at least a lot less.&lt;/p&gt;&lt;p&gt;Of course it doesn&amp;#x27;t mean a design can &lt;em&gt;never&lt;/em&gt; use a different margin, but the designer would clearly indicate any exceptions in your design file.&lt;/p&gt;&lt;h3 id=&quot;use-handoff-tools&quot;&gt;Use handoff tools&lt;/h3&gt;&lt;p&gt;Working from a design file directly is a recipe for problems. Not only can you accidentally move parts of the UI without realizing, but the interface is geared towards creating a design, not dissecting it to re-implement elsewhere. For that, there are handoff tools.&lt;/p&gt;&lt;p&gt;They take a design and bring a unique interface that is focused on what front-end developers do. Favorites of ours include &lt;a href=&quot;https://avocode.com&quot;&gt;Avocode&lt;/a&gt;, &lt;a href=&quot;https://zeplin.io&quot;&gt;Zeplin&lt;/a&gt; and &lt;a href=&quot;https://marvelapp.com&quot;&gt;Marvel&lt;/a&gt;, but design tools like XD, Figma and Sketch now all include their own handoff modes too.&lt;/p&gt;&lt;p&gt;Get familiar with these tools together with your designer so they can learn the best way to prepare design files for these tools and you as a developer learn how to most efficiently use the tools.&lt;/p&gt;&lt;h3 id=&quot;use-a-css-framework&quot;&gt;Use a CSS framework&lt;/h3&gt;&lt;p&gt;First let me say that I&amp;#x27;m not much of a fan of CSS frameworks. Most are big, slow, carry a lot of legacy and overly limiting while providing no good defaults, or if they have good defaults, they&amp;#x27;re &lt;em&gt;usually someone else&amp;#x27;s defaults&lt;/em&gt; that probably won&amp;#x27;t work for you and your situation (Oh hi, Material design).&lt;/p&gt;&lt;p&gt;But.&lt;/p&gt;&lt;p&gt;There are interesting new frameworks that could work for you:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://bulma.io&quot;&gt;Bulma&lt;/a&gt; is a &amp;quot;next generation&amp;quot; CSS framework built for modern browsers, so it has a simpler and smaller codebase, is easy to customize and has some good looking defaults. I&amp;#x27;ve seen this work in production really well.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://tailwindcss.com/&quot;&gt;Tailwind&lt;/a&gt; - Be warned, you might hate it when you first see it (I know I did). The trick here is that it moves your styling from writing CSS to writing class names. Each style (color, margin etc) gets their own classes so even though you&amp;#x27;re limited to a few fixed classes, your site will always be consistent. You get to either use the defaults, or customize them.&lt;/p&gt;&lt;p&gt;If you get over the fact you have to style using just classes, developing in it becomes really, &lt;em&gt;really&lt;/em&gt; fast. The Polypane dashboard is written with it, for example. If you want to see how varied your designs can be and what the implementations might look like, I recommend &lt;a href=&quot;https://www.tailwindtoolbox.com/&quot;&gt;Tailwind Toolbox&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;re-use-your-components&quot;&gt;Re-use your components&lt;/h3&gt;&lt;p&gt;While there are good, fast, accessible and responsive components out there, it&amp;#x27;s difficult to find ones that perfectly fit your and your teams way of working so often you&amp;#x27;ll end up creating your own. Yet, between projects there&amp;#x27;s usually UI elements and patterns that you re-use.&lt;/p&gt;&lt;p&gt;Maybe you have &lt;a href=&quot;https://polypane.app/blog/the-perfect-responsive-menu/&quot;&gt;the perfect responsive menu&lt;/a&gt;, or the perfect contact form with accessible error handling and fancy animation.&lt;/p&gt;&lt;p&gt;Document those in such a way that you can easily implement them in each new project. Over time, they will evolve and you will add new features to them. If you do, don&amp;#x27;t forget to also update your reference component. Otherwise you&amp;#x27;ll still be digging around in old project to find that specific version of a component.&lt;/p&gt;&lt;h3 id=&quot;use-emmet&quot;&gt;Use Emmet&lt;/h3&gt;&lt;p&gt;While any text editor or IDE that you use will have support for snippets (use those for the reusable components we just mentioned), using &lt;a href=&quot;https://emmet.io&quot;&gt;Emmet&lt;/a&gt; can save you so much time. It&amp;#x27;s available for basically all text editors and IDE&amp;#x27;s.&lt;/p&gt;&lt;p&gt;The concept for Emmet is simple: What if you create HTML by writing CSS selectors? From the Emmet documentation:&lt;/p&gt;&lt;p&gt;This abbreviation:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;#page&amp;gt;div.logo+ul#navigation&amp;gt;li*5&amp;gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;Item $&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;...can be transformed into&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;page&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;logo&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;navigation&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Item 1&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Item 2&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Item 3&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Item 4&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Item 5&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;...with a single &amp;quot;expand&amp;quot; shortcut. You can clearly see which of these two is faster to write, and as a front-end developer you already know CSS so there is very little to learn for such a massive increase in speed.&lt;/p&gt;&lt;p&gt;Just like how Polypane saves you time by all the resizing and reloading you don&amp;#x27;t have to do, So does Emmet save you time by all the typing you don&amp;#x27;t have to do.&lt;/p&gt;&lt;h3 id=&quot;use-polypane&quot;&gt;Use Polypane&lt;/h3&gt;&lt;p&gt;Didn&amp;#x27;t think I was gonna leave this out, right? On average, &lt;a href=&quot;https://polypane.app/pricing/&quot;&gt;Polypane&lt;/a&gt; saves teams about 60% of their implementation time. That sounds insane, I know, but they&amp;#x27;re observed numbers. Very simply, if you count up all the time you spend resizing your browser during development, it&amp;#x27;s a lot. And it&amp;#x27;s just not something you do only once per page. In Polypane, that resizing doesn&amp;#x27;t have to happen because you already see all your breakpoints side by side. If you use it for QA, you can decimate the time it takes because you&amp;#x27;ll have far less devices to manage. More on that in a later article.&lt;/p&gt;&lt;p&gt;Polypane doesn&amp;#x27;t just save time because you don&amp;#x27;t have to resize. It has many other tools that will make you as a developer faster, like &lt;a href=&quot;https://polypane.app/docs/live-auto-reloading/&quot;&gt;built-in live reloading&lt;/a&gt; that will make refreshing the page obsolete too, or &lt;a href=&quot;https://polypane.app/docs/debug-tools/&quot;&gt;debug tools&lt;/a&gt; that do everything from highlighting contrast issues to running visual impairment simulators live.&lt;/p&gt;&lt;p&gt;If you don&amp;#x27;t use Polypane yet, I challenge you to keep a tally of how much your resize your browser during a single day. Then go use Polypane.&lt;/p&gt;&lt;p&gt;But more importantly, when you build a site and you see all screen sizes at once, issues are caught faster (often before they happen) so your time spent per page will go down. You simply have less fixes to make after your initial implementation. With time you will automatically take those fixes into account with your first pass saving even more time.&lt;/p&gt;&lt;p&gt;That benefit carries pretty far: it also means far less issues come up after a project has been released. Having to do bug fixes on projects that were finished months ago is the most costly waste of time a web development team can have. Imagine not having to download a database and static files, and set up an old project on your machine just to fix a single issue.&lt;/p&gt;&lt;h3 id=&quot;set-up-automated-quality-checking&quot;&gt;Set up automated quality checking&lt;/h3&gt;&lt;p&gt;You could manually check your in-progress site every now and then, but quality testers like Lighthouse and Webhint usually take a while to run. Ideally you do not want to wait for them to finish. So rather than running them manually, make them part of your progress. Automate checking every PR, for example, using &lt;a href=&quot;https://github.com/GoogleChrome/lighthouse-ci&quot;&gt;lighthouse-ci&lt;/a&gt; and &lt;a href=&quot;https://webhint.io/docs/user-guide/development-flow-integration/summary/&quot;&gt;webhint&amp;#x27;s CI integration&lt;/a&gt;. That way you keep a good overview of how your project is doing quality-wise, without having to waste time waiting for the tests to finish.&lt;/p&gt;&lt;h3 id=&quot;suggestions&quot;&gt;Suggestions?&lt;/h3&gt;&lt;p&gt;Those are my suggestions for improving the productivity of a web developer. If you have other suggestions, I&amp;#x27;d love to hear them!&lt;/p&gt;&lt;p&gt;Reach out on twitter (&lt;a href=&quot;https://twitter.com/polypane&quot;&gt;@polypane&lt;/a&gt; or &lt;a href=&quot;https://twitter.com/kilianvalkhof&quot;&gt;@kilianvalkhof&lt;/a&gt;) or email me: &lt;a href=&quot;mailto:kilian@polypane.app&quot;&gt;kilian@polypane.app&lt;/a&gt; and I&amp;#x27;ll add them to this article.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Color contrast checker that makes suggestions for better colors]]></title><description><![CDATA[For the past week or so I've been helping out with  Coronastatus ,
an online platform that's now live in 20+ countries where people can self…]]></description><link>https://polypane.app/blog/color-contrast-checker-that-makes-suggestions-for-better-colors/</link><guid isPermaLink="false">https://polypane.app/blog/color-contrast-checker-that-makes-suggestions-for-better-colors/</guid><pubDate>Mon, 30 Mar 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;For the past week or so I&amp;#x27;ve been helping out with &lt;a href=&quot;https://github.com/BustByte/coronastatus/&quot;&gt;Coronastatus&lt;/a&gt;,
an online platform that&amp;#x27;s now live in 20+ countries where people can self-report their health status in relation to the
COVID-19 pandemic. One of the things I spent time on was making sure that the site and the colors used were accessible.&lt;/p&gt;&lt;p&gt;Polypane made it super easy to check if a color combination had enough contrast but it doesn&amp;#x27;t tell you what
color would be good enough. There are online tools for that available but they were slow and I quickly decided to built it
right into Polypane. In the next version the contrast checker overlay will give you suggestions for better colors:&lt;/p&gt;&lt;div&gt;&lt;div style=&quot;height:0;width:100%&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;And as I promised in that tweet, I also started working on an online tool. There are many color contrast checker tools
online but they don&amp;#x27;t update on-the-fly, don&amp;#x27;t actually calculate the contrast correctly (by not taking alpha into account)
or don&amp;#x27;t give suggestions. I think tools need to be &lt;strong&gt;fast, correct and actionable&lt;/strong&gt; if they&amp;#x27;re worth using so I decided
to build one that is.&lt;/p&gt;&lt;p&gt;It updates on the fly, giving you the ratio and suggested colors as you type your color or as you use the color picker.&lt;/p&gt;&lt;p&gt;It takes transparency into account for the foreground color (mixing it with the background color before calculating the contrast ratio) and the background color (with a warning.)&lt;/p&gt;&lt;p&gt;It suggest the closest color by luminance that meets the required contrast ratio.&lt;/p&gt;&lt;p&gt;It does this for both the AA and AAA levels of the WCAG, and lets you know when the contrast is enough for all text, just for large text, or for no text.&lt;/p&gt;&lt;p&gt;Oh, and it saves your colors and preferred level in the URL, so you can share it out easily :)&lt;/p&gt;&lt;p&gt;Go check it out here:&lt;/p&gt;&lt;h3 id=&quot;color-contrast-checker-that-makes-suggestions-for-better-colors&quot;&gt;&lt;a href=&quot;/color-contrast/&quot;&gt;Color contrast checker that makes suggestions for better colors&lt;/a&gt;&lt;/h3&gt;</content:encoded></item><item><title><![CDATA[Polypane 3: browser tabs and dark mode emulation]]></title><description><![CDATA[Polypane 3 is now available and comes with two big new features:  Media Feature emulation  and  Browser tabs , as well as an upgrade to…]]></description><link>https://polypane.app/blog/polypane-3-browser-tabs-and-dark-mode-emulation/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-3-browser-tabs-and-dark-mode-emulation/</guid><pubDate>Mon, 02 Mar 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 3 is now available and comes with two big new features: &lt;strong&gt;Media Feature emulation&lt;/strong&gt; and &lt;strong&gt;Browser tabs&lt;/strong&gt;, as well as an upgrade to Chromium 80. To allow for browser tabs we also updated the rest of the UI to match.&lt;/p&gt;&lt;h2 id=&quot;browser-tabs&quot;&gt;Browser Tabs&lt;/h2&gt;&lt;p&gt;Even before we launched in early 2019, adding browser tabs has been a popular request. We held off on that for a while due to performance
concerns, but we found a nice way to implement tabs without any performance penalty.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-3/tabs.png&quot; alt=&quot;The Polypane tabs and header on all three platforms&quot;/&gt;&lt;p&gt;With the addition of tabs, we also streamlined the rest of the header and made it fit better with each operating system. Polypane now looks even better on all three platforms
with more consistent styling and better integration with each platform.&lt;/p&gt;&lt;p&gt;Each tab has its own full state, history, view mode, zoom levels and of course panes. Tabs can be reordered with drag and drop, and there&amp;#x27;s shortcuts for adding, removing and switching between tabs.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-3/mediafeatureexample.png&quot; alt=&quot;overreacted side-by-side&quot; class=&quot;imgshadow&quot;/&gt;&lt;h2 id=&quot;media-feature-emulation&quot;&gt;Media Feature emulation&lt;/h2&gt;&lt;img alt=&quot;Media feature options&quot; src=&quot;/blogs/polypane-3/mediafeature.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:0 0 1rem 1rem;float:right&quot;/&gt;&lt;p&gt;Media feature emulation lets you toggle media query settings like &lt;code class=&quot;language-text&quot;&gt;screen&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;print&lt;/code&gt;, but more interestingly, set values for &lt;code class=&quot;language-text&quot;&gt;prefers-color-scheme&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-motion&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;This means you can develop dark mode without having to switch your OS level settings or your browser settings. Even better, you can develop your dark and light mode at the same time &lt;strong&gt;side-by-side&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;prefers-reduced-motion&lt;/code&gt; is an important media feature you can use to disable animations and other jarring effects to make your site more usable for people with vestibular disorders or
other impairments that make motion unpleasant. Watching this side-by-side again is an excellent way to make sure your site looks good and works good for all your users.&lt;/p&gt;&lt;p&gt;We&amp;#x27;re working on getting more Media Feature emulations available in updated version of Chromium. We&amp;#x27;re particularly interested in the &lt;code class=&quot;language-text&quot;&gt;prefers-reduced-data&lt;/code&gt; feature but there are other ones like Edge&amp;#x27;s &lt;code class=&quot;language-text&quot;&gt;prefers-contrast&lt;/code&gt; that would be great to emulate as well.&lt;/p&gt;&lt;h2 id=&quot;other-improvements&quot;&gt;Other improvements&lt;/h2&gt;&lt;p&gt;Polypane 3 &lt;strong&gt;updates Chromium from 78 to 80&lt;/strong&gt;, bringing it up to date with the current release.&lt;/p&gt;&lt;p&gt;We made &lt;strong&gt;improvements to our CSS breakpoint detection&lt;/strong&gt; along with our handling. When you create breakpoints from your CSS, rather than give all panes a 100% height, we now give a height
calculated on average device ratios. smaller (mobile) sizes scale to portrait, while larger (desktop) sizes scale to landscape.&lt;/p&gt;&lt;img alt=&quot;Media query list&quot; src=&quot;/blogs/polypane-3/mqlist.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:1rem 1rem 1rem 0;float:left&quot;/&gt;&lt;p&gt;Additionally, you can now right-click the breakpoint
icon in the header to get a list of your breakpoints, so you can add just a single one. (note: we hide this list if you have too many breakpoints to display comfortably).&lt;/p&gt;&lt;h3 id=&quot;detecting-polypane&quot;&gt;Detecting Polypane&lt;/h3&gt;&lt;p&gt;In previous releases we added the Polypane user agent and a &lt;code class=&quot;language-text&quot;&gt;window.__polypane&lt;/code&gt; object so you could detect that your site was being shown on your server and in JavaScript.
In Polypane 3 we also &lt;strong&gt;add a way to detect that you&amp;#x27;re running in Polypane in CSS&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;When your site runs in Polypane, the HTML element gets an additional class &lt;code class=&quot;language-text&quot;&gt;in-polypane&lt;/code&gt;. Now you can use your server output, JavaScript and CSS together to display extra debug information when you&amp;#x27;re working with your site in Polypane.&lt;/p&gt;&lt;h3 id=&quot;interface-updates&quot;&gt;Interface updates&lt;/h3&gt;&lt;p&gt;With the browser tabs we also improved many other parts of the interface. We redesigned the quick switcher, global zoom now works per tab and per view mode and we highlight the active pane with a blue glow, so you know when keyboard input is sent to the site.&lt;/p&gt;&lt;h3 id=&quot;new-overlay&quot;&gt;New overlay&lt;/h3&gt;&lt;p&gt;We also added a new overlay: Audible changes. This overlay sounds a beep every time it detects a change in your HTML. It&amp;#x27;s a neat way of finding out where you&amp;#x27;re doing too much DOM manipulation, or when you&amp;#x27;re doing DOM manipulation where you don&amp;#x27;t expect it.&lt;/p&gt;&lt;h3 id=&quot;microsoft-edge-browser-extension&quot;&gt;Microsoft Edge browser extension&lt;/h3&gt;&lt;p&gt;Microsoft recently launched their new chromium-based Edge browser, so we made the Polypane helper extension available for it too. Get it here: &lt;a href=&quot;https://microsoftedge.microsoft.com/addons/detail/leojkjmhbidaiacgldgodkagffjhjipn&quot;&gt;Polypane helper for Edge&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;full-changelog&quot;&gt;Full changelog&lt;/h2&gt;&lt;p&gt;There&amp;#x27;s more new features, improvements and fixes in this release so read through the full changelog below. All new features are fully documented in our &lt;a href=&quot;/docs/&quot;&gt;docs&lt;/a&gt; too.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Media feature emulation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Browser tabs&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; UI streamlining&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;in-polypane&lt;/code&gt; class for styling&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Update to Chromium 80&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Individual breakpoints in dropdown&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Audible changes overlay&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Edge browser extension&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; CSS Breakpoints are now sized horizontally too&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Zoom now works per view mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Active pane is now highlighted&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Windows titlebar integrates into the design&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Workspaces now save emulation options&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Support more sites in the side browser&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Color contrast overlay now detects backgrounds more consistently&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvment&lt;/strong&gt; Support more complex login flows in Isolate Pane mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; F12 now opens devtools on windows 10 too&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Better handling of license renewal&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; No longer use occasionally stale data for screenshots&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Isolate pane mode could get in a reload loop&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; OG images not updating when switching between view modes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Viewport screenshot now positions and clears correctly&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Panes can now be longer than the viewport in vertical mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Workspace save shortcut no longer overlaps with Mac screenshot shortcut&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Color contrast overlay crashed on some websites&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;updated-to-304&quot;&gt;Updated to 3.0.4:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Clear localStorage option&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Clear All Storage option&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Add 19 new Google fonts to Live CSS, including the Inter variable font&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; More accurate live reloading when using IDE&amp;#x27;s&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Panes now remember their scroll position on reload&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Update Electron&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Faster CSS breakpoint detection&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Tab navigation shortcuts&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Side browser address bar background color in Dark mode now correct&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; First login on new machine custom url and paneset choice&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Emulation options not being set for new panes created from workspaces&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; First login on new machine gave incorrect license error&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; First login on new machine gave incorrect state error&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://polypane.app/blog/polypane-3-browser-tabs-and-dark-mode-emulation/&quot;&gt;Full release notes for Polypane 3&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;getting-polypane-3&quot;&gt;Getting Polypane 3&lt;/h2&gt;&lt;p&gt;Polypane will automatically update on Mac and Windows. Linux users need to download the new version from
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; and if you&amp;#x27;re on Mac and Windows but don&amp;#x27;t want to wait on the update popup, you can find
your download there as well.&lt;/p&gt;&lt;p&gt;If you don&amp;#x27;t have Polypane yet there is a free 14 day trial available. &lt;a href=&quot;/pricing/&quot;&gt;Get it here&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane is now part of the GitHub Student Developer Pack]]></title><description><![CDATA[We are super proud to announce that Polypane is now part of the  GitHub Student Developer Pack . Eligible students get free access to…]]></description><link>https://polypane.app/blog/polypane-is-now-part-of-the-git-hub-student-developer-pack/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-is-now-part-of-the-git-hub-student-developer-pack/</guid><pubDate>Tue, 25 Feb 2020 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;BeatingHeart-styles-module--images--2q4cd &quot; style=&quot;max-height:150px;fill:#107db5&quot;&gt;&lt;div data-gatsby-image-wrapper=&quot;&quot; class=&quot;gatsby-image-wrapper gatsby-image-wrapper-constrained&quot;&gt;&lt;div style=&quot;max-width:150px;display:block&quot;&gt;&lt;img alt=&quot;&quot; role=&quot;presentation&quot; aria-hidden=&quot;true&quot; src=&quot;data:image/svg+xml;charset=utf-8,%3Csvg height=&amp;#x27;150&amp;#x27; width=&amp;#x27;150&amp;#x27; xmlns=&amp;#x27;http://www.w3.org/2000/svg&amp;#x27; version=&amp;#x27;1.1&amp;#x27;%3E%3C/svg%3E&quot; style=&quot;max-width:100%;display:block;position:static&quot;/&gt;&lt;/div&gt;&lt;div aria-hidden=&quot;true&quot; data-placeholder-image=&quot;&quot; style=&quot;opacity:1;transition:opacity 500ms linear;object-fit:contain&quot;&gt;&lt;/div&gt;&lt;img data-gatsby-image-ssr=&quot;&quot; data-main-image=&quot;&quot; style=&quot;object-fit:contain;opacity:0&quot; sizes=&quot;(min-width: 150px) 150px, 100vw&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; data-src=&quot;/static/5df5528946772487a6ab462ff2125f26/de3a1/icon.png&quot; data-srcset=&quot;/static/5df5528946772487a6ab462ff2125f26/f2a56/icon.png 38w,/static/5df5528946772487a6ab462ff2125f26/7458e/icon.png 75w,/static/5df5528946772487a6ab462ff2125f26/de3a1/icon.png 150w,/static/5df5528946772487a6ab462ff2125f26/30cdc/icon.png 300w&quot; alt=&quot;&quot;/&gt;&lt;noscript&gt;&lt;img data-gatsby-image-ssr=&quot;&quot; data-main-image=&quot;&quot; style=&quot;object-fit:contain;opacity:0&quot; sizes=&quot;(min-width: 150px) 150px, 100vw&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;/static/5df5528946772487a6ab462ff2125f26/de3a1/icon.png&quot; srcSet=&quot;/static/5df5528946772487a6ab462ff2125f26/f2a56/icon.png 38w,/static/5df5528946772487a6ab462ff2125f26/7458e/icon.png 75w,/static/5df5528946772487a6ab462ff2125f26/de3a1/icon.png 150w,/static/5df5528946772487a6ab462ff2125f26/30cdc/icon.png 300w&quot; alt=&quot;&quot;/&gt;&lt;/noscript&gt;&lt;script type=&quot;module&quot;&gt;const t=&quot;undefined&quot;!=typeof HTMLImageElement&amp;&amp;&quot;loading&quot;in HTMLImageElement.prototype;if(t){const t=document.querySelectorAll(&quot;img[data-main-image]&quot;);for(let e of t){e.dataset.src&amp;&amp;(e.setAttribute(&quot;src&quot;,e.dataset.src),e.removeAttribute(&quot;data-src&quot;)),e.dataset.srcset&amp;&amp;(e.setAttribute(&quot;srcset&quot;,e.dataset.srcset),e.removeAttribute(&quot;data-srcset&quot;));const t=e.parentNode.querySelectorAll(&quot;source[data-srcset]&quot;);for(let e of t)e.setAttribute(&quot;srcset&quot;,e.dataset.srcset),e.removeAttribute(&quot;data-srcset&quot;);e.complete&amp;&amp;(e.style.opacity=1)}}&lt;/script&gt;&lt;/div&gt;&lt;svg class=&quot;BeatingHeart-styles-module--svgHeartBeatAnim--3lgEg svgHeartBeatAnim&quot; id=&quot;i-heart&quot; viewBox=&quot;0 0 32 32&quot; width=&quot;32&quot; height=&quot;32&quot; fill=&quot;none&quot; stroke=&quot;#107db5&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;12.5%&quot;&gt;&lt;path d=&quot;M4 16 C1 12 2 6 7 4 12 2 15 6 16 8 17 6 21 2 26 4 31 6 31 12 28 16 25 20 16 28 16 28 16 28 7 20 4 16 Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;div data-gatsby-image-wrapper=&quot;&quot; class=&quot;gatsby-image-wrapper gatsby-image-wrapper-constrained&quot;&gt;&lt;div style=&quot;max-width:140px;display:block&quot;&gt;&lt;img alt=&quot;&quot; role=&quot;presentation&quot; aria-hidden=&quot;true&quot; src=&quot;data:image/svg+xml;charset=utf-8,%3Csvg height=&amp;#x27;161&amp;#x27; width=&amp;#x27;140&amp;#x27; xmlns=&amp;#x27;http://www.w3.org/2000/svg&amp;#x27; version=&amp;#x27;1.1&amp;#x27;%3E%3C/svg%3E&quot; style=&quot;max-width:100%;display:block;position:static&quot;/&gt;&lt;/div&gt;&lt;div aria-hidden=&quot;true&quot; data-placeholder-image=&quot;&quot; style=&quot;opacity:1;transition:opacity 500ms linear;object-fit:contain&quot;&gt;&lt;/div&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; data-srcset=&quot;/static/6de19c75415939f78affd2053e2afaac/1eb2a/github-student-backpack.webp 35w,/static/6de19c75415939f78affd2053e2afaac/ca9a9/github-student-backpack.webp 70w,/static/6de19c75415939f78affd2053e2afaac/895db/github-student-backpack.webp 140w,/static/6de19c75415939f78affd2053e2afaac/08b53/github-student-backpack.webp 280w&quot; sizes=&quot;(min-width: 140px) 140px, 100vw&quot;/&gt;&lt;img data-gatsby-image-ssr=&quot;&quot; data-main-image=&quot;&quot; style=&quot;object-fit:contain;opacity:0&quot; sizes=&quot;(min-width: 140px) 140px, 100vw&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; data-src=&quot;/static/6de19c75415939f78affd2053e2afaac/bbcdf/github-student-backpack.png&quot; data-srcset=&quot;/static/6de19c75415939f78affd2053e2afaac/89460/github-student-backpack.png 35w,/static/6de19c75415939f78affd2053e2afaac/26a99/github-student-backpack.png 70w,/static/6de19c75415939f78affd2053e2afaac/bbcdf/github-student-backpack.png 140w,/static/6de19c75415939f78affd2053e2afaac/b12f3/github-student-backpack.png 280w&quot; alt=&quot;&quot;/&gt;&lt;/picture&gt;&lt;noscript&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcSet=&quot;/static/6de19c75415939f78affd2053e2afaac/1eb2a/github-student-backpack.webp 35w,/static/6de19c75415939f78affd2053e2afaac/ca9a9/github-student-backpack.webp 70w,/static/6de19c75415939f78affd2053e2afaac/895db/github-student-backpack.webp 140w,/static/6de19c75415939f78affd2053e2afaac/08b53/github-student-backpack.webp 280w&quot; sizes=&quot;(min-width: 140px) 140px, 100vw&quot;/&gt;&lt;img data-gatsby-image-ssr=&quot;&quot; data-main-image=&quot;&quot; style=&quot;object-fit:contain;opacity:0&quot; sizes=&quot;(min-width: 140px) 140px, 100vw&quot; decoding=&quot;async&quot; loading=&quot;lazy&quot; src=&quot;/static/6de19c75415939f78affd2053e2afaac/bbcdf/github-student-backpack.png&quot; srcSet=&quot;/static/6de19c75415939f78affd2053e2afaac/89460/github-student-backpack.png 35w,/static/6de19c75415939f78affd2053e2afaac/26a99/github-student-backpack.png 70w,/static/6de19c75415939f78affd2053e2afaac/bbcdf/github-student-backpack.png 140w,/static/6de19c75415939f78affd2053e2afaac/b12f3/github-student-backpack.png 280w&quot; alt=&quot;&quot;/&gt;&lt;/picture&gt;&lt;/noscript&gt;&lt;script type=&quot;module&quot;&gt;const t=&quot;undefined&quot;!=typeof HTMLImageElement&amp;&amp;&quot;loading&quot;in HTMLImageElement.prototype;if(t){const t=document.querySelectorAll(&quot;img[data-main-image]&quot;);for(let e of t){e.dataset.src&amp;&amp;(e.setAttribute(&quot;src&quot;,e.dataset.src),e.removeAttribute(&quot;data-src&quot;)),e.dataset.srcset&amp;&amp;(e.setAttribute(&quot;srcset&quot;,e.dataset.srcset),e.removeAttribute(&quot;data-srcset&quot;));const t=e.parentNode.querySelectorAll(&quot;source[data-srcset]&quot;);for(let e of t)e.setAttribute(&quot;srcset&quot;,e.dataset.srcset),e.removeAttribute(&quot;data-srcset&quot;);e.complete&amp;&amp;(e.style.opacity=1)}}&lt;/script&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;We are super proud to announce that Polypane is now part of the &lt;a href=&quot;https://education.github.com/pack&quot;&gt;GitHub Student Developer Pack&lt;/a&gt;. Eligible students get free access to Polypane for a year and can sign up starting today by authenticating with GitHub here: &lt;a href=&quot;/github-students/&quot;&gt;Polypane for GitHub students&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Our mission at Polypane is to improve the workflow of designers and developers. We do that by offering a world-class development browser that includes the tools you need to develop, debug and test websites and web apps. Polypane nudges you in the right direction and makes things that are difficult to find out normally easily discoverable with a single click. Questions like &amp;#x27;does my site work on all mobile devices?&amp;#x27; &amp;#x27;Are all my meta tags correct?&amp;#x27; &amp;#x27;Is my design actually accessible?&amp;#x27; are easily answered with Polypane.&lt;/p&gt;&lt;p&gt;We are really excited to team up with GitHub to make Polypane accessible to students just starting out on their journey to become web developers and designers and we think Polypane will be a great help as they learn to make websites and web applications that work everywhere and for everyone.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CSS specificity calculator]]></title><description><![CDATA[If an element is targeted by multiple selectors, browser use the specificity of the selector to determine
which styling to apply. Each…]]></description><link>https://polypane.app/blog/css-specificity-calculator/</link><guid isPermaLink="false">https://polypane.app/blog/css-specificity-calculator/</guid><pubDate>Mon, 24 Feb 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If an element is targeted by multiple selectors, browser use the specificity of the selector to determine
which styling to apply. Each selector has a specificity that is determined by what you use in that selector:
elements, ID&amp;#x27;s, classes etc. This specificity is split up in different levels.&lt;/p&gt;&lt;p&gt;This CSS Selector specificity can be confusing if you&amp;#x27;re just starting out, or if you&amp;#x27;re working with a particularly
complex set of styles. Quickly figuring out which CSS selector has the highest specificity helps a lot in finding out
what&amp;#x27;s going on and getting your bearing on the styling.&lt;/p&gt;&lt;p&gt;To help with this, Polypane now has an online CSS specificity calculator:&lt;/p&gt;&lt;h3 id=&quot;online-css-selector-specificity-calculator&quot;&gt;&lt;a href=&quot;/css-specificity-calculator/&quot;&gt;Online CSS selector specificity calculator&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The Polypane CSS specificity calculator not only has the specificity, but it also tells you how it made that score, and
which parts of your selector fall in what category. There&amp;#x27;s also a short list of gotcha&amp;#x27;s you might run into when dealing with CSS Specificity.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[4 CSS layouts without using media queries]]></title><description><![CDATA[Do you always need media queries to make a website responsive? With flexbox and grid you can make responsive layouts
without having to…]]></description><link>https://polypane.app/blog/4-css-layouts-without-using-media-queries/</link><guid isPermaLink="false">https://polypane.app/blog/4-css-layouts-without-using-media-queries/</guid><pubDate>Wed, 22 Jan 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Do you always need media queries to make a website responsive? With flexbox and grid you can make responsive layouts
without having to define fixed breakpoints with media queries. &lt;a href=&quot;https://twitter.com/argyleink&quot;&gt;Adam Argyle&lt;/a&gt; recently
showed us a tweet-sized example of this in action, where just 13 lines of CSS give you 4 separate layouts.&lt;/p&gt;&lt;div&gt;&lt;div style=&quot;height:0;width:100%&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;All four layouts in action in &lt;a href=&quot;https://polypane.app&quot;&gt;Polypane&lt;/a&gt;:&lt;/p&gt;&lt;video src=&quot;/blogs/rw-wo-mq/resize.mp4&quot; autoplay=&quot;&quot; loop=&quot;&quot; controls=&quot;&quot; class=&quot;breakout&quot;&gt;&lt;/video&gt;&lt;p&gt;How does it work? The HTML is surprisingly simple. No wrappers or extra elements:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;placeholder&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;email&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;placeholder&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;Email Address&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;submit&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;Subscribe&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;form&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;If you want to use this in production, make sure all of these input fields have associated label elements.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;The CSS that does the heavy lifting is very small too:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;form&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; flex&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;flex-wrap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; wrap&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token selector&quot;&gt;&amp;amp; &amp;gt; input&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;flex&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1 1 10ch&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0.5rem&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token selector&quot;&gt;&amp;amp;[type=&amp;#x27;email&amp;#x27;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;flex&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3 1 30ch&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;#x27;s 13 rows, blank rows included!&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;What&amp;#x27;s that &lt;code class=&quot;language-text&quot;&gt;&amp;amp;&lt;/code&gt; doing there?&lt;/em&gt; &lt;br/&gt;
Adam wrote this using &lt;a href=&quot;https://preset-env.cssdb.org/&quot;&gt;postcss-preset-env&lt;/a&gt;, which is &amp;quot;Babel for CSS&amp;quot;. It lets you write
CSS using upcoming specs (like nesting) and compiles it to regular CSS.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;so-what-does-this-css-do&quot;&gt;So what does this CSS do?&lt;/h2&gt;&lt;p&gt;The styling for the form and input elements work in tandem to create the different layouts, so we&amp;#x27;ll go through
their CSS properties one by one. Lets start with the &lt;code class=&quot;language-text&quot;&gt;form&lt;/code&gt; element.&lt;/p&gt;&lt;h3 id=&quot;the-form&quot;&gt;The form&lt;/h3&gt;&lt;p&gt;The form is set to &lt;code class=&quot;language-text&quot;&gt;display:flex&lt;/code&gt; so has a flex layout. By default, that&amp;#x27;s a horizontal flex layout where all items fit a single row.&lt;/p&gt;&lt;p&gt;By adding &lt;code class=&quot;language-text&quot;&gt;flex-wrap: wrap&lt;/code&gt;, you specify that the flex layout can wrap to multiple rows if the elements don&amp;#x27;t fit a single row. Each of those rows will
behave as their own flex layout, which this code uses to its advantage.&lt;/p&gt;&lt;h3 id=&quot;the-inputs&quot;&gt;The inputs&lt;/h3&gt;&lt;p&gt;The meat of this technique lies in the &lt;code class=&quot;language-text&quot;&gt;flex&lt;/code&gt; property on the inputs. The &lt;code class=&quot;language-text&quot;&gt;flex&lt;/code&gt; property takes three values (e.g. &lt;code class=&quot;language-text&quot;&gt;1 1 10ch;&lt;/code&gt;) and is shorthand for three CSS properties:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;flex-grow&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;flex-shrink&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;flex-basis&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;flex-grow&lt;/code&gt; applies when there is more space in the surrounding element (the form in this case) than the elements
need. It take a positive number (or 0). The number indicates what part of the total an element takes.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The &amp;quot;part of the total&amp;quot; is best illustrated with an example. Say there are two elements, both having &lt;code class=&quot;language-text&quot;&gt;flex-grow: 1&lt;/code&gt;. They will both be equally wide at 1/2 of the total width. But if the second element has &lt;code class=&quot;language-text&quot;&gt;flex-grow: 2&lt;/code&gt;, the total number of parts is 1 + 2 = 3. The first item will then be 1/3rd of the total width, and the second element will be 2/3rd of the total width.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;flex-shrink&lt;/code&gt; works much in the same way, except that it is used when there is &lt;em&gt;less&lt;/em&gt; space than the elements would normally take up. Here, a higher number means it ends up being smaller.&lt;/p&gt;&lt;p&gt;In flexbox terminology, if the elements combined take up more space than available, their &lt;code class=&quot;language-text&quot;&gt;flexibility&lt;/code&gt; is set to &lt;code class=&quot;language-text&quot;&gt;shrink&lt;/code&gt;.
Otherwise it is set to &lt;code class=&quot;language-text&quot;&gt;grow&lt;/code&gt;. This is not something you set explicitly, but is useful to know when working with flex layouts.&lt;/p&gt;&lt;p&gt;In our 4-layout example &lt;code class=&quot;language-text&quot;&gt;flex-wrap&lt;/code&gt; is set to &lt;code class=&quot;language-text&quot;&gt;wrap&lt;/code&gt;, which means that the flexibility will never be
set to shrink. Instead, elements will wrap to the next row if they don&amp;#x27;t fit.&lt;/p&gt;&lt;p&gt;&lt;em&gt;At this point, I have to admit that the calculation example I gave for the flex-grow value was a little simplified. It works that way only
if the last property, &lt;code class=&quot;language-text&quot;&gt;flex-basis&lt;/code&gt;, is set to 0. Normally, flex-basis is set to &lt;code class=&quot;language-text&quot;&gt;auto&lt;/code&gt;, which makes things a little more complicated.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;When &lt;code class=&quot;language-text&quot;&gt;flex-basis&lt;/code&gt; is set to &lt;code class=&quot;language-text&quot;&gt;auto&lt;/code&gt;, the number set for &lt;code class=&quot;language-text&quot;&gt;flex-grow&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;flex-shrink&lt;/code&gt; also take into account the width of the element, either the implicit
width (called the &amp;#x27;content size&amp;#x27;) or an explicit &lt;code class=&quot;language-text&quot;&gt;width&lt;/code&gt;. So two elements that both have &lt;code class=&quot;language-text&quot;&gt;flex-grow:1&lt;/code&gt; might not end up being equally wide, if one of
them has much more content.&lt;/p&gt;&lt;p&gt;You can also set &lt;code class=&quot;language-text&quot;&gt;flex-basis&lt;/code&gt; to a value. In that situation, the initial size of an element is set to that value. In this layout, the &amp;quot;name&amp;quot; field and the button both get a value of &lt;code class=&quot;language-text&quot;&gt;10ch&lt;/code&gt;, and the &amp;quot;email&amp;quot; field is set to &lt;code class=&quot;language-text&quot;&gt;30ch&lt;/code&gt;.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;What&amp;#x27;s a &lt;code class=&quot;language-text&quot;&gt;ch&lt;/code&gt;?&lt;/em&gt; &lt;br/&gt;
One &lt;code class=&quot;language-text&quot;&gt;ch&lt;/code&gt; is equivalent to the width of the &amp;quot;0&amp;quot; character in a font.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The effect of this is that the name input and the button are initially 10ch wide, and the email field is 30ch wide. Because we are in a flex layout, that &lt;code class=&quot;language-text&quot;&gt;flex-basis&lt;/code&gt; value is used as the starting point for the &lt;code class=&quot;language-text&quot;&gt;flex-grow&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;flex-shrink&lt;/code&gt; value. Think of them as multipliers for the &lt;code class=&quot;language-text&quot;&gt;flex-basis&lt;/code&gt; value.&lt;/p&gt;&lt;p&gt;In this layout the &amp;quot;name&amp;quot; field and the button both have a &lt;code class=&quot;language-text&quot;&gt;flex-grow&lt;/code&gt; of 1, a &lt;code class=&quot;language-text&quot;&gt;flex-shrink&lt;/code&gt; of 1 and a &lt;code class=&quot;language-text&quot;&gt;flex-basis&lt;/code&gt; of &lt;code class=&quot;language-text&quot;&gt;10ch&lt;/code&gt;. The e-mail field has a &lt;code class=&quot;language-text&quot;&gt;flex-grow&lt;/code&gt; of 3, a &lt;code class=&quot;language-text&quot;&gt;flex-shrink&lt;/code&gt; of 1 and a &lt;code class=&quot;language-text&quot;&gt;flex-basis&lt;/code&gt; of 30ch.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;In other words&lt;/strong&gt;, the email field starts out 3 times as wide as the other field, &lt;em&gt;grows&lt;/em&gt; three times as fast but &lt;em&gt;shrinks&lt;/em&gt; at the same rate.&lt;/p&gt;&lt;h2 id=&quot;how-does-that-get-us-to-4-layouts&quot;&gt;How does that get us to 4 layouts?&lt;/h2&gt;&lt;p&gt;That&amp;#x27;s where the &lt;code class=&quot;language-text&quot;&gt;flex-wrap&lt;/code&gt; comes into play. When elements do not naturally fit side-by-side, they go to the next row. Let&amp;#x27;s go layout-by-layout from small to large and see what happens.&lt;/p&gt;&lt;h3 id=&quot;the-smallest-layout&quot;&gt;The smallest layout&lt;/h3&gt;&lt;img alt=&quot;Screenshot of first layout&quot; src=&quot;/blogs/rw-wo-mq/i1.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;The three elements are stacked vertically. Here&amp;#x27;s what happens:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;There is not enough space to have all three elements side-by-side (their total is 50ch wide, 10 + 30 + 10), so elements will wrap to the next row.&lt;/li&gt;&lt;li&gt;Two of them together (either name and email, or email and button) also don&amp;#x27;t fit, so the end result is that all of them are on their own row.&lt;/li&gt;&lt;li&gt;We end up with three rows.&lt;/li&gt;&lt;li&gt;Each row is it&amp;#x27;s own smaller flex layout, and each element on a single row is smaller than the total width.&lt;/li&gt;&lt;li&gt;All of them have a positive &lt;code class=&quot;language-text&quot;&gt;flex-grow&lt;/code&gt; value, and don&amp;#x27;t share their row with other element, so all of them grow to the full width of their own row.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;the-second-layout&quot;&gt;The second layout&lt;/h3&gt;&lt;img alt=&quot;Screenshot of second layout&quot; src=&quot;/blogs/rw-wo-mq/i2.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;The name field takes the full width, and the email and subscribe button are on row together. Here&amp;#x27;s what happens:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;There is not enough space to have all three elements side-by-side, so elements will wrap to the next row.&lt;/li&gt;&lt;li&gt;&lt;em&gt;Things get sneaky.&lt;/em&gt; Even though the name field and the button have the same flex values, a &lt;code class=&quot;language-text&quot;&gt;button&lt;/code&gt; type element has a slightly different content size, so ends up being slightly smaller than a regular input field. &lt;em&gt;Browsers, right?&lt;/em&gt;&lt;/li&gt;&lt;li&gt;Name + email don&amp;#x27;t fit on a single row so email wraps to the next row. Because of the tiny difference, email + button &lt;em&gt;do&lt;/em&gt; fit on a single row.&lt;/li&gt;&lt;li&gt;We end up with two flex rows.&lt;/li&gt;&lt;li&gt;The first row has just the name, so that takes full width because of &lt;code class=&quot;language-text&quot;&gt;flex-grow&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;The second row is wider than both the email field and button combined, so flex-grow is used to make them fill up the width, the email field at a much bigger ratio compared to the button.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If the last element was not a button, this layout wouldn&amp;#x27;t be possible.&lt;/p&gt;&lt;h3 id=&quot;the-third-layout&quot;&gt;The third layout&lt;/h3&gt;&lt;img alt=&quot;Screenshot of third layout&quot; src=&quot;/blogs/rw-wo-mq/i3.png&quot; class=&quot;imgshadow breakout&quot;/&gt;&lt;p&gt;The name field and email field are shown side by side, with the button below it. What happens:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;There is not enough space to have all three elements side-by-side so elements can wrap to the next row.&lt;/li&gt;&lt;li&gt;The name and email fields fit side by side, so it&amp;#x27;s just the button that wraps to the next row.&lt;/li&gt;&lt;li&gt;Name and email fill out the first row in their flex-grow/flex-basis ratio, and the button fills out the second row completely.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;the-fourth-layout&quot;&gt;The fourth layout&lt;/h3&gt;&lt;img alt=&quot;Screenshot of fourth layout&quot; src=&quot;/blogs/rw-wo-mq/i4.png&quot; class=&quot;imgshadow breakout&quot;/&gt;&lt;p&gt;This is the simplest layout. The total width is wider than all elements, so they&amp;#x27;re distributed on a single row in their respective ratio.&lt;/p&gt;&lt;p&gt;But what about that button? You&amp;#x27;d expect it to be as wide as the name field, since they have the same flex value. But here&amp;#x27;s where the sneaky thing from the second layout comes into play again: the content size of the button is less wide and so ends up being smaller.&lt;/p&gt;&lt;h2 id=&quot;responsive-websites-without-media-queries&quot;&gt;Responsive websites without media queries?&lt;/h2&gt;&lt;p&gt;Recreating this layout with media queries is possible but would take you 3 breakpoints at set widths and only works when the form is the full width of the page.&lt;/p&gt;&lt;p&gt;With this flexbox solution you can place the form element anywhere and it will fit the element it&amp;#x27;s in, giving you even more flexibility than just media queries would give you.&lt;/p&gt;&lt;p&gt;Using modern layout algorithm like flexbox and grid give you a lot of extra flexibility when it comes to the way your elements are laid out without needing to explicitly define them. As you can see, they let you do some pretty powerful things!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 2.1: Edit all your panes at the same time]]></title><description><![CDATA[With Polypane, we want to give you better insights into your site and make the entire developer/designer workflow faster. With Polypane 2.…]]></description><link>https://polypane.app/blog/polypane-2-1-edit-all-your-panes-at-the-same-time/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-2-1-edit-all-your-panes-at-the-same-time/</guid><pubDate>Tue, 14 Jan 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;With Polypane, we want to give you better insights into your site and make the entire developer/designer workflow faster. With Polypane 2.1, we&amp;#x27;ve made some huge improvements for both of those goals.&lt;/p&gt;&lt;h2 id=&quot;whats-new&quot;&gt;What&amp;#x27;s new?&lt;/h2&gt;&lt;p&gt;Quick list of the major new features:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Live CSS&lt;/strong&gt; Edit all panes at the same time&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Social media previews&lt;/strong&gt; See what your page looks like when shared on Facebook, Slack, Twitter and LinkedIn.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Meta info&lt;/strong&gt; Get a full overview of all your meta tags&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Handoff / browse&lt;/strong&gt; Use Avocode, Zeplin and more directly in Polypane&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Workspaces UI&lt;/strong&gt; Quickly switch between your favorite pane sets&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Beyond that, we also added network throttling, new and improved overlays, better indicators, ways to detect when your site is shown in Polypane, speed improvements, and many more smaller features.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;If you don&amp;#x27;t have Polypane yet there is a free 14 day trial available. &lt;a href=&quot;/pricing/&quot;&gt;Get it here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;video src=&quot;/blogs/polypane-2-1/livecss.mp4&quot; autoplay=&quot;&quot; loop=&quot;&quot; class=&quot;breakout&quot;&gt;&lt;/video&gt;&lt;h3 id=&quot;live-css-panel&quot;&gt;Live CSS Panel&lt;/h3&gt;&lt;p&gt;Write CSS and SCSS that is &lt;strong&gt;applied to all panes at the same time.&lt;/strong&gt; With the Live CSS panel, quickly trying out new styling for your site on multiple sizes is super easy and very satifying.&lt;/p&gt;&lt;p&gt;The CSS editor is fully featured, knows all CSS declarations and will suggest the appropriate ones as you type, so writing CSS is &lt;em&gt;super fast&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Live CSS comes with an element selector. This will let you click on any element in any pane, go through the CSS and find &lt;em&gt;the actual selectors for that element&lt;/em&gt; and give them as suggestions in the editor. Selecting elements to write CSS for is super quick and doesn&amp;#x27;t require you to open devtools to find them.&lt;/p&gt;&lt;p&gt;Lastly, all of the Google fonts are available when you write Live CSS, so trying out new fonts is as easy as saying &lt;code class=&quot;language-text&quot;&gt;font-family: Aladin&lt;/code&gt;. Polypane will automatically load in the fonts for you.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/docs/live-css/&quot;&gt;More on the Live CSS panel&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;meta-information-panel&quot;&gt;Meta information panel&lt;/h3&gt;&lt;p&gt;The meta information panel shows you all the information that&amp;#x27;s defined in your &lt;code class=&quot;language-text&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt;. Your title, description and favicon, but also all your meta tags, viewport declaration, language and other information. This makes it super easy to spot missing info or typos.&lt;/p&gt;&lt;img alt=&quot;Meta info for Spiritapp.io&quot; src=&quot;/blogs/polypane-2-1/meta.png&quot; class=&quot;imgshadow breakout&quot;/&gt;&lt;h3 id=&quot;social-media-previews--rich-snippets&quot;&gt;Social media previews / rich snippets&lt;/h3&gt;&lt;p&gt;The meta information panel also gives you &lt;strong&gt;previews of the social cards of Twitter, Facebook, Slack and Linkedin, as well as the Google search result&lt;/strong&gt;. For Twitter and Slack, we also support their dark mode.&lt;/p&gt;&lt;p&gt;In developing this feature, we found out that none of the official social card previews of Twitter, Facebook and Linkedin accurately showed what your card was going to look like. &lt;em&gt;They&amp;#x27;re all out of date!&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Additionally, despite their documentation claiming otherwise, all sites use whatever meta information is available. So we painstakingly reverse engineered the way the social cards were &lt;em&gt;actually&lt;/em&gt; rendered and we replicate that with pixel-perfect accuracy.&lt;/p&gt;&lt;p&gt;Our generated social previews: Twitter, Facebook, Linkedin &amp;amp; Slack (clockwise.)&lt;/p&gt;&lt;img alt=&quot;Social previews for Doka.js. Clockwise: Twitter, Facebook, Linkedin, Slack&quot; src=&quot;/blogs/polypane-2-1/previews.png&quot; style=&quot;margin-left:auto;margin-right:auto;display:block&quot;/&gt;&lt;p&gt;&lt;a href=&quot;/docs/meta-information/&quot;&gt;More on the Meta information panel&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;handoffbrowse-panel&quot;&gt;Handoff/browse panel&lt;/h3&gt;&lt;p&gt;An important aspect of modern development is handoff: tools that take a design and then display the CSS and dimensions of elements and let you export images, so you don&amp;#x27;t have to click around in a design tool to figure all that stuff out.&lt;/p&gt;&lt;p style=&quot;display:flex;justify-content:space-around;align-items:center;flex-wrap:wrap&quot;&gt;
  &lt;img alt=&quot;Avocode&quot; src=&quot;/blogs/polypane-2-1/avocode.svg&quot; style=&quot;width:100px&quot;/&gt;
  &lt;img alt=&quot;Figma&quot; src=&quot;/blogs/polypane-2-1/figma.svg&quot; style=&quot;height:30px&quot;/&gt;
  &lt;img alt=&quot;Invision&quot; src=&quot;/blogs/polypane-2-1/invision.svg&quot; style=&quot;width:100px&quot;/&gt;
  &lt;img alt=&quot;Marvel&quot; src=&quot;/blogs/polypane-2-1/marvel.svg&quot; style=&quot;width:80px&quot;/&gt;
  &lt;img alt=&quot;Zeplin&quot; src=&quot;/blogs/polypane-2-1/zeplin.svg&quot; style=&quot;height:30px&quot;/&gt;
  &lt;img alt=&quot;Adobe XD&quot; src=&quot;/blogs/polypane-2-1/xd.svg&quot; style=&quot;height:30px&quot;/&gt;
&lt;/p&gt;&lt;p&gt;With the handoff panel, you can use all these handoff tools directly inside of Polypane. Your design spec and the site are always side-by-side.&lt;/p&gt;&lt;p&gt;We support a number of handoff tools natively, like Avocode, Invision and Zeplin, but you can also fill in a custom URL.&lt;/p&gt;&lt;p&gt;&lt;em&gt;A custom URL you say? Does that mean you put a browser in a browser?&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Well... &lt;strong&gt;Yeah!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;You can also use the Custom URL option to keep open any reference that you&amp;#x27;re working with, like MDN, CanIUse, the React documentation or any API documentation.&lt;/p&gt;&lt;img alt=&quot;Custom URL showing React documentation&quot; src=&quot;/blogs/polypane-2-1/customurl.png&quot; class=&quot;imgshadow breakout&quot;/&gt;&lt;p&gt;&lt;a href=&quot;/docs/browse/&quot;&gt;More on the Handoff/browse panel&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;workspaces-panel&quot;&gt;Workspaces panel&lt;/h3&gt;&lt;p&gt;Workspaces were introduced in Polypane 1.1 as a way to save sets of panes using shortcuts or the window menu. Now they have a visual interface.&lt;/p&gt;&lt;p&gt;The workspaces panel contains a visual overview of all 9 workspaces (with a preview) and lets you easily save and restore them.&lt;/p&gt;&lt;p&gt;New in the workspaces panel is that you can name your workspace, so you no longer have to remember if, for example, Your android devices were in workspace 1 or 2.&lt;/p&gt;&lt;h3 id=&quot;where-you-can-find-all-these-new-features-the-side-panel&quot;&gt;Where you can find all these new features: the side panel&lt;/h3&gt;&lt;p&gt;With the side panel, Polypane gains a new place to add functionality and show site information that is not so easily surfaced in other browsers, but still super important.&lt;/p&gt;&lt;p&gt;You can dock the side panel either on the right or on the bottom so you can make it fit your favorite screen configuration.&lt;/p&gt;&lt;img alt=&quot;Side panel&quot; src=&quot;/blogs/polypane-2-1/sidepanel.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;h2 id=&quot;new-and-updated-overlays&quot;&gt;New and updated overlays&lt;/h2&gt;&lt;p&gt;In Polypane 2 we introduced overlays: simulators and debuggers you could overlay on a pane. These simulators let you quickly check accessibility issues and simulate things like color blindness, or viewing your site in bright sunlight. In Polypane 2.1, we&amp;#x27;ve added more overlays and improved existing ones.&lt;/p&gt;&lt;img alt=&quot;New and improved overlays&quot; src=&quot;/blogs/polypane-2-1/overlays.png&quot; class=&quot;imgshadow breakout&quot;/&gt;&lt;p&gt;There is a new Z-index overlay (top left) that highlights which elements have a defined z-index. It&amp;#x27;s based on the plugin that Addy Osmani wrote for &lt;a href=&quot;https://github.com/GoogleChromeLabs/ProjectVisBug&quot;&gt;Visbug&lt;/a&gt;, with UI improvements that we&amp;#x27;re contributing back to that project as well. We&amp;#x27;ve improved readablity and also show the z-index stack for each element that has one.&lt;/p&gt;&lt;p&gt;We have two new visual impairment simulators: Glaucoma (top center) and Cataracts (top right). Both of these eye conditions blur and dull your vision.&lt;/p&gt;&lt;p&gt;The color contrast checker (bottom left) now works better when backgrounds are defined for ancestors, and no longer needs a reload.&lt;/p&gt;&lt;p&gt;Bright sunlight (bottom center) now has less of a blowout and an additional glare to simulate the reflections that the glass on a device creates.&lt;/p&gt;&lt;p&gt;We have a new Night mode (bottom right) that simulates the way your page looks when Night mode is active, where screens dial down the blue tones and brightness.&lt;/p&gt;&lt;h2 id=&quot;network-throttling&quot;&gt;Network throttling&lt;/h2&gt;&lt;img alt=&quot;Throttling selector&quot; src=&quot;/blogs/polypane-2-1/throttling.png&quot; class=&quot;imgshadow&quot; style=&quot;margin:0 0 1rem 1rem;float:right&quot;/&gt;&lt;p&gt;In Isolate panes mode you can now throttle your network connection alongside emulating devices, to test how a page behaves in more realistic settings. We currently have 4 settings: Online, Mid tier mobile, low-end mobile and offline.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/docs/emulation/&quot;&gt;More on Network throttling&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;detecting-polypane&quot;&gt;Detecting Polypane&lt;/h2&gt;&lt;p&gt;If you&amp;#x27;re developing your site, you might want to show additional debug information or test different variants of your page in different panes. Starting in Polypane 2.1 we offer two ways to detect your site running in Polypane, through our User agent and through a &lt;code class=&quot;language-text&quot;&gt;__polypane&lt;/code&gt; property on the &lt;code class=&quot;language-text&quot;&gt;window&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/docs/detecting-polypane/&quot;&gt;Read about how to detect Polypane&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;custom-tooltips&quot;&gt;Custom tooltips&lt;/h2&gt;&lt;p&gt;We switched out the native tooltips for all buttons for our custom ones, so they show up quicker and look better, making it easier to get started with Polypane.&lt;/p&gt;&lt;h2 id=&quot;indicators&quot;&gt;Indicators&lt;/h2&gt;&lt;img alt=&quot;All indicators active&quot; src=&quot;/blogs/polypane-2-1/indicators.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;Reference image, Overlays, Emulation and Devtools all have a blue dot when they&amp;#x27;re active.&lt;/p&gt;&lt;p&gt;For Emulation, we show a yellow dot when the network is throttled, and if you have an error in your console, the Devtools icon will have a red dot. This will tell you at a glance if there is an issue you need to look at, without needing to open the devtools. Emulation and Devtools are available in Isolate Pane mode.&lt;/p&gt;&lt;h2 id=&quot;screenshotting-improvements&quot;&gt;Screenshotting improvements&lt;/h2&gt;&lt;p&gt;Each release we further tweak and improve the screenshots we create to get a better result. Polypane is already much better than Chrome, Firefox and nearly all online tools (check out &lt;a href=&quot;/screenshot-comparison/&quot;&gt;Screenshot comparison page&lt;/a&gt; to find out how) and we&amp;#x27;re continuing to make the screenshots better for dynamic websites. Scripts now load better and animations are handled more consistently.&lt;/p&gt;&lt;h2 id=&quot;performance-improvements&quot;&gt;Performance improvements&lt;/h2&gt;&lt;p&gt;We&amp;#x27;ve rewritten parts of Polypane to make them faster and more performant. The synchronised scrolling is now an order of magnitude faster, and most of the messaging and handling of content is done asynchronously, making the UI more responsive.&lt;/p&gt;&lt;h2 id=&quot;full-changelog&quot;&gt;Full changelog:&lt;/h2&gt;&lt;p&gt;There&amp;#x27;s more new features, improvements and fixes in this release so read through the full changelog below. All new features are fully documented in our &lt;a href=&quot;/docs/&quot;&gt;docs&lt;/a&gt; too.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Side panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Site meta information panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Live CSS panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Handoff/browse panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Workspaces panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; New overlays: Z-index, Glaucoma, Cataracts and Night mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Network throttling&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Live reload delay option&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Detect Polypane from your site&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Use custom tooltips for all buttons&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Faster and more performant scroll syncing&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Color contrast overlay has improved calculations&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Color contrast overlay no longer needs a reload&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Bright sunlight overlay now simulates glare&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Updated emulated user agents&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Better full page screenshotting support&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Icons in the pane header now show activity dots&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Pane devtools show red dot when there are errors&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Clicking pane devtools icon will refocus it if already open&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; View mode and Filter buttons simplified&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; All popovers will stay inside window&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Close all panes option added to the menu&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Warning when opening more than 15 panes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Added the f6 shortcut to focus address bar&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Tweak UI icons&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Lower bound of generated breakpoints is now 320px&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Full mode no longer overflows screen&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Speed and responsiveness improvements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Zoom-to-fit for panes works again&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Support multiple levels of imports for breakpoint detection&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; No longer blocking scripts when making screenshots&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; 404 page in full mode no longer overlays icons&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Prevent syncing of file inputs&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;211-update&quot;&gt;2.1.1 Update&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Live CSS now supports Variable Fonts&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Updated Google SERP preview&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Update Twitter preview image aspect ratio&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Add Sketch Cloud to handoff panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Add context menu to handoff panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Support explicit downloads in handoff panel&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Device mode button in devtools is hidden&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; context menu being unresponsive on isolated panes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; crash when opening sites that patch &lt;code class=&quot;language-text&quot;&gt;document&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; dark mode on first launch on Mac being set incorrectly&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; workspace UI missing dark mode style&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; spacing issues in pane header&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;212-update&quot;&gt;2.1.2 Update&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Svelte developer tools in Devtools manager&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Higher contrast in Live CSS in dark mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Bump font-size in Live CSS editor&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Panes outside of view are unsuspended quicker&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Handoff panel custom urls update quicker&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Overlay switching happens quicker&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Full page screenshot get 40% speed improvement&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Full mode was 1 pixel too narrow&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Crash with invalid og:url value&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Outdated parameters when making overview screenshot&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Live CSS preserve checkbox alignment&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Occasional reload loop in isolate pane mode&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;getting-polypane-21&quot;&gt;Getting Polypane 2.1&lt;/h2&gt;&lt;p&gt;Polypane will automatically update on Mac and Windows. Linux users need to download the new version from
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; and if you&amp;#x27;re on Mac and Windows but don&amp;#x27;t want to wait on the update popup, you can find
your download there as well.&lt;/p&gt;&lt;p&gt;If you don&amp;#x27;t have Polypane yet there is a free 14 day trial available. &lt;a href=&quot;/pricing/&quot;&gt;Get it here&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Responsive Design Glossary]]></title><description><![CDATA[With responsive design come a lot of new terms and concepts  and there wasn't really a single place that listed them all
with explanations…]]></description><link>https://polypane.app/blog/responsive-design-glossary/</link><guid isPermaLink="false">https://polypane.app/blog/responsive-design-glossary/</guid><pubDate>Mon, 02 Dec 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;With responsive design come a lot of new terms and concepts&lt;/strong&gt; and there wasn&amp;#x27;t really a single place that listed them all
with explanations in plain English. So we created one. No super long articles that bury the explanation
two thirds of the way in, but the shortest, clearest explanation we can give. If something can be explained in a single
sentence, a single sentence it is, no need to waste your time!&lt;/p&gt;&lt;p&gt;In plain English also means that we didn&amp;#x27;t write it to become the &lt;em&gt;Wikipedia of responsive design&lt;/em&gt;. The term and
explanation are to the point and sometimes opinionated. We want you to do the right thing, even if there&amp;#x27;s a term for
the wrong thing!&lt;/p&gt;&lt;p&gt;After you get the introduction and explanation of a term, you&amp;#x27;re more than welcome to dive into deeper
explanations and articles (and we link a few of them we particularly like) but that&amp;#x27;s up to you.&lt;/p&gt;&lt;p&gt;Go check out our &lt;a href=&quot;/responsive-design-glossary/&quot;&gt;Responsive Design Glossary&lt;/a&gt; and if you like it, please share!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 2: device emulation, new modes and simulators]]></title><description><![CDATA[Polypane 2 is out! In Polypane 2 we're introducing a bunch of often-asked for features, like full device emulation, filtering and a vertical…]]></description><link>https://polypane.app/blog/polypane-2-device-emulation-new-modes-and-simulators/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-2-device-emulation-new-modes-and-simulators/</guid><pubDate>Wed, 06 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 2 is out! In Polypane 2 we&amp;#x27;re introducing a bunch of often-asked for features, like full device emulation, filtering and a vertical view mode but also some completely new functionality that just might change how you build websites: overlays, simulators and visual diffing.&lt;/p&gt;&lt;p&gt;These new features give you better insights in your site right at your fingertips and make laborious tasks like contrast checking or QA much, much faster.&lt;/p&gt;&lt;h2 id=&quot;new-logo&quot;&gt;New logo&lt;/h2&gt;&lt;img src=&quot;/icons/icon-144x144.png&quot; style=&quot;float:left;margin-right:1rem;margin-top:2rem&quot;/&gt;&lt;p&gt;We decided to give the logo a little refresh. The colors in the previous version were a little dull and no longer fit with the rest of the colors in our design.&lt;/p&gt;&lt;p&gt;The new logo is also more legible in small sizes, feels fresher, and if you squint it kind of looks like a P.&lt;/p&gt;&lt;h2 id=&quot;new-view-modes&quot;&gt;New view modes&lt;/h2&gt;&lt;p&gt;We streamlined the view modes in Polypane. There are now four: Horizontal, which is the default view, Vertical, which is new and lets you scroll vertically to see all panes, Focus mode and Full mode. Devtools mode is gone because Devtools extensions can now be used everywhere with our new isolate panes feature (read on for more about that).&lt;/p&gt;&lt;p&gt;Vertical view mode is really nice to get a really high-level overview of your site by zooming all the way out:&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-2/vertical.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;All view modes now have single-key shortcuts so switching between them is even faster. Read more about them in the documentation: &lt;a href=&quot;/docs/layouts/&quot;&gt;view modes&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;overlays-and-simulators&quot;&gt;Overlays and simulators&lt;/h2&gt;&lt;p&gt;Polypane now supports &amp;quot;Overlays&amp;quot; for each pane. We already had an overlay for all panes with our &amp;quot;layout debugging&amp;quot; feature, but they can now be applied per pane and the available number of overlays has grown to over 15 items.&lt;/p&gt;&lt;p&gt;Simulate all versions of color blindness, quickly test your site for accessibility issues or make your page editable to quickly make text changes.  There&amp;#x27;s a few more overlays, so try them out!&lt;/p&gt;&lt;p&gt;Overlays will help you develop faster, catch bugs earlier, test your site in new ways and in the end, produce better websites.&lt;/p&gt;&lt;img src=&quot;/blogs/polypane-2/overlays.png&quot; class=&quot;imgshadow&quot;/&gt;&lt;p&gt;&lt;em&gt;In the image above from left to right we have: an accessibility check, a colorblindness simulator, a farsightedness simulator and a dyslexia simulator.&lt;/em&gt;&lt;/p&gt;&lt;h2 id=&quot;isolate-panes-in-beta&quot;&gt;Isolate panes (in beta)&lt;/h2&gt;&lt;p&gt;Isolate panes is a new mode that changes the way Polypane works. Websites in Polypane up to now had a shared context, which meant that for example we had a single devtools for all panes. With isolate panes, each pane has its own context. With this each pane has access to devtools extensions, and we can do &lt;strong&gt;full device emulation&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;If you&amp;#x27;re doing javascript-heavy sites, or want to test with device emulation, turning Isolate panes on in the edit menu can really improve the experience you have in Polypane. &lt;em&gt;Since Polypane 4 isolate panes are out of beta&lt;/em&gt;&lt;/p&gt;&lt;h2 id=&quot;device-emulation&quot;&gt;Device emulation&lt;/h2&gt;&lt;img src=&quot;/blogs/polypane-2/emulation.png&quot; class=&quot;imgshadow&quot; style=&quot;float:right;margin-left:1rem;margin-top:2rem&quot;/&gt;&lt;p&gt;You can set the device type, emulate touch, configure the pixelRatio and set the user agent. Our Device presets have been updated to include these, so they will automatically be applied in Isolate panes mode.&lt;/p&gt;&lt;h3 id=&quot;custom-http-headers&quot;&gt;Custom HTTP headers&lt;/h3&gt;&lt;p&gt;A unique new feature in Polypane is the ability to set custom headers per pane.&lt;/p&gt;&lt;p&gt;With custom headers, you can send extra information to your server and test things like multiple languages using the &lt;code class=&quot;language-text&quot;&gt;accept-language&lt;/code&gt; header, or come up with your own headers and configure your server to do things like test multiple themes, print additional debug information or discard destructive actions so testing forms becomes much easier. Anything is possible.&lt;/p&gt;&lt;p&gt;Read more about &lt;a href=&quot;/docs/emulation/&quot;&gt;device emulation and custom HTTP headers&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;visual-diffing-with-reference-images&quot;&gt;Visual diffing with reference images&lt;/h2&gt;&lt;video loop=&quot;&quot; autoplay=&quot;&quot; playsinline=&quot;&quot;&gt;&lt;source src=&quot;/static/reference-f14b35b34c27c1a62c84db3a1de8c7f3.mp4&quot; type=&quot;video/mp4&quot;/&gt;&lt;/video&gt;&lt;p&gt;Each pane can now have a reference image applied to it. Reference images can be overlaid or shown side-by-side with pane. You can use this to compare a site to it&amp;#x27;s original design, or compare a site to a screenshot made earlier.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;We don&amp;#x27;t think website should look exactly the same as the design, and they&amp;#x27;re always going to be cross-browser differences so pixel-perfect matching shouldn&amp;#x27;t be the goal.&lt;/strong&gt; But this will significantly speed up the work for anyone doing QA or checking that a design has been implemented correctly, and combining Polypane&amp;#x27;s screenshot functionality with the visual diffing option in the reference image feature is immensely powerful.&lt;/p&gt;&lt;p&gt;Find out more about &lt;a href=&quot;/docs/reference-image/&quot;&gt;reference images&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;filtering-panes&quot;&gt;Filtering panes&lt;/h2&gt;&lt;p&gt;You can now quickly filter panes based on their device category (Mobile, Tablet, Desktop and Other). If you have a custom list of device presets, it will use your own custom categories. This will quickly let you toggle hide and show various types of devices without losing your custom set panes.&lt;/p&gt;&lt;h2 id=&quot;update-to-chromium-78&quot;&gt;Update to Chromium 78&lt;/h2&gt;&lt;p&gt;Polypane is now running on Chromium 78, bringing it up-to-date with Chrome itself.&lt;/p&gt;&lt;h2 id=&quot;full-changelog&quot;&gt;Full changelog:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Vertical view mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Overlays and simulators&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Device emulation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Visual diffing support with reference images&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Filter panes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; Isolate panes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt; New icon&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Upgrade to Chromium 78&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Better no-caching support&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Shortcuts to switch view modes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; Remember last used folder for live reload&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Reload same url works correctly&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Support parsing CSS without media queries&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt; Close button and quickswitcher are no longer overlaid by window controls on mac&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;update-notes&quot;&gt;Update notes&lt;/h2&gt;&lt;p&gt;Because of the upgrade to Chromium 78, you will have to reinstall your devtools extensions for them to work.&lt;/p&gt;&lt;h2 id=&quot;getting-polypane-2&quot;&gt;Getting Polypane 2&lt;/h2&gt;&lt;p&gt;Polypane will automatically update on Mac and Windows. Linux users need to download the new version from
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; and if you&amp;#x27;re on Mac and Windows but don&amp;#x27;t want to wait on the update popup, you can find
your download there as well.&lt;/p&gt;&lt;p&gt;If you don&amp;#x27;t have Polypane yet there is a free 14 day trial available. &lt;a href=&quot;/pricing/&quot;&gt;Get it here&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 1.3: Full page mode and screenshot improvements]]></title><description><![CDATA[Polypane 1.3 adds a full page mode, screenshot improvements and shortcuts for the quick switcher, as well as laying the
groundwork for the…]]></description><link>https://polypane.app/blog/polypane-1-3-full-page-mode-and-screenshot-improvements/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-1-3-full-page-mode-and-screenshot-improvements/</guid><pubDate>Tue, 24 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Polypane 1.3 adds a full page mode, screenshot improvements and shortcuts for the quick switcher, as well as laying the
groundwork for the upcoming Polypane 2.&lt;/p&gt;&lt;h2 id=&quot;whats-new-in-this-release&quot;&gt;What&amp;#x27;s new in this release?&lt;/h2&gt;&lt;h3 id=&quot;full-mode&quot;&gt;Full mode&lt;/h3&gt;&lt;p&gt;Show a site in the full width of your browser window. Yep, just like other browsers. When building a website, you&amp;#x27;re not
always working on the responsive design. If you&amp;#x27;re working on some interaction or javascript, having just a large, full
width site available is really helpful. Full mode supports developer tools extensions so debugging JavaScript applications
works great. Switch to it by right-clicking on the Eye icon.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/blogs/polypane1-3/fullpage.png&quot; alt=&quot;fullpage&quot;/&gt;&lt;/p&gt;&lt;h3 id=&quot;full-page-screenshots-improvements&quot;&gt;Full page screenshots improvements&lt;/h3&gt;&lt;p&gt;Polypane is best in class when it comes to generating full page screenshots, and we&amp;#x27;ve improved it even more in this
release. Videos and page styling that is applied asynchronously while scrolling are now rendered more consistently. Fixed elements
are placed better and more scrollbars are hidden, even if you scroll different elements on your page. This results in
screenshots that are even closer to what you see when just scrolling the web page.&lt;/p&gt;&lt;h3 id=&quot;quick-switcher-arrow-key-support&quot;&gt;Quick switcher arrow key support&lt;/h3&gt;&lt;p&gt;When in Focus mode or Devtools mode, you can now use the arrow keys to quickly switch between your various panes or breakpoints. This
is a really, &lt;em&gt;really&lt;/em&gt; quick way to quickly check a design.&lt;/p&gt;&lt;h3 id=&quot;in-app-release-notes&quot;&gt;In-app release notes&lt;/h3&gt;&lt;p&gt;After updating the app, you&amp;#x27;re now greeted with a quick popover showing you the highlights of the latest release and a link
to its blogpost for more information.&lt;/p&gt;&lt;h3 id=&quot;changes-to-updating&quot;&gt;Changes to updating&lt;/h3&gt;&lt;p&gt;Polypane now only updates on user action rather than on next restart, and if it has trouble updating, it will guide you
to the download page instead. You can also manually check for updates.&lt;/p&gt;&lt;h3 id=&quot;account-switching&quot;&gt;Account switching&lt;/h3&gt;&lt;p&gt;If you want to switch to a new account for your Polypane installation, you can now unlink your current account via the menu. Perfect
for those of you that were testing Polypne and getting a new account through your employer.&lt;/p&gt;&lt;h3 id=&quot;proxy-support&quot;&gt;Proxy support&lt;/h3&gt;&lt;p&gt;If you&amp;#x27;re behind a proxy, Polypane will now automatically use it.&lt;/p&gt;&lt;h3 id=&quot;workpace-updates&quot;&gt;Workpace updates&lt;/h3&gt;&lt;p&gt;You can now find workspaces in the main menu, where you can save and restore them in addition to using the shortcuts.&lt;/p&gt;&lt;h2 id=&quot;full-changelog&quot;&gt;Full changelog:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;new&lt;/strong&gt; Full Page mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;new&lt;/strong&gt; In-app release notes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;new&lt;/strong&gt; Right-click support for opening and copying links&lt;/li&gt;&lt;li&gt;&lt;strong&gt;improvement&lt;/strong&gt; Arrow key support for quickswitcher&lt;/li&gt;&lt;li&gt;&lt;strong&gt;improvement&lt;/strong&gt; Proxy support&lt;/li&gt;&lt;li&gt;&lt;strong&gt;improvement&lt;/strong&gt; Full page screenshot improvements&lt;/li&gt;&lt;li&gt;&lt;strong&gt;improvement&lt;/strong&gt; Workspaces can now be opened from the menu&lt;/li&gt;&lt;li&gt;&lt;strong&gt;improvement&lt;/strong&gt; CSS breakpoint detection in devtools mode reads external CSS too&lt;/li&gt;&lt;li&gt;&lt;strong&gt;improvement&lt;/strong&gt; Updating Polypane now only happens on user action&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt; You can manually unlink your account from the menu&lt;/li&gt;&lt;li&gt;&lt;strong&gt;bugfix&lt;/strong&gt; Prevent Polypane from crashing in certain situations in devtools mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;bugfix&lt;/strong&gt; Screenshots no longer use potentially stale URL&lt;/li&gt;&lt;li&gt;&lt;strong&gt;bugfix&lt;/strong&gt; Pane heights update correctly when switching Workspaces&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Most of the features in this release came via user requests. We&amp;#x27;re focused on making Polypane work for you, so if you have
suggestions that would make your usage of Polypane better, &lt;a href=&quot;/support/&quot;&gt;reach out and let us know&lt;/a&gt;!&lt;/p&gt;&lt;p&gt;We&amp;#x27;re already hard at work on the next update of Polypane, and this release has been laying the groundwork for the amazing features we have planned
for you. Stay tuned!&lt;/p&gt;&lt;h2 id=&quot;getting-polypane-13&quot;&gt;Getting Polypane 1.3&lt;/h2&gt;&lt;p&gt;Polypane will automatically update on Mac and Windows. Linux users need to download the new version from
&lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt; and if you&amp;#x27;re on Mac and Windows but don&amp;#x27;t want to wait on the update popup, you can find
your download there as well.&lt;/p&gt;&lt;p&gt;If you don&amp;#x27;t have Polypane yet, you can &lt;a href=&quot;/pricing/&quot;&gt;get it here&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[The perfect responsive menu (2021)]]></title><description><![CDATA[On a desktop, websites have the space to show the full menu or navbar. On a mobile device that space isn't there and you want to hide the…]]></description><link>https://polypane.app/blog/the-perfect-responsive-menu/</link><guid isPermaLink="false">https://polypane.app/blog/the-perfect-responsive-menu/</guid><pubDate>Fri, 20 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;On a desktop, websites have the space to show the full menu or navbar. On a mobile device that space isn&amp;#x27;t there and you want to hide the menu behind a toggle (like a hamburger icon), then show it when people click that toggle. How do you offer both in an accessible way that keeps your HTML simple, without duplicating your menu? That&amp;#x27;s what the perfect responsive menu does.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Though the hamburger icon is well known by now, to better help people that are not familiar with it you can show the icon alongside the word &amp;quot;Menu&amp;quot;.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;In this article, we&amp;#x27;ll show you how to create a responsive menu that uses the same HTML on all viewports, is responsive and looks great. The perfect responsive menu.&lt;/p&gt;&lt;h2 id=&quot;the-html&quot;&gt;The HTML&lt;/h2&gt;&lt;p&gt;We start with the HTML.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;nav&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;navigation&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-expanded&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;false&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-controls&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;menu&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Menu&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;menu&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;hidden&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;/&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Home&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;/benefits&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Benefits&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;/pricing&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Pricing&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;/blog&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Blog&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;nav&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The basic menu is as you&amp;#x27;ve probably written before. It&amp;#x27;s a list of links (an &lt;code class=&quot;language-text&quot;&gt;ul&lt;/code&gt;) wrapped in a &lt;code class=&quot;language-text&quot;&gt;nav&lt;/code&gt; element. But two things are different.&lt;/p&gt;&lt;p&gt;First, there&amp;#x27;s an extra button. The button has some attributes you might not be familiar with: Aria attributes. With these attributes we can help assistive tools like screen readers know the purpose of the button. In this case, the button &lt;em&gt;controls&lt;/em&gt; the element with id &amp;quot;menu&amp;quot;, and it&amp;#x27;s currently not expanded.&lt;/p&gt;&lt;p&gt;Second, The menu is initially hidden, using the &lt;code class=&quot;language-text&quot;&gt;hidden&lt;/code&gt; attribute. We hide it initially because we develop &lt;a href=&quot;https://polypane.app/blog/responsive-design-ground-rules/&quot;&gt;mobile first&lt;/a&gt;, and on mobile we only show the button.&lt;/p&gt;&lt;h2 id=&quot;the-javascript&quot;&gt;The JavaScript&lt;/h2&gt;&lt;p&gt;The button by itself won&amp;#x27;t do anything. For that, we use JavaScript.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; toggleMenu &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;.navigation button&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; menu &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;.navigation ul&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

toggleMenu&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;click&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; open &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;toggleMenu&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;aria-expanded&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  toggleMenu&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;aria-expanded&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;open&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  menu&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hidden &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;menu&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;menu&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hidden&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    menu&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;a&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;focus&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When you click on the button, we call a function that will get the current value of the &amp;quot;aria-expanded&amp;quot; attribute, and invert it. It will do the same for the &amp;quot;hidden&amp;quot; attribute on the menu. When the menu is visible, we&amp;#x27;ll focus the first link so it gets properly announced.&lt;/p&gt;&lt;p&gt;&lt;em&gt;The &lt;code class=&quot;language-text&quot;&gt;JSON.parse&lt;/code&gt; function helps us convert the attribute from a string to a real boolean.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;At this point, the toggle is functional:&lt;/p&gt;&lt;div&gt;&lt;iframe height=&quot;265&quot; style=&quot;width:100%&quot; scrolling=&quot;no&quot; title=&quot;The perfect responsive menu (skeleton)&quot; src=&quot;https://codepen.io/Kilian/embed/wvwQwgo?height=265&amp;amp;theme-id=0&amp;amp;default-tab=js,result&quot; frameBorder=&quot;no&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;&quot;&gt;See the Pen &lt;a href=&quot;https://codepen.io/Kilian/pen/wvwQwgo&quot;&gt;The perfect responsive menu (skeleton)&lt;/a&gt; by Kilian Valkhof (&lt;a href=&quot;https://codepen.io/Kilian&quot;&gt;@Kilian&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/iframe&gt;&lt;/div&gt;&lt;h2 id=&quot;the-css&quot;&gt;The CSS&lt;/h2&gt;&lt;p&gt;Support for the hidden attribute goes back to IE11, but if you need to support older browsers, then adding the CSS below will let you support them. &lt;em&gt;(keep in mind you might need to change the javascript above too)&lt;/em&gt;&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;[hidden]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;At a certain width, the viewport will be wide enough to hide the button and show the menu:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 40rem&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;#navigation button&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token selector&quot;&gt;#menu&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The width at which this happens depends on your design and the length of your menu, so while 40rem works for me, it might not work for you.&lt;/p&gt;&lt;p&gt;To show this in action, toggle the &amp;quot;CSS&amp;quot; panel in the pen below, it will switch between showing just the button and just the menu.&lt;/p&gt;&lt;div&gt;&lt;iframe height=&quot;265&quot; style=&quot;width:100%&quot; scrolling=&quot;no&quot; title=&quot;The perfect responsive menu (responsive)&quot; src=&quot;https://codepen.io/Kilian/embed/NWKEKag?height=265&amp;amp;theme-id=0&amp;amp;default-tab=js,result&quot; frameBorder=&quot;no&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;&quot;&gt;See the Pen &lt;a href=&quot;https://codepen.io/Kilian/pen/NWKEKag&quot;&gt;The perfect responsive menu (responsive)&lt;/a&gt; by Kilian Valkhof (&lt;a href=&quot;https://codepen.io/Kilian&quot;&gt;@Kilian&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/iframe&gt;&lt;/div&gt;&lt;h2 id=&quot;the-finishing-touch-styling&quot;&gt;The finishing touch: styling&lt;/h2&gt;&lt;p&gt;At this point, it&amp;#x27;s up to you how you want to style the button and the menu. You can make it as simple or complicated as you want.&lt;/p&gt;&lt;p&gt;For example, the mobile menu on the Polypane website uses an svg icon for the menu with an animated growing background and a staggered animation of the menu items. I switched to PostCSS (which allows nesting) to make things a little more readable.&lt;/p&gt;&lt;div&gt;&lt;iframe height=&quot;265&quot; style=&quot;width:100%&quot; scrolling=&quot;no&quot; title=&quot;The perfect responsive menu (styled)&quot; src=&quot;https://codepen.io/Kilian/embed/yLBQBpK?height=265&amp;amp;theme-id=0&amp;amp;default-tab=css,result&quot; frameBorder=&quot;no&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;&quot;&gt;See the Pen &lt;a href=&quot;https://codepen.io/Kilian/pen/yLBQBpK&quot;&gt;The perfect responsive menu (styled)&lt;/a&gt; by Kilian Valkhof (&lt;a href=&quot;https://codepen.io/Kilian&quot;&gt;@Kilian&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;It doesn&amp;#x27;t have to look like this though! With just this skeleton HTML and JavaScript, you can use CSS to style it in many different ways. You might choose to slide open the menu like a dropdown, pushing the rest of the content down, or you could have it slide in from the left like a side panel. And using css transforms you can animate the transition in any way you like.&lt;/p&gt;&lt;p&gt;As long as you keep the HTML and the core functionality of the JavaScript intact, you will have an accessible, responsive menu that uses the same HTML on both mobile and wider viewports. &lt;strong&gt;The perfect responsive menu.&lt;/strong&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Give your eyes some rest with dark mode in Polypane]]></title><description><![CDATA[Whether you like your entire OS to be in dark mode or not, sometimes it's just nice to dim an application and gives your eyes a little rest…]]></description><link>https://polypane.app/blog/give-your-eyes-some-rest-with-dark-mode-in-polypane/</link><guid isPermaLink="false">https://polypane.app/blog/give-your-eyes-some-rest-with-dark-mode-in-polypane/</guid><pubDate>Tue, 27 Aug 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Whether you like your entire OS to be in dark mode or not, sometimes it&amp;#x27;s just nice to dim an application and gives your eyes a little rest. That&amp;#x27;s exactly what dark mode in Polypane, one of our most requested features, gives you.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/blogs/polypane1-2/overview-dark.png&quot; alt=&quot;dark mode&quot;/&gt;&lt;/p&gt;&lt;h2 id=&quot;no-more-bright-flashes&quot;&gt;No more bright flashes&lt;/h2&gt;&lt;p&gt;With dark mode, switching from your code editor, IDE or terminal to Polypane will be less jarring and disruptive. Dark mode will turn on automatically for macOS users who have dark mode enabled, and for everyone else it&amp;#x27;s just a matter of toggling using &lt;code class=&quot;language-text&quot;&gt;cmd-i&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;ctrl-i&lt;/code&gt;.&lt;/p&gt;&lt;h2 id=&quot;complete-reworking-of-the-ui-colors&quot;&gt;Complete reworking of the UI colors&lt;/h2&gt;&lt;p&gt;The Polypane dark mode is a complete recoloring of the UI using css custom properties and with it, support for multiple color schemes. Depending on your feedback, we&amp;#x27;ll look to add a high contrast mode or even customisable themes. Let us know what you&amp;#x27;d like to see!&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/pricing/&quot;&gt;Try out Dark mode in Polypane and give&lt;/a&gt; your eyes some relief.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 1.2: Dark mode, Full page screenshots, Live reloading and more]]></title><description><![CDATA[There is a new version of Polypane available! It brings dark mode, live reloading, full page screenshots and a ton more
great features. Read…]]></description><link>https://polypane.app/blog/polypane-1-2-dark-mode-full-page-screenshots-live-reloading-and-more/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-1-2-dark-mode-full-page-screenshots-live-reloading-and-more/</guid><pubDate>Thu, 22 Aug 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There is a new version of Polypane available! It brings dark mode, live reloading, full page screenshots and a ton more
great features. Read on for the details. To check out the latest version, &lt;a href=&quot;/pricing/&quot;&gt;start your trial&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;whats-new&quot;&gt;What&amp;#x27;s new?&lt;/h2&gt;&lt;h3 id=&quot;dark-mode&quot;&gt;Dark mode&lt;/h3&gt;&lt;p&gt;What can I say, it&amp;#x27;s dark mode.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/blogs/polypane1-2/overview-dark.png&quot; alt=&quot;dark mode&quot;/&gt;&lt;/p&gt;&lt;h3 id=&quot;full-page-screenshots&quot;&gt;Full page screenshots&lt;/h3&gt;&lt;p&gt;You can now generate a full page screenshot of any of your panes, as well as just the viewport. This is one of the
best implementations out there and it should work really well for nearly all websites.&lt;/p&gt;&lt;p&gt;The full page screenshot in Polypane can &lt;strong&gt;correctly handle fixed elements and fixed backgrounds, and it can also deal with
viewport units properly.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Most screenshot services don&amp;#x27;t do either and that means that any page with for example a fixed header will end up with an
incorrect screenshot. In Polypane, that just works.&lt;/p&gt;&lt;p&gt;Saved screenshots also include the url and the pane name, so it&amp;#x27;s easier to keep track of them.&lt;/p&gt;&lt;h3 id=&quot;live-reloading&quot;&gt;Live reloading&lt;/h3&gt;&lt;p&gt;Polypane now has built in live reloading for your projects. Instead of manually refreshing the page, you tell Polypane which folder
to watch and if it detects changes, it&amp;#x27;ll refresh the page for you.&lt;/p&gt;&lt;p&gt;If it&amp;#x27;s a CSS file or an image Polypane will update them without a page refresh, which is even faster!&lt;/p&gt;&lt;p&gt;If you can&amp;#x27;t use Live reload, Polypane now also has an Auto reloading mode that will reload the page at a set interval, and
of course you can still use your own hot reloading solution as well.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/blogs/polypane1-2/livereload.png&quot; alt=&quot;Live reload&quot;/&gt;&lt;/p&gt;&lt;h3 id=&quot;history-and-autosuggestions&quot;&gt;History and autosuggestions&lt;/h3&gt;&lt;p&gt;You can now right click the navigation buttons and navigate to any previously visited page.&lt;/p&gt;&lt;p&gt;The addressbar now works more like Chrome or Firefox where you can type fragments of urls and it&amp;#x27;ll match urls that contain all of them.
If you previously visited &lt;code class=&quot;language-text&quot;&gt;https://polypane.app/docs/list-of-shortcuts/&lt;/code&gt; for example, you can just type &amp;quot;pol do&amp;quot; and it&amp;#x27;ll
show you all URLs that match. Navigating like this is much quicker and will really change how you use Polypane.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/blogs/polypane1-2/suggestions.png&quot; alt=&quot;suggestions&quot;/&gt;&lt;/p&gt;&lt;h3 id=&quot;keyboard-and-form-syncing&quot;&gt;Keyboard and form syncing&lt;/h3&gt;&lt;p&gt;Any keyboard input and anything you type into forms is now automatically synced between all panes. This means that
if your site uses keyboard shortcuts you can easily test them in all panes at once, and the same goes for filling in and testing forms.&lt;/p&gt;&lt;h3 id=&quot;shortcut-overlay&quot;&gt;Shortcut overlay&lt;/h3&gt;&lt;p&gt;I got a few user requests for this and it&amp;#x27;s super handy to have. Press F2 (or use the help menu) to quickly show an overlay
of all the shortcuts without having to go to the &amp;#x27;getting started&amp;#x27; page.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/blogs/polypane1-2/shortcuts.png&quot; alt=&quot;shortcuts&quot;/&gt;&lt;/p&gt;&lt;h3 id=&quot;simplified-breakpoints&quot;&gt;Simplified breakpoints&lt;/h3&gt;&lt;p&gt;If you have a large website, it&amp;#x27;s not strange to have over a dozen CSS breakpoints throughout your site. Showing all of them
might not be needed to get a proper overview. With the new simplified breakpoints (which you can find by right-clicking
the breakpoints button) Polypane automatically generates &lt;strong&gt;5 panes that map to your sites supported widths&lt;/strong&gt;. This way you get a good
overview of the range of your responsive styles without needing to see every breakpoint.&lt;/p&gt;&lt;h3 id=&quot;support-for-handling-invalid-certificates&quot;&gt;Support for handling invalid certificates&lt;/h3&gt;&lt;p&gt;Polypane will now show you a warning for unsafe certificates (like expired certificates, or ones with the wrong domain)
and ask you whether to allow them or not. Your answer will be saved for the current session.&lt;/p&gt;&lt;h3 id=&quot;manual-cache-and-cookie-handling&quot;&gt;Manual cache and cookie handling&lt;/h3&gt;&lt;p&gt;You can now manually clear the cache, cookies and saved basic auth credentials, as well as disable the cache entirely
when using Polypane. Find these in the edit menu.&lt;/p&gt;&lt;h3 id=&quot;historyreplacestate-implementation&quot;&gt;History.replaceState implementation&lt;/h3&gt;&lt;p&gt;Polypane now implements history.replaceState calls, where calling it will update the URL and sync the panes.&lt;/p&gt;&lt;h2 id=&quot;whats-improved&quot;&gt;What&amp;#x27;s improved?&lt;/h2&gt;&lt;h3 id=&quot;speed-improvements&quot;&gt;Speed improvements&lt;/h3&gt;&lt;p&gt;I spend a lot of time optimising the Polypane code and also decoupling the main UI from the panes. The UI should now be
more responsive and heavy websites should have less influence on the rest of the UI.&lt;/p&gt;&lt;h3 id=&quot;pane-header-ui&quot;&gt;Pane header UI&lt;/h3&gt;&lt;p&gt;The pane headers have had a facelift. The height is now no longer shown vertically, but sits next to the width above the
pane, and there is more space above the header which keeps things clean.&lt;/p&gt;&lt;p&gt;The rotation button is now visible in the header as opposed to the overlay, so it&amp;#x27;s much easier to quickly rotate a pane.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/blogs/polypane1-2/paneheader.png&quot; alt=&quot;paneheader&quot;/&gt;&lt;/p&gt;&lt;h3 id=&quot;quick-switcher-ui&quot;&gt;Quick switcher UI&lt;/h3&gt;&lt;p&gt;The quickswitcher, added in 1.1, now spans the whole width and the selected size will be highlighed. The pane resizing
animation has been removed to provide a snappier and faster experience.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/blogs/polypane1-2/quickswitcher.png&quot; alt=&quot;quickswitcher&quot;/&gt;&lt;/p&gt;&lt;h3 id=&quot;quickly-zoom-by-scrolling&quot;&gt;Quickly zoom by scrolling&lt;/h3&gt;&lt;p&gt;You can now press &lt;code class=&quot;language-text&quot;&gt;cmd/ctrl&lt;/code&gt; and scroll to zoom Polypane in and out.&lt;/p&gt;&lt;h3 id=&quot;menu-is-now-always-visible-on-windows&quot;&gt;Menu is now always visible on Windows&lt;/h3&gt;&lt;p&gt;Many users didn&amp;#x27;t realise Polypane also had a menu that appears when you press &lt;code class=&quot;language-text&quot;&gt;alt&lt;/code&gt;, so the menu is now shown by default.
If you don&amp;#x27;t like this behaviour you can revert to the old behaviour in the view menu.&lt;/p&gt;&lt;h3 id=&quot;improved-first-launch&quot;&gt;Improved first launch&lt;/h3&gt;&lt;p&gt;The first launch, where you enter your email and license key, now has a sleeker design and lets you choose the website
you want to start Polypane with.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/blogs/polypane1-2/firstlaunch.png&quot; alt=&quot;firstlaunch&quot;/&gt;&lt;/p&gt;&lt;h2 id=&quot;full-changelog&quot;&gt;Full changelog:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;new&lt;/strong&gt; Dark mode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;new&lt;/strong&gt; Full page and viewport screenshots&lt;/li&gt;&lt;li&gt;&lt;strong&gt;new&lt;/strong&gt; Live reloading and Auto reloading&lt;/li&gt;&lt;li&gt;&lt;strong&gt;new&lt;/strong&gt; History and autosuggestions for the address bar&lt;/li&gt;&lt;li&gt;&lt;strong&gt;new&lt;/strong&gt; Synchronize keyboard and forms between panes&lt;/li&gt;&lt;li&gt;&lt;strong&gt;new&lt;/strong&gt; Shortcut overlay&lt;/li&gt;&lt;li&gt;&lt;strong&gt;new&lt;/strong&gt; Simplified breakpoints view&lt;/li&gt;&lt;li&gt;&lt;strong&gt;new&lt;/strong&gt; Support for self signed and invalid certificates&lt;/li&gt;&lt;li&gt;&lt;strong&gt;new&lt;/strong&gt; Disable cache, clear cache, cookies and saved auth options&lt;/li&gt;&lt;li&gt;&lt;strong&gt;new&lt;/strong&gt; First time launch experience now lets you choose URL&lt;/li&gt;&lt;li&gt;&lt;strong&gt;new&lt;/strong&gt; history.replaceState support has been added&lt;/li&gt;&lt;li&gt;&lt;strong&gt;improvement&lt;/strong&gt; Faster rendering of main UI&lt;/li&gt;&lt;li&gt;&lt;strong&gt;improvement&lt;/strong&gt; Pane UI is now more streamlined&lt;/li&gt;&lt;li&gt;&lt;strong&gt;improvement&lt;/strong&gt; Redesigned quick switcher&lt;/li&gt;&lt;li&gt;&lt;strong&gt;improvement&lt;/strong&gt; Saved screenshots now include URL&lt;/li&gt;&lt;li&gt;&lt;strong&gt;improvement&lt;/strong&gt; Zooming now also works with ctrl/cmd + scroll&lt;/li&gt;&lt;li&gt;&lt;strong&gt;improvement&lt;/strong&gt; Menubar on Windows now visible by default&lt;/li&gt;&lt;li&gt;&lt;strong&gt;improvement&lt;/strong&gt; License flow rendering improved design&lt;/li&gt;&lt;li&gt;&lt;strong&gt;bugfix&lt;/strong&gt; Minimum dimensions for the app&lt;/li&gt;&lt;li&gt;&lt;strong&gt;bugfix&lt;/strong&gt; Quit no longer broken on mac&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;getting-polypane-12&quot;&gt;Getting Polypane 1.2&lt;/h2&gt;&lt;p&gt;On Mac, Polypane will automatically update. Windows users usually get an automatic update too, but this version requires a one-time manual update. &lt;a href=&quot;/download/&quot;&gt;download Polypane&lt;/a&gt; and re-install it. Linux users also need to download the new version from &lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;If you don&amp;#x27;t have Polypane yet, you can &lt;a href=&quot;/pricing/&quot;&gt;get it here&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Polypane 1.1 release notes]]></title><description><![CDATA[Update 1th aug 2019: Polypane 1.1.1 is now available with the following bugfixes: Fix : zoom-to-fit on Windows (it got broken in 1.1, sorry…]]></description><link>https://polypane.app/blog/polypane-1-1-release-notes/</link><guid isPermaLink="false">https://polypane.app/blog/polypane-1-1-release-notes/</guid><pubDate>Sun, 07 Jul 2019 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Update 1th aug 2019: Polypane 1.1.1 is now available with the following bugfixes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt;: zoom-to-fit on Windows (it got broken in 1.1, sorry!)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt;: better breakpoint detection for certain sites&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt;: warning for browsersync is hidden if Polypane&amp;#x27;s scroll sync is turned off&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt;: localhost now accepts self-signed certificates silently&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt;: Polypane now overwrites the max connections of devservers on localhost (useful with e.g. Gatsby)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fix&lt;/strong&gt;: Windows builds are now also signed :)&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;polypane-11&quot;&gt;Polypane 1.1&lt;/h2&gt;&lt;p&gt;1.1 is the first major release after our launch in the middle of May. It&amp;#x27;s filled with new features, improvements and bugfixes.&lt;/p&gt;&lt;h2 id=&quot;devtools-mode-and-devtools-extension-support&quot;&gt;Devtools mode and Devtools extension support&lt;/h2&gt;&lt;p&gt;&lt;em&gt;Devtools mode is now the normal mode in Polypane.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Polypane has a new Devtools mode that lets you use your favorite devtools extensions like the React and Vue devtools. You can install them right from inside Polypane using the new Devtools Extensions manager.&lt;/p&gt;&lt;p&gt;Because the pane in Devtools mode is completely isolated from the rest of Polypane, you can now also run your Lighthouse Audits in it!&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;/docs/browser-extensions/&quot;&gt;More on Devtools extensions&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;http-basic-auth-support&quot;&gt;HTTP Basic Auth support&lt;/h2&gt;&lt;p&gt;Many of you are using staging websites that have HTTP Basic Auth in front of them for security. Polypane 1.1 will show a modal to enter the username and password for these sites, and then remember them for the rest of the session, or if you want, permanently.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/docs/browser-features/#basic-auth&quot;&gt;More on HTTP Basic Auth&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;workspaces&quot;&gt;Workspaces&lt;/h2&gt;&lt;p&gt;With workspaces you can store and retrieve your favorite configuration of panes. You can have a workspace for your mobile devices, for a &amp;#x27;quick check&amp;#x27; or whatever else you want.&lt;/p&gt;&lt;p&gt;In this release, workspaces have been intentionally kept simple so we can learn from how it&amp;#x27;s being used and use that to improve the feature in future releases.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/docs/workspaces/&quot;&gt;More on Workspaces&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;focus-mode-improvements&quot;&gt;Focus mode improvements&lt;/h2&gt;&lt;p&gt;Focus mode is a great way to hone in on a single pane, but that doesn&amp;#x27;t mean you should have to give up using your CSS Breakpoints or the pane sizes you prefer using in the default mode. That&amp;#x27;s why Focus mode (and Devtools mode) now have a quick switcher at the top of the screen that lets you quickly resize the pane to any of your default mode pane sizes (this works with workspaces too!) or from the CSS breakpoints in the page.&lt;/p&gt;&lt;p&gt;We also made changes to how Focus mode behaves when you resize the pane. When the pane gets resized to wider than the screen, it will automatically be zoomed out to fit. This works when switching to a different pane size, but also when dragging to resize.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/docs/layouts/#focus-shortcut-f&quot;&gt;More on Focus mode&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;addons-for-other-browsers&quot;&gt;Addons for other browsers&lt;/h2&gt;&lt;p&gt;You&amp;#x27;re probably not using Polypane as your daily browser, but what if you want to open the current tab in Polypane? We created browser addons for Chrome and Firefox that let you do that with a single click. Quickly open the current tab in Polypane and get developing!&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/docs/switching-to-polypane/&quot;&gt;More on Addons for other browsers&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;clean-mode-hiding-the-header&quot;&gt;Clean mode: hiding the header&lt;/h2&gt;&lt;p&gt;Space is at a premium on most people&amp;#x27;s screens and when you&amp;#x27;re working on your own site in Polypane, you probably don&amp;#x27;t need the header so much. In Polypane 1.1 you can quickly hide the header via the main menu or a shortcut, giving you a bunch more space and letting you really focus on your project.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/docs/browser-features/#clean-mode&quot;&gt;More on Clean mode&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;other-improvements&quot;&gt;Other improvements&lt;/h2&gt;&lt;p&gt;Developer ergonomics matter a lot to us, as you can imagine. So we have a ton of smaller improvements too:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A new shortcut to rotate all panes.&lt;/li&gt;&lt;li&gt;Each pane now has a clear &amp;#x27;rotate pane&amp;#x27; button in the pane preset overlay.&lt;/li&gt;&lt;li&gt;Shift ctrl/cmd C support for &amp;#x27;inspect element&amp;#x27;.&lt;/li&gt;&lt;li&gt;Now associated as viewer for HTML and HTM files, and can be used on mac with &lt;code class=&quot;language-text&quot;&gt;open {url} -a &amp;quot;Polypane&amp;quot;&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;We detect browsersync running and will warn you about their scroll sync.&lt;/li&gt;&lt;li&gt;Zoom in/out now also works in your devtools.&lt;/li&gt;&lt;li&gt;Undocked devtools will be brought forward/get focus when you use inspect element.&lt;/li&gt;&lt;li&gt;Tweaked desktop/laptop screen sizes.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There&amp;#x27;s always bugs in software, especially in v1, so we fixed a bunch of those too:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The device preset overlay is now also visible when the panes are displaying an error message.&lt;/li&gt;&lt;li&gt;The notification bar is no longer visible on very narrow widths.&lt;/li&gt;&lt;li&gt;Panes that have no height specified can no longer be rotated.&lt;/li&gt;&lt;li&gt;Context menus are now cleared correctly, instead of just made invisible.&lt;/li&gt;&lt;li&gt;Fixed the support links in the license flow.&lt;/li&gt;&lt;li&gt;Random pane shortcut now works again in Focus mode.&lt;/li&gt;&lt;li&gt;Added missing tooltips to pane headers&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;getting-polypane-11&quot;&gt;Getting Polypane 1.1&lt;/h2&gt;&lt;p&gt;On Windows and mac, Polypane will automatically update to 1.1. You&amp;#x27;ll recieve an update notification and after a restart you should have 1.1. For Linux users, you will need to download the new version from &lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;You can also get the addons for Chrome and Firefox from &lt;a href=&quot;/download/&quot;&gt;the download page&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I hope you enjoy this release!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Responsive design ground rules (updated for 2024)]]></title><description><![CDATA[Creating a responsive design can be intimidating. There are many moving parts, things might lay out in ways you didn't expect and keeping…]]></description><link>https://polypane.app/blog/responsive-design-ground-rules/</link><guid isPermaLink="false">https://polypane.app/blog/responsive-design-ground-rules/</guid><pubDate>Mon, 01 Jul 2019 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Creating a responsive design can be intimidating. There are many moving parts, things might lay out in ways you didn&amp;#x27;t expect and keeping all various viewports in mind when laying out a design can be daunting. With these ground rules, your responsive designs will be more robust and predictable.&lt;/p&gt;&lt;h2 id=&quot;video&quot;&gt;Video&lt;/h2&gt;&lt;p&gt;Prefer a video? We recently discussed these ground rules in a 30 minute presentation for Mintbean:&lt;/p&gt;&lt;div style=&quot;position:relative;width:100%;padding-top:56.25%&quot;&gt;&lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/Qhe6hKuIxDQ?autoplay=false&amp;amp;start=0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; style=&quot;position:absolute;top:0px;left:0px;width:100%;height:100%&quot; frameBorder=&quot;0&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;h2 id=&quot;rule-1-keep-your-viewport-simple&quot;&gt;Rule #1: Keep your viewport simple&lt;/h2&gt;&lt;p&gt;Back when the viewport meta tag was first introduced, common knowledge was you had to add in all sorts of values to prevent users from resizing and to have a minimum and maximum screen size. It turns out that doing that is actually hostile to your users.&lt;/p&gt;&lt;p&gt;You really only want two things: set the width to the device your site is shown on, and make sure the initial scale is 1, which means that 1 pixel in your CSS equals one device-independent pixel (and also prevent weird zooming behaviour when rotating mobile devices), like this:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;viewport&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;width=device-width&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There are two things you can consider adding:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;viewport&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;width=device-width, initial-scale=1&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;initial-scale=1&lt;/code&gt; will prevent mobile browsers from zooming out if you have &lt;a href=&quot;https://polypane.app/blog/strategies-for-dealing-with-horizontal-overflows/&quot;&gt;horizontal overflow issues&lt;/a&gt;, instead opting for a horizontal scrollbar. Neither is ideal and the true fix is fixing the overflow issue, but between the two I prefer showing the page at the intended zoom level.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;viewport&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;width=device-width, viewport-fit=cover&lt;span class=&quot;token punctuation&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;viewport-fit=cover&lt;/code&gt; will tell mobile browsers that your site knows about devices with notches or other device-parts that seem to &amp;quot;overlay&amp;quot; the screen. This will make sure your site is shown in the full screen, even if that means it&amp;#x27;s partially hidden behind a notch. That will prevent white bands on the sides in landscape mode, but you will have to make sure that you prevent content from ending up behind the notch.&lt;/p&gt;&lt;p&gt;You can do that with CSS env variables:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding-top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;safe-area-inset-top&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;safe-area-inset-right&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding-bottom&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;safe-area-inset-bottom&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;safe-area-inset-left&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Because you don&amp;#x27;t know if the user has the phone oriented with the notch on the left and right, you can use these env variables to add enough padding or margin to elements to prevent them from going behind the notch or other device parts.&lt;/p&gt;&lt;p&gt;Keep in mind that these env variables are the precise width of the notch, so if you just use the env variable, your content will sit flush to the edge. You&amp;#x27;ll need to add some padding or margin to make sure your content doesn&amp;#x27;t sit flush to the edge using calc:&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;main&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding-right&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;safe-area-inset-right&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; + 1rem&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding-left&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;safe-area-inset-left&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; + 1rem&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;rule-2-mobile-first&quot;&gt;Rule #2: Mobile first&lt;/h2&gt;&lt;p&gt;You develop websites on a large laptop or desktop screen, and usually your client is most interested in the desktop design of a website, so it might feel natural to just start with the design for the desktop site and then work your way down. But starting mobile first is actually easier and will result in less code.&lt;/p&gt;&lt;p&gt;If you build mobile first, you&amp;#x27;re building up your CSS in complexity. What I mean with that is that your mobile views are usually much simpler and thus require less CSS. They almost always have just a single column, and lack many of the additional flourishes you have space for on larger screens. If you build mobile-first, this means that, as you add styling for larger and larger media queries, you&amp;#x27;re &lt;em&gt;adding&lt;/em&gt; to the design.&lt;/p&gt;&lt;svg style=&quot;width:100%;aspect-ratio:137 / 60;margin:4rem auto;display:block;max-width:100%&quot; viewBox=&quot;0 0 137 60&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect width=&quot;25&quot; height=&quot;35&quot; rx=&quot;3&quot; fill=&quot;rgb(16 125 181 / 0.6)&quot;&gt;&lt;/rect&gt;&lt;rect x=&quot;30&quot; width=&quot;30&quot; height=&quot;50&quot; rx=&quot;3&quot; fill=&quot;rgb(16 125 181/ 0.6)&quot;&gt;&lt;/rect&gt;&lt;rect x=&quot;65&quot; width=&quot;70&quot; height=&quot;60&quot; rx=&quot;3&quot; fill=&quot;rgb(16 125 181/ 0.6)&quot;&gt;&lt;/rect&gt;&lt;text x=&quot;3&quot; y=&quot;40&quot; fill=&quot;black&quot; font-size=&quot;4px&quot; font-weight=&quot;500&quot; font-family=&quot;inherit&quot;&gt;Start here&lt;/text&gt;&lt;/svg&gt;&lt;p&gt;If you start desktop first, you already have all this styling that you then need to write &lt;em&gt;more&lt;/em&gt; CSS for just to undo your more advanced desktop styling. So you&amp;#x27;re writing more CSS and if you&amp;#x27;re not carefully undoing all CSS, you end up with things like horizontal overflowing or text not fitting.&lt;/p&gt;&lt;p&gt;With mobile first, you save a large chunk of CSS you simply &lt;strong&gt;don&amp;#x27;t have to write&lt;/strong&gt;, making it smaller and your website faster.&lt;/p&gt;&lt;h2 id=&quot;rule-3-design-from-content-out&quot;&gt;Rule #3: Design from content out&lt;/h2&gt;&lt;p&gt;To determine where your breakpoint will be, you can opt to use values like 320px, 375px, 768px and 1024px, which all map to various real device widths. Basically, design for specific devices. But when new devices become more popular &lt;em&gt;(#375IsTheNew320)&lt;/em&gt; your design might not look so good on those devices.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://the-haystack.com/&quot;&gt;Stephen Hay&lt;/a&gt;, who wrote the book on &lt;a href=&quot;http://www.peachpit.com/store/responsive-design-workflow-9780321887863&quot;&gt;responsive design workflows&lt;/a&gt;, advices you to start with your small screen, then:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&amp;quot;expand until it looks like shit. Time for a breakpoint!&amp;quot;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This focus on the content will force you to think of websites as inherently fluid. You can&amp;#x27;t design only your pixel perfect widths, because &lt;em&gt;they don&amp;#x27;t exist&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Quick rule of thumb: you want your line lengths to be around 70 characters long. That translates (depending on the font!) to about 36 to 40 em.&lt;/p&gt;&lt;h2 id=&quot;rule-4-use-ems-in-your-media-queries&quot;&gt;Rule #4: Use ems in your media queries&lt;/h2&gt;&lt;p&gt;With specific device widths no longer mattering, you should also switch out those breakpoint widths in pixels, to &lt;strong&gt;widths in ems&lt;/strong&gt;. Your media queries are based on the content so this will let your site look great even for people that have made their browsers base font-size larger or smaller or have zoomed in their browser.&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 704px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; ... &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 44em&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; ... &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The rest of your design will properly adjust to this and make your site more robust.&lt;/p&gt;&lt;p&gt;Why not rems? At the level of media queries, rems and ems are the same so it doesn&amp;#x27;t matter which one you use, except em is shorter and rems have rendering issues in Safari.&lt;/p&gt;&lt;p&gt;Read more about using ems in our &lt;a href=&quot;https://polypane.app/blog/the-complete-guide-to-css-media-queries/#dimensions&quot;&gt;complete guide to CSS media queries&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;rule-5-min-width-or-max-width-pick-one&quot;&gt;Rule #5: Min-width or max-width, pick one&lt;/h2&gt;&lt;p&gt;Responsive design makes for an incredibly complex system. When your media queries use both min-width and max-width, or even combinations of them, you&amp;#x27;re massively increasing that complexity and reasoning about it becomes even harder.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;min-width&lt;/th&gt;&lt;th&gt;max-width&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;@media (min-width: 30rem) { ... }&lt;/td&gt;&lt;td&gt;@media (max-width: 52rem) { ... }&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;@media (min-width: 44rem) { ... }&lt;/td&gt;&lt;td&gt;@media (max-width: 44rem) { ... }&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;@media (min-width: 52rem) { ... }&lt;/td&gt;&lt;td&gt;@media (max-width: 30rem) { ... }&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;If all your media queries work &amp;quot;up&amp;quot; or &amp;quot;down&amp;quot;, you always know where to look when your site doesn&amp;#x27;t look as you expect it to at a certain size. CSS in new media queries you write will then never influence your earlier sizes. Just find out from which media query down (or up) you need to update your CSS.&lt;/p&gt;&lt;h2 id=&quot;rule-6-avoid-fixed-dimensions&quot;&gt;Rule #6: Avoid fixed dimensions&lt;/h2&gt;&lt;p&gt;It can be very tempting to use fixed dimensions for elements. After all, your favorite hand-off tool probably lets you copy them with ease. Elements with fixed widths (or margins) could easily break your layout if you&amp;#x27;re not careful.&lt;/p&gt;&lt;p&gt;Try to style element sizes in relation to their surroundings. Use percentages or viewport units. Prevent setting &lt;code class=&quot;language-text&quot;&gt;width&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;height&lt;/code&gt; and try to use their &lt;code class=&quot;language-text&quot;&gt;min-&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;max-&lt;/code&gt; counterparts. And if you do end up with a &lt;code class=&quot;language-text&quot;&gt;width&lt;/code&gt; breaking something somewhere, a &lt;code class=&quot;language-text&quot;&gt;max-width:100%&lt;/code&gt; can work wonders.&lt;/p&gt;&lt;h2 id=&quot;rule-7-use-modern-layout-techniques&quot;&gt;Rule #7: Use modern layout techniques&lt;/h2&gt;&lt;p&gt;To expand on the previous rule, modern layout methods like Flexbox, CSS Grid and container queries are built to be inherently flexible and size according to their surroundings. If you make use of these layout methods, you&amp;#x27;ll end up needing much less media queries to achieve the same design.&lt;/p&gt;&lt;p&gt;Less media queries means less to reason about, and your code is shorter to boot.&lt;/p&gt;&lt;p&gt;A great way to (re-)learn how to build common layouts with Flexbox and CSS Grid is &lt;a href=&quot;https://every-layout.dev/&quot;&gt;Every-layout.dev&lt;/a&gt;. It lists common layouts and explains how to build them using modern techniques.&lt;/p&gt;&lt;h2 id=&quot;rule-8-leave-room-for-text-rendering-differences&quot;&gt;Rule #8: Leave room for text rendering differences&lt;/h2&gt;&lt;p&gt;It&amp;#x27;s tempting to create breakpoints right at the place where an unfavorable line-break occurs. To get that &amp;quot;pixel perfect&amp;quot;. Of course we know the web isn&amp;#x27;t pixel perfect, and it never was.&lt;/p&gt;&lt;p&gt;If your breakpoints are too close to readable line breaks, then it might work in &lt;em&gt;your&lt;/em&gt; browser, but different browsers and different operating systems have different ways of rendering text, which means that the line of text might be a couple of pixel wider or smaller,, and your design could break.&lt;/p&gt;&lt;p&gt;Instead, try to be a little bit loose with your media queries, leave a little space for things to be off by a few pixels before big changes in your design.&lt;/p&gt;&lt;h2 id=&quot;rule-9-decide-in-the-browser&quot;&gt;Rule #9: Decide in the browser&lt;/h2&gt;&lt;p&gt;To follow these rules, it doesn&amp;#x27;t make sense to create all your breakpoints in a design tool. On the other hand, designing the entire site in a browser is difficult too. So what&amp;#x27;s the happy medium?&lt;/p&gt;&lt;p&gt;Create your designs in a design tool, with some rough responsive variants, but keep the choice of &lt;em&gt;when&lt;/em&gt; to switch over to another design for when you&amp;#x27;re actually working in the browser. The Sketch artboard might be 750px wide, but if you&amp;#x27;re in the browser and the layout already makes more sense at 44em (that&amp;#x27;s 704 pixels), then use &lt;code class=&quot;language-text&quot;&gt;44em&lt;/code&gt; in your css.&lt;/p&gt;&lt;h2 id=&quot;rule-10-give-polypane-a-try&quot;&gt;Rule #10: Give Polypane a try&lt;/h2&gt;&lt;p&gt;With Polypane, creating sites and apps in a mobile-first, content-out way comes naturally:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Start with a single pane and design your smallest screen.&lt;/li&gt;&lt;li&gt;Add a new pane, and widen it until, to quote Stephen, it &amp;quot;looks like shit&amp;quot;.&lt;/li&gt;&lt;li&gt;Check the width of the pane and use that &lt;code class=&quot;language-text&quot;&gt;em&lt;/code&gt; value as your new breakpoint.&lt;/li&gt;&lt;li&gt;Style it and repeat.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;a href=&quot;/pricing/&quot;&gt;Start using Polypane for free&lt;/a&gt; with a 14 day trial.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Responsive CSS breakpoints for the top 50 websites 2019]]></title><description><![CDATA[With Polypane, it's simple to see a website in all the responsive widths it's designed for. Polypane intelligently
parses the CSS and finds…]]></description><link>https://polypane.app/blog/responsive-css-breakpoints-for-the-top-50-websites-2019/</link><guid isPermaLink="false">https://polypane.app/blog/responsive-css-breakpoints-for-the-top-50-websites-2019/</guid><pubDate>Mon, 27 May 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;With Polypane, it&amp;#x27;s simple to see a website in all the responsive widths it&amp;#x27;s designed for. Polypane intelligently
parses the CSS and finds all the media query declarations. We looked at the top 50 websites worldwide (according to Alexa)
to see how they deal with Responsive design.&lt;/p&gt;&lt;h2 id=&quot;top-50-websites-and-responsive-design&quot;&gt;Top 50 websites and responsive design&lt;/h2&gt;&lt;p&gt;Out of the 50 websites, &lt;strong&gt;12 websites defined no media queries at all&lt;/strong&gt;, almost one in 4! For the most part these sites were targeted at
China and Asia in general. It could be that they use browser sniffing instead to show a mobile version for smaller screens,
or they have the data that people use their mobile apps instead of the web.&lt;/p&gt;&lt;p&gt;In the data below, I chose to discard the 12 websites without media queries. Here&amp;#x27;s some quick stats:&lt;/p&gt;&lt;h2 id=&quot;media-queries&quot;&gt;Media Queries&lt;/h2&gt;&lt;div class=&quot;kpilist&quot;&gt;&lt;div class=&quot;kpi&quot;&gt;&lt;span&gt;406&lt;/span&gt; Total&lt;/div&gt;&lt;div class=&quot;kpi&quot;&gt;&lt;span&gt;10.7&lt;/span&gt; Average&lt;/div&gt;&lt;div class=&quot;kpi&quot;&gt;&lt;span&gt;9&lt;/span&gt; Median&lt;/div&gt;&lt;div class=&quot;kpi&quot;&gt;&lt;span&gt;3&lt;/span&gt; Mode&lt;/div&gt;&lt;div class=&quot;kpi&quot;&gt;&lt;span&gt;29&lt;/span&gt; Most for a single site &lt;i&gt;(twitter.com, netflix.com, livejasmin.com)&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;kpi&quot;&gt;&lt;span&gt;1&lt;/span&gt; Least for a single site &lt;i&gt;(tmall.com, Bilibili.com)&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;The number of media queries in itself doesn&amp;#x27;t really say anything about how responsive a website really is, but it&amp;#x27;s a good
proxy. So we can say that the most responsive popular websites are twitter.com, netflix.com and livejasmin.com.&lt;/p&gt;&lt;h2 id=&quot;widths&quot;&gt;Widths&lt;/h2&gt;&lt;p&gt;There is quite a large range of widths that media queries have been defined for. The smallest is a max-width of 119
pixels, on aliexpress.com, and the largest is a min-width of 2560 pixels on bing.com. That means the total range of the
top 50 websites in the world is 2441 pixels wide.&lt;/p&gt;&lt;h3 id=&quot;ranges&quot;&gt;Ranges&lt;/h3&gt;&lt;p&gt;In order to see &lt;em&gt;how&lt;/em&gt; responsive websites really are, we can also use their total &lt;em&gt;range&lt;/em&gt; (the difference between their
widest width and smallest width) of the media queries as a proxy. The higher the range, the more widths a website supports.&lt;/p&gt;&lt;p&gt;The website with the widest range of media query widths is Twitter.com with a range of 1975 pixels (a minumum of 325 to
a maximum of 2300 pixels). Runners-up are Livejasmin.com with 1850 pixels, Microsoft.com with 1459 pixels and Bing.com
with 1440 pixels.&lt;/p&gt;&lt;p&gt;We already filtered out the websites without any media queries, but if you look at the websites with the least amount of
range something else appears, there are a further 4 sites that have a range of zero, meaning that their smallest and largest
breakpoint are the same; they have just one media query or one width defined in them.&lt;/p&gt;&lt;p&gt;If we discard those, we can also see which of the responsive websites are the least responsive: tmall.com has a range of
just 150 pixels, followed by linkedin.com with 207 pixels, taobao.com with a range of 210 pixels and imdb.com with a
range of 435 pixels. For all these sites it seems that they use different methods to target mobile devices.&lt;/p&gt;&lt;p&gt;Some quick stats again:&lt;/p&gt;&lt;div class=&quot;kpilist&quot;&gt;&lt;div class=&quot;kpi&quot;&gt;&lt;span&gt;1975px&lt;/span&gt; Total range&lt;/div&gt;&lt;div class=&quot;kpi&quot;&gt;&lt;span&gt;859px&lt;/span&gt; Average&lt;/div&gt;&lt;div class=&quot;kpi&quot;&gt;&lt;span&gt;867px&lt;/span&gt; Median&lt;/div&gt;&lt;div class=&quot;kpi&quot;&gt;&lt;span&gt;822px&lt;/span&gt; Mode (3 times)&lt;/div&gt;&lt;div class=&quot;kpi&quot;&gt;&lt;span&gt;1975&lt;/span&gt; widest for a single site &lt;i&gt;(twitter.com)&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;kpi&quot;&gt;&lt;span&gt;150&lt;/span&gt; Least for a single site &lt;i&gt;(tmall.com)&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;If we compare the stats we can surmise that the websites with the most media queries also tend to have the widest range,
and that the most popular websites on average have media queries for a range of about 800 to 900 pixels.&lt;/p&gt;&lt;h2 id=&quot;start-and-end-widths&quot;&gt;Start and end widths&lt;/h2&gt;&lt;p&gt;With just the range it is hard to judge what a site is optimised for. A range of 800 pixels starting at 300px is much different
from one starting at 1024 pixels, for example.&lt;/p&gt;&lt;p&gt;The most used width to start with is 320 pixels wide, used 6 times (7 if you count the one that starts at 319px). This
might not surprise you, as it&amp;#x27;s commonly seen as the minimum width due to the iPhone SE and smaller android phones having
this width. The average starting point is much larger though, 580 pixels. This is due to some outliers in the media
queries. For example, bilibili.com&amp;#x27;s starts at 1400pixels wide.&lt;/p&gt;&lt;p&gt;The mean is &amp;#x27;just&amp;#x27; 440 pixels wide. If you built your website mobile first then 440
pixels might indeed be the first width where you want to add new styling. (This website&amp;#x27;s first media query is 480px).&lt;/p&gt;&lt;p&gt;On the other end of the spectrum, the average widest media query is 1439 pixels, with a mean of 1400. 1440px is a common
(wide) desktop width, especially for designers, so this might be a natural stop in the width most websites need. In the
future, when ultra-wide monitors become more prominent, we might see even wider media queries.&lt;/p&gt;&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;&lt;p&gt;As you can see there is a lot of variety in the way the top 50 websites choose to work with responsive design. The best
advice to take away from this is to make sure that the media queries and responsive widths that you choose work well for
your site. Start mobile first, and work your way up. When you develop your own site, you might find yourself ending up with the same values as the average of these
or something wildly different, and both can be valid outcomes.&lt;/p&gt;&lt;p&gt;Are you wondering how your site compares? &lt;a href=&quot;https://polypane.app/pricing/&quot;&gt;Get Polypane&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Why you need a development browser]]></title><description><![CDATA[You're probably looking at this site in Google Chrome or Firefox. That's fine, that's exactly what they're for:
browsing the web, and being…]]></description><link>https://polypane.app/blog/why-you-need-a-development-browser/</link><guid isPermaLink="false">https://polypane.app/blog/why-you-need-a-development-browser/</guid><pubDate>Thu, 25 Apr 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You&amp;#x27;re probably looking at this site in Google Chrome or Firefox. That&amp;#x27;s fine, that&amp;#x27;s exactly what they&amp;#x27;re for:
browsing the web, and being really, really good at browsing the web. They&amp;#x27;re built for that. They&amp;#x27;re built for searching
things and streaming videos and for sharing funny cat videos.&lt;/p&gt;&lt;p&gt;But they&amp;#x27;re not built for web development. Not really.&lt;/p&gt;&lt;h2 id=&quot;and-thats-kind-of-weird&quot;&gt;And that&amp;#x27;s kind of weird.&lt;/h2&gt;&lt;p&gt;You&amp;#x27;re not using a pdf editor or a word processor to write code, you use a text editor or even an IDE that&amp;#x27;s filled to the
brim with features that make you a better developer. You&amp;#x27;re designing in tools that are specifically made for UI design,
not drawing pixels in MS Paint or tools made to edit photo&amp;#x27;s (right?) So &lt;strong&gt;why is your browser not also an highly-optimised
tool that makes you more efficient and better at your job?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Simply, modern browsers are built to consume the web, not create the web. With Polypane, we&amp;#x27;re changing that. Polypane is
a browser where, for every feature, every bit of design and every bit of code, we figure out how we can make you better
and more efficient at your job.&lt;/p&gt;&lt;p&gt;And we think we&amp;#x27;re doing a pretty good job.&lt;/p&gt;&lt;p&gt;Polypane is the only browser that lets you develop a website for all viewports and devices at once, and gives you the best
overview of them. It&amp;#x27;s the only browser that has built-in features like &lt;strong&gt;breakpoint detection&lt;/strong&gt;, &lt;strong&gt;css layout debugging&lt;/strong&gt; and
&lt;strong&gt;multi-pane screenshots&lt;/strong&gt;. All these features help you get more done, faster.&lt;/p&gt;&lt;h2 id=&quot;what-about-devtools&quot;&gt;What about devtools?&lt;/h2&gt;&lt;p&gt;Devtools are &lt;em&gt;awesome&lt;/em&gt;, there&amp;#x27;s no denying that. That&amp;#x27;s why Polypane ships with the same powerful devtools as Chromium.&lt;/p&gt;&lt;p&gt;For consumer browsers, devtools are a tacked-on piece of software. They&amp;#x27;re &lt;em&gt;in&lt;/em&gt; the browser but
they&amp;#x27;re not really &lt;em&gt;part of&lt;/em&gt; the browser. We think devtools can extend way beyong the right side or bottom part of your
browser. With Polypane, &lt;strong&gt;your browser is the devtool&lt;/strong&gt;.&lt;/p&gt;&lt;h2 id=&quot;stop-resizing-your-browser&quot;&gt;Stop resizing your browser&lt;/h2&gt;&lt;p&gt;When you start using Polypane, even if you&amp;#x27;re not using any of the previously mentioned functions, you&amp;#x27;re already
speeding up your workflow and being more efficient. &lt;strong&gt;You&amp;#x27;re no longer doing the single most-used action by developers&lt;/strong&gt;:
resizing their browser.&lt;/p&gt;&lt;p&gt;Just switching to Polypane means your days of wiggling the right side of your browser (or opening devtools) just to resize
a page, are over.&lt;/p&gt;&lt;p&gt;Thats because in Polypane, you&amp;#x27;re always in responsive mode. You&amp;#x27;re also always in full-screen mode. Using Polypane gives you the
full overview. &lt;a href=&quot;/product-tour/&quot;&gt;Read more about Polypane&amp;#x27;s benefits&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Roadmap, and why Polypane is a subscription]]></title><description><![CDATA[Hi, I'm Kilian. I'm the solo developer of Polypane. Let me tell you about why Polypane is a subscription, and what that
means for the…]]></description><link>https://polypane.app/blog/roadmap-and-why-polypane-is-a-subscription/</link><guid isPermaLink="false">https://polypane.app/blog/roadmap-and-why-polypane-is-a-subscription/</guid><pubDate>Sat, 30 Mar 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hi, I&amp;#x27;m Kilian. I&amp;#x27;m the solo developer of Polypane. Let me tell you about why Polypane is a subscription, and what that
means for the roadmap.&lt;/p&gt;&lt;p&gt;Polypane is a subscription so that I can focus on adding new features continuously and get them in your
hands earlier, instead of hoarding them up and having big new releases that you&amp;#x27;ll have to re-purchase. I think this is
the best model for everyone using Polypane and it also makes it more sustainable for me as a creator.&lt;/p&gt;&lt;p&gt;For the roadmap, this means that I can focus on features that users will benefit the most from and actually adjust based
on your feedback. Features such as the scroll syncing came out of this process, it has been immensely useful.&lt;/p&gt;&lt;p&gt;For the coming year, we have a couple of different themes on the roadmap:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Providing more insight into your site structures,&lt;/li&gt;&lt;li&gt;Integration with other development and design tools,&lt;/li&gt;&lt;li&gt;Sharing and cooperation.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;We also have tons and tons of smaller features planned and we&amp;#x27;ll release them as we go.&lt;/p&gt;&lt;p&gt;Updates will be released continuously with major versions roughly every quarter. Major updates include rendering engine
updates and bigger features. Minor updates with feature improvements and bug fixes will be released as-needed (probably
every month or so.)&lt;/p&gt;&lt;p&gt;If you have any questions or suggestions for me, let me know via the &lt;a href=&quot;/support/&quot;&gt;support page&lt;/a&gt; or chat with me
directly in the bottom right corner of the site.&lt;/p&gt;</content:encoded></item></channel></rss>