<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://joyheron.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://joyheron.com/" rel="alternate" type="text/html" /><updated>2026-03-04T13:08:47+00:00</updated><id>https://joyheron.com/feed.xml</id><title type="html">Joy Heron - Software Developer</title><subtitle></subtitle><entry><title type="html">Modern CSS - Container Queries are almost here!</title><link href="https://joyheron.com/modern-css" rel="alternate" type="text/html" title="Modern CSS - Container Queries are almost here!" /><published>2021-05-03T15:00:00+00:00</published><updated>2021-05-03T15:00:00+00:00</updated><id>https://joyheron.com/modern-css</id><content type="html" xml:base="https://joyheron.com/modern-css"><![CDATA[<p>I am giving a talk at the
<a href="https://www.innoq.com/en/talks/2021/05/innoq-technology-night-06-05-2021/">INNOQ Technology Night</a>
(in German) about modern CSS and container queries.
The talk is audio-only, but I wanted to provide this page as a reference for those who want
to follow along during my talk or for those who want to look up the links after the fact.</p>

<p>The <a href="https://wizardzines.com/comics/css-isnt-easy/">CSS isn’t easy</a> comic by
<a href="https://twitter.com/b0rk">Julia Evans</a> really encapsulates my feeling about CSS:</p>

<blockquote>
  <p>CSS may <em>seem</em> easy, but <em>layout</em> is a really difficult problem. Modern CSS has
<em>evolved</em> to the point where it can very eloquently solve this problem – and
it’s getting better all the time.</p>
</blockquote>

<p>For those who want a deeper look at the intricacies which are involved in website
layout, I recommend <a href="http://browser.engineering/layout.html">this in-depth look at how page layout is implemented in browsers</a> from the <a href="http://browser.engineering/index.html">Web Browser Engineering</a> book.</p>

<p>When web development began, CSS didn’t provide any mechanisms for implementing layout.
This is why web developers ended up misusing tables and floats to do layout.
Over the years, we’ve gotten <a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Flexbox">Flexbox</a>
and <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout">CSS Grid</a> – changes that
were always backwards compatible and drastically improved what we as developers can do.</p>

<h2 id="css-containment">CSS Containment</h2>

<p>The <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Containment">CSS Containment</a>
spec has also been added to modern browsers. With CSS containment, we can give the
browser more contextual information about our webpage:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">contain: layout</code> - tells the browser that everything inside the element does not
affect anything else on the page</li>
  <li><code class="language-plaintext highlighter-rouge">contain: size</code> - tells the browser that the size of the children cannot affect the
size of the element itself</li>
  <li><code class="language-plaintext highlighter-rouge">contain: paint</code> - tells the browser that all of the visible content will be printed
inside of the element’s box – anything outside of the box will be clipped</li>
</ul>

<h2 id="container-queries">Container Queries</h2>

<p>Because of the progress made with CSS containment, we now have the tools to
implement <em>container queries</em> in a way that doesn’t totally kill performance.
Here is the <a href="https://github.com/w3c/csswg-drafts/issues/5796">Container Queries spec</a> proposed by <a href="https://www.miriamsuzanne.com/">Miriam Suzanne</a>.
An implementation of this spec is now available behind a flag in the Canary Release of the Chome browser.</p>

<p>These excellent tutorials give a good overview of what we can currently do with container queries,
as well as providing some rationale for why we need them and examples of how to use them:</p>

<ul>
  <li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Container_Queries">CSS Container Queries</a> is a write
up on MDN by <a href="https://rachelandrew.co.uk/about/">Rachel Andrew</a></li>
  <li><a href="https://piccalil.li/blog/container-queries-are-actually-coming/">Container Queries are actually coming</a> by
<a href="https://twitter.com/piccalilli_">Andy Bell</a></li>
  <li><a href="https://ishadeed.com/article/say-hello-to-css-container-queries/">Say Hello to CSS Container Queries</a> by
<a href="https://ishadeed.com/about/">Ahmad Shadeed</a></li>
</ul>

<p><strong><em>TL;DR</em></strong></p>

<p>We will be able to activate CSS containment for a specific area in our markup:</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">main</span> <span class="p">{</span>
  <span class="py">contain</span><span class="p">:</span> <span class="n">layout</span> <span class="n">inline-size</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>And then we can declaratively write CSS which will only activate when
our component has enough space.</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.component</span> <span class="p">{</span> <span class="c">/* Base CSS for component */</span> <span class="p">}</span>

<span class="k">@container</span> <span class="p">(</span><span class="n">min-width</span><span class="p">:</span> <span class="m">25rem</span><span class="p">)</span> <span class="p">{</span>
  <span class="nc">.component</span> <span class="p">{</span>
    <span class="c">/* Styles when the component has more space */</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>An important key to this puzzle is progressive enhancement.
We can create a
<a href="https://piccalil.li/blog/a-minimum-viable-experience-makes-for-a-resilient-inclusive-website-or-app/">minimal viable experience</a>
for all modern browsers, and then add container queries as an optional
feature – older browsers will ignore them because they don’t understand
them yet, but if our <a href="https://twitter.com/piccalilli_/status/1349718686823813121">minimal viable experience is good enough, users
won’t even realize that they don’t have the optimal experience</a></p>

<h3 id="other-links">Other Links</h3>

<p>If you are interested in this topic, consider checking out my other resources:</p>

<ul>
  <li><a href="https://responsibleweb.app/">Responsible Web Apps</a>: My site which discusses how to
create websites which are responsive and accessible out-of-the-box</li>
  <li><a href="https://www.case-podcast.org/33-rachel-andrew-on-contributing-to-css-and-css-layout">Case Podcast with Rachel Andrew</a>:
I had the privilege of interviewing Rachel Andrew and discussed – among other things –
how much we all want container queries</li>
  <li><a href="https://www.innoq.com/de/podcast/074-intrinsic-design/">INNOQ Podcast: Intrinsic Design</a> (German):
A podcast where I talk about responsive design and its successor: intrinsic design</li>
  <li><a href="https://www.innoq.com/de/podcast/084-responsible-web-apps/">INNOQ Podcast: Responsible Web Apps</a> (German):
A podcast where I talk about responsible web applications (covering a lot of content from the
<a href="https://responsibleweb.app">responsibleweb.app</a> website)</li>
</ul>]]></content><author><name></name></author><category term="css" /><summary type="html"><![CDATA[A collection of links for getting started with container queries]]></summary></entry><entry><title type="html">INNOQ Technology Day</title><link href="https://joyheron.com/sketchnote/conference/2020/12/10/INNOQ-technology-day.html" rel="alternate" type="text/html" title="INNOQ Technology Day" /><published>2020-12-10T22:00:00+00:00</published><updated>2020-12-10T22:00:00+00:00</updated><id>https://joyheron.com/sketchnote/conference/2020/12/10/INNOQ-technology-day</id><content type="html" xml:base="https://joyheron.com/sketchnote/conference/2020/12/10/INNOQ-technology-day.html"><![CDATA[<p>Yesterday, the very first INNOQ Technology Day wrapped up, and I wanted to write up my thoughts and impressions and upload my sketchnotes from the day.
Here is <a href="https://www.tilkov.com/post/2020/12/10/the-impossible-conference/">a more detailed write up</a> of the same conference from the perspective of the organizers.</p>

<p>I believe this was the first virtual conference that I’ve attended, and I thought that the organization was very well done.
It was relaxing also to have the conference start at noon, so that I could get a few things done before focusing on the conference for the rest of the day.
The talks were superb, and it try out <a href="https://spatial.chat/">SpacialChat</a> and get a bit of the “conference” feeling of being able to chat with different people in the same room, even though the conference was virtual.
And since the conference was virtual, without a lot of noise and visual stimuli, I found that I was a lot less wiped out at the end of the day than I would normally be.</p>

<p>This conference was also a new first for me personally:
It was my first time rerecording a talk and then watching the recording live with everyone else AND my first time doing a keynote.
My colleagues <a href="https://twitter.com/ewolff">Eberhard Wolff</a>, Andreas Maier, and I each held
a short 15 minute talk as a part of a joint keynote.</p>

<p>In my part of the keynote I talked a lot about responsive and accessible design (or “responsible design” as I have dubbed it), and referenced <a href="https://responsibleweb.app/">my new microsite on the topic</a>.</p>

<p>Since the talk was prerecorded, I was also able to sketchnote my own talk (another first)! Here is my sketchnote:</p>

<p><img src="/img/2020-12-09-innoq-technology-day/02.jpg" alt="Sketchnote of joint keynote from Joy Heron, Eberhard Wolff, and Andreas Maier" title="Sketchnote of joint keynote from Joy Heron, Eberhard Wolff, and Andreas Maier" /></p>

<p>The next talk that I watched was incredibly fun to sketchnote.
It was a Meta-Sketchnote, since the topic of the talk was sketchnoting in the IT.
<a href="https://twitter.com/Teapot4181">Lisa Moritz</a>’s talk was very interactive and taught me a few symbols that I hadn’t used before.
She’s currently writing a book on the topic and also has started a <a href="https://www.sketchnotes.tech/">website displaying her amazing sketchnotes</a>.</p>

<p><img src="/img/2020-12-09-innoq-technology-day/03.jpg" alt="Sketchnote of &quot;Sketchnotes in der IT&quot; by Lisa Moritz" title="Sketchnote of &quot;Sketchnotes in der IT&quot; by Lisa Moritz" /></p>

<p>As part of a challenge from Lisa, I also sketched out a new symbol for a screenreader:</p>

<p><img src="/img/2020-12-09-innoq-technology-day/04.jpg" alt="Symbol for Screenreader. Shows an open book displayed over a monitor screen." title="Symbol for Screenreader. Shows an open book displayed over a monitor screen." /></p>

<p>I find tech conferences to be a great place to listen to new ideas and hear about technologies that I’m not completely comfortable with,
or that I haven’t spent the time to learn about yet.
Service meshes are one of those topics that I haven’t had a lot of time to research,
so I found this talk from <a href="https://twitter.com/HannaPrinz">Hanna Prinz</a> and <a href="https://twitter.com/JoergM">Jörg Müller</a> to be just what I needed:
I learned which options are currently available,
and I learned which criteria I should use to evaluate the different options if I ever need to make that decision.
More information is available on the <a href="https://servicemesh.es/">Service Mesh Comparison microsite</a>.</p>

<p><img src="/img/2020-12-09-innoq-technology-day/05.jpg" alt="Sketchnote for &quot;Istio, Linkerd und Co. im Vergleich&quot; by Hanna Prinz and Jörg Müller" title="Sketchnote for &quot;Istio, Linkerd und Co. im Vergleich&quot; by Hanna Prinz and Jörg Müller" /></p>

<p>The next talk was also one that I decided to go to specifically because it is a bit outside of what I currently am doing in my day-to-day work.
<a href="https://twitter.com/visenger">Larysa Visengeriyeva</a> gave an overview of machine learning engineering, including the ten practices that build off of each other.
More information is available on the <a href="https://ml-ops.org/">Machine Learning Operations microsite</a>.</p>

<p><img src="/img/2020-12-09-innoq-technology-day/06.jpg" alt="Sketchnote for &quot;10 Fundamentale Praktiken für Machine Learning Engineering&quot; by Larysa Visengeriyeva" title="Sketchnote for &quot;10 Fundamentale Praktiken für Machine Learning Engineering&quot; by Larysa Visengeriyeva" /></p>

<p>My last talk of the day was some live-coding with Idris from <a href="https://twitter.com/janstepien">Jan Stępień</a>.
The sketchnote itself isn’t very interesting (it’s difficult to sketchnote a talk when live-coding is involved), but the talk was very entertaining.</p>

<p><img src="/img/2020-12-09-innoq-technology-day/07.jpg" alt="Sketchnote for &quot;Feedback Loops &amp; Provably Passable Partitions&quot; by Jan Stępień" title="Sketchnote for &quot;Feedback Loops &amp; Provably Passable Partitions&quot; by Jan Stępień" /></p>

<p>I did not sketchnote the keynote from <a href="https://twitter.com/dylanbeattie">Dylan Beattie</a>,
since I was more in the mood for relaxing on the couch,
so my last talk of the day was from <a href="https://twitter.com/stilkov">Stefan Tilkov</a>, talking
about how to create a software consultancy that people enjoy working for.
I was interested in hearing what he had to say, especially because I really do enjoy working for <a href="https://www.innoq.com/">INNOQ</a>, and I have to say that I agree that all of the points that he made do indeed make it a pleasant place to work.</p>

<p><img src="/img/2020-12-09-innoq-technology-day/08.jpg" alt="Sketchnote for &quot;How to build a software consultancy people enjoy working for&quot; by Stefan Tilkov" title="Sketchnote for &quot;How to build a software consultancy people enjoy working for&quot; by Stefan Tilkov" /></p>

<p>All in all, it was an enjoyable conference. The talks should eventually come out on the <a href="https://www.youtube.com/INNOQtv">INNOQ YouTube Channel</a> (although most of them (including mine) will be in German).</p>]]></content><author><name></name></author><category term="sketchnote" /><category term="conference" /><category term="tech" /><summary type="html"><![CDATA[A write up of the first INNOQ Technology Day with a few sketchnotes]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://joyheron.com/img/2020-12-09-innoq-technology-day/03.jpg" /><media:content medium="image" url="https://joyheron.com/img/2020-12-09-innoq-technology-day/03.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Using Modular Scale to Achieve Consistent Design</title><link href="https://joyheron.com/2020-modular-scale-migration" rel="alternate" type="text/html" title="Using Modular Scale to Achieve Consistent Design" /><published>2020-05-20T21:46:00+00:00</published><updated>2020-05-20T21:46:00+00:00</updated><id>https://joyheron.com/modular-scale</id><content type="html" xml:base="https://joyheron.com/2020-modular-scale-migration"><![CDATA[<p>One of the first things that I learned as a developer trying to improve my design skills is that spacing makes a huge difference for the visual design of a site.
It seemed counterintuitive to me that we need to <em>design</em> our whitespace since it is the part of our page which actually does not have any content.
However, I quickly found out that choosing a well thought out spacing scheme can drastically approve the appearance of the site, even we do nothing else.</p>

<p>For my new spacing scale, I wanted to try out <a href="https://www.modularscale.com/">Modular Scale</a>.
The website provides a calculator to choose different bases and ratios to come up with a spacing scale.</p>

<p>I intentionally chose <code class="language-plaintext highlighter-rouge">1.125rem</code> (<code class="language-plaintext highlighter-rouge">18px</code>) for my font size because I believe that having a larger font size than average (the browser default is <code class="language-plaintext highlighter-rouge">1rem</code> or <code class="language-plaintext highlighter-rouge">16px</code>) improves the readability of the site.
I wanted to use this value for my modular scale as well, so I set that as my base and tried out a few different ratios to see what values they would produce.
After a few attempts, I settled on using the golden section for my ratio.
The full scale can be seen <a href="https://www.modularscale.com/?1.125&amp;rem&amp;1.618">here</a>.</p>

<p>I was already using spacing variables in order to define the different spacings on my site.
I like using variables with T-Shirt size labels so that I have a limited selection of spacing values that I can use.
Using the new values that I generated from my modular scale, my spacing variables (which I define using CSS properties) now are defined as follows:</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">:root</span> <span class="p">{</span>
  <span class="py">--space-xxs</span><span class="p">:</span> <span class="m">0.266rem</span><span class="p">;</span>
  <span class="py">--space-xs</span><span class="p">:</span> <span class="m">0.43rem</span><span class="p">;</span>
  <span class="py">--space-sm</span><span class="p">:</span> <span class="m">0.695rem</span><span class="p">;</span>
  <span class="py">--space-md</span><span class="p">:</span> <span class="m">1.125rem</span><span class="p">;</span>
  <span class="py">--space-lg</span><span class="p">:</span> <span class="m">1.82rem</span><span class="p">;</span>
  <span class="py">--space-xl</span><span class="p">:</span> <span class="m">2.945rem</span><span class="p">;</span>
  <span class="py">--space-xxl</span><span class="p">:</span> <span class="m">4.765rem</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Since I was already using spacing variables,
modifying the CSS properties meant that all of my whitespace was automatically using the new scale.</p>

<p>I also wanted to be intentional about choosing font-sizes for my design which also correspond to the same scale.
This is the mistake which I made with the previous design which made it look… not quite as harmonious as I would desire.</p>

<p>My new font sizes are as follows:</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">:root</span> <span class="p">{</span>
  <span class="py">--font-size-sm</span><span class="p">:</span> <span class="m">0.695rem</span><span class="p">;</span> <span class="err">//</span> <span class="err">For</span> <span class="err">small</span> <span class="err">text,</span> <span class="err">tags,</span> <span class="err">etc.</span>
  <span class="py">--font-size-md</span><span class="p">:</span> <span class="m">1.125rem</span><span class="p">;</span> <span class="err">//</span> <span class="err">Base</span> <span class="err">font</span> <span class="err">size</span>
  <span class="py">--font-size-lg</span><span class="p">:</span> <span class="m">1.82rem</span><span class="p">;</span>  <span class="err">//</span> <span class="err">For</span> <span class="err">headings</span>
  <span class="py">--font-size-xl</span><span class="p">:</span> <span class="m">2.945rem</span><span class="p">;</span> <span class="err">//</span> <span class="err">For</span> <span class="err">h1</span> <span class="err">tag</span>
<span class="p">}</span>
</code></pre></div></div>

<p>I really like the effect on large viewports with the really big headings,
but I also found that on mobile the text was a bit too large for the viewport.</p>

<p>To modify this, I created variable font sizes which add <code class="language-plaintext highlighter-rouge">vw</code> units to a base size.
For instance, for the <code class="language-plaintext highlighter-rouge">--font-size-xl</code> Variable that I want to use for my <code class="language-plaintext highlighter-rouge">h1</code> tags,
I can write the following CSS:</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">:root</span> <span class="p">{</span>
  <span class="py">--font-size-xl-grow</span><span class="p">:</span> <span class="n">min</span><span class="p">(</span><span class="n">var</span><span class="p">(</span><span class="n">--font-size-lg</span><span class="p">)</span> <span class="err">+</span> <span class="m">2vw</span><span class="p">,</span>
                           <span class="n">var</span><span class="p">(</span><span class="n">--font-size-xl</span><span class="p">));</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Here the <code class="language-plaintext highlighter-rouge">var(--font-size-lg) + 2vw</code> calculation means that my font size will start out at my base <code class="language-plaintext highlighter-rouge">--font-size-lg</code> and add two <code class="language-plaintext highlighter-rouge">vw</code> units to that value.
Since <code class="language-plaintext highlighter-rouge">2vw</code> is smaller on mobile than on a desktop or tablet with a wider viewport,
the resulting text is smaller on mobile and fits better within the viewport.</p>

<p>I wrapped this calculation in a CSS <code class="language-plaintext highlighter-rouge">min</code> function with my previous value <code class="language-plaintext highlighter-rouge">var(--font-size-xl)</code>.
This provides a clamp on the value,
so that as soon as <code class="language-plaintext highlighter-rouge">var(--font-size-lg) + 2vw</code> is larger than <code class="language-plaintext highlighter-rouge">var(--font-size-xl)</code>,
the <code class="language-plaintext highlighter-rouge">--font-size-xl</code> will be used.</p>

<p>The <code class="language-plaintext highlighter-rouge">min</code> function is <a href="https://caniuse.com/#feat=css-math-functions">pretty widely supported</a>,
but I did add an extra rule in my CSS with a hardcoded value for browsers that don’t support it yet.</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">h1</span> <span class="p">{</span>
  <span class="nl">font-size</span><span class="p">:</span> <span class="m">2.945rem</span><span class="p">;</span> <span class="c">/* Fallback for older browsers */</span>
  <span class="nl">font-size</span><span class="p">:</span> <span class="n">var</span><span class="p">(</span><span class="n">--font-size-xl-grow</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>I made a similar calculation for <code class="language-plaintext highlighter-rouge">--font-size-md-grow</code> and <code class="language-plaintext highlighter-rouge">--font-size-lg-grow</code> which I want to use for <code class="language-plaintext highlighter-rouge">h2</code> and <code class="language-plaintext highlighter-rouge">h3</code> tags as well.</p>

<p>The final variable spacings are as follows:</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">:root</span> <span class="p">{</span>
  <span class="py">--font-size-md-grow</span><span class="p">:</span> <span class="n">min</span><span class="p">(</span><span class="n">var</span><span class="p">(</span><span class="n">--font-size-md</span><span class="p">)</span> <span class="err">+</span> <span class="m">1vw</span><span class="p">,</span>
                           <span class="n">var</span><span class="p">(</span><span class="n">--font-size-lg</span><span class="p">));</span>
  <span class="py">--font-size-lg-grow</span><span class="p">:</span> <span class="n">min</span><span class="p">(</span><span class="n">var</span><span class="p">(</span><span class="n">--font-size-md</span><span class="p">)</span> <span class="err">+</span> <span class="m">2vw</span><span class="p">,</span>
                           <span class="n">var</span><span class="p">(</span><span class="n">--font-size-xl</span><span class="p">));</span>
  <span class="py">--font-size-xl-grow</span><span class="p">:</span> <span class="n">min</span><span class="p">(</span><span class="n">var</span><span class="p">(</span><span class="n">--font-size-lg</span><span class="p">)</span> <span class="err">+</span> <span class="m">2vw</span><span class="p">,</span>
                           <span class="n">var</span><span class="p">(</span><span class="n">--font-size-xl</span><span class="p">));</span>
<span class="p">}</span>
</code></pre></div></div>

<p>I think this strikes a pretty nice balance in having a variable font size,
but one which still is based on the same spacing scale as the other values in the design.
Feel free to take a look at my <a href="/about">about</a> page which I use as my personal design playground to see the effect.</p>]]></content><author><name></name></author><category term="css" /><category term="blog" /><summary type="html"><![CDATA[My experiences moving my website over to modular scale in order to have more consistent spacing]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://joyheron.com/img/2020-05-20-modular-scale/modular-scale.png" /><media:content medium="image" url="https://joyheron.com/img/2020-05-20-modular-scale/modular-scale.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Simple CSS Pattern to Dynamically Abbreviate Text</title><link href="https://joyheron.com/css-content-breakpoints" rel="alternate" type="text/html" title="Simple CSS Pattern to Dynamically Abbreviate Text" /><published>2019-11-26T21:50:00+00:00</published><updated>2019-11-26T21:50:00+00:00</updated><id>https://joyheron.com/css-content-breakpoints</id><content type="html" xml:base="https://joyheron.com/css-content-breakpoints"><![CDATA[<p>Ideally, an HTML element should be able to decide for itself
the best way that it should be displayed based on the current
amount of space that is available. This is the idea behind
<a href="http://www.zeldman.com/2018/05/02/transcript-intrinsic-web-design-with-jen-simmons-the-big-web-show/">intrinsic design</a>.</p>

<p>Instead of trying to design a static layout for one viewport and
then force my content into that layout, I start by writing
semantic HTML and then add a layer of CSS as a <em>suggestion</em> for
my content so that the browser can decide what the best way to
render the page.</p>

<p>Consider the <a href="https://every-layout.dev/layouts/sidebar/">sidebar layout</a> which splits up into a sidebar and main content area
based on the amount of space that is available.</p>

<p><img src="/img/2019-11-26-responsive/HorizontalToVertical.svg" alt="In a wider viewport some content may actually have less space" title="In a wider viewport some content may actually have less space" /></p>

<p>The content which is placed in the main content area will
actually have less space in the two column layout on certain
viewports. When I place content (like a table) into this area, I
want the table to have the ideal layout <em>regardless</em> of how wide
my device or browser window currently is.</p>

<p>Consider the following table:</p>

<div class="horizontal-scroll">
  <table>
    <thead>
      <tr>
        <th>
          Short Header
        </th>
        <th>
          SuperLongTableHeaderName
        </th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>Long content which should actually take up more place</td>
        <td class="number">1</td>
      </tr>
    </tbody>
  </table>
</div>

<p>The width of a column is determined based on the child element
with the largest content. However, when the content of a column
is more important than the header and the header is the cell
with the largest width, the column will take up more space than
necessary, potentially squeezing the content of other columns
and taking up valuable real estate.</p>

<div class="horizontal-scroll">
  <table style="max-width: 300px">
    <thead>
      <tr>
        <th>
          Short Header
        </th>
        <th>
          SuperLongTableHeaderName
        </th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>Long content which should actually take up more place</td>
        <td class="number">1</td>
      </tr>
    </tbody>
  </table>
</div>

<p>What I want is to make the content in my table headers adjust to
the amount of space available, and if there is not enough space,
to show an abbreviation of the heading instead of the complete
text. But if there is enough space, I want to be able to show the
full column name.</p>

<p>Ideally, we would have content breakpoints in CSS and could do this.</p>

<p>Unfortunately, we do not have content breakpoints.</p>

<p>Because of this, I have looked into how we could do this using
CSS and was inspired by the <a href="https://www.heydonworks.com/article/the-flexbox-holy-albatross">holy albatross</a> pattern
by Heydon Pickering as to how to switch content based on the
width of the parent container.</p>

<p>My markup for this is as follows:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">"squishable"</span>
      <span class="na">aria-label=</span><span class="s">"Position"</span>
      <span class="na">data-short=</span><span class="s">"Pos"</span> <span class="nt">/&gt;</span>
</code></pre></div></div>

<p>By using the <code class="language-plaintext highlighter-rouge">aria-label</code> attribute, the full unabbreviated text
will be available to a screen reader.</p>

<p>I then set the content of the <code class="language-plaintext highlighter-rouge">::before</code> and <code class="language-plaintext highlighter-rouge">::after</code>
pseudo-elements in my HTML</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.squishable</span><span class="nd">::before</span> <span class="p">{</span>
  <span class="nl">content</span><span class="p">:</span> <span class="n">attr</span><span class="p">(</span><span class="n">data-short</span><span class="p">);</span>
<span class="p">}</span>
<span class="nc">.squishable</span><span class="nd">::after</span> <span class="p">{</span>
  <span class="nl">content</span><span class="p">:</span> <span class="n">attr</span><span class="p">(</span><span class="n">aria-label</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>By default, both of the texts are now visible, but what I want is
to blend in one or the other based on the width that is available
in the column.</p>

<p>To do this, I define a content breakpoint for my span as a css
property</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.squishable</span> <span class="p">{</span>
  <span class="py">--squish-at</span><span class="p">:</span> <span class="m">1.5rem</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>When the parent container is smaller than my <code class="language-plaintext highlighter-rouge">--squish-at</code> value,
I want to show the <code class="language-plaintext highlighter-rouge">.squishable::before</code> element. Otherwise, I
want to show the <code class="language-plaintext highlighter-rouge">.squishable::after</code> element.</p>

<p>The trick here is to use the <code class="language-plaintext highlighter-rouge">calc</code> function to derive the width
of the container (as I said before, this is inspired by the
<a href="https://www.heydonworks.com/article/the-flexbox-holy-albatross">holy albatross pattern</a>) and to set the <code class="language-plaintext highlighter-rouge">max-width</code> property.</p>

<p>To set the <code class="language-plaintext highlighter-rouge">max-width</code> property, we need our pseudo-elements to
have block spacing and we also want to hide any overflow (e.g
when <code class="language-plaintext highlighter-rouge">max-width</code> is <code class="language-plaintext highlighter-rouge">0</code> we do not want to see anything).</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.squishable</span> <span class="p">{</span>
  <span class="nl">white-space</span><span class="p">:</span> <span class="nb">nowrap</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.squishable</span><span class="nd">::before</span><span class="o">,</span>
<span class="nc">.squishable</span><span class="nd">::after</span> <span class="p">{</span>
  <span class="nl">display</span><span class="p">:</span> <span class="n">inline-block</span><span class="p">;</span>
  <span class="nl">overflow</span><span class="p">:</span> <span class="nb">hidden</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Now comes the magic!</p>

<p>When do we want to show our abbreviation? Here we can set the
<code class="language-plaintext highlighter-rouge">max-width</code> of the <code class="language-plaintext highlighter-rouge">::before</code> pseudo-element.</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.squishable</span><span class="nd">::before</span> <span class="p">{</span>
  <span class="nl">max-width</span><span class="p">:</span> <span class="n">calc</span><span class="p">((</span><span class="n">var</span><span class="p">(</span><span class="n">--squish-at</span><span class="p">)</span> <span class="n">-</span> <span class="m">100%</span><span class="p">)</span> <span class="err">*</span> <span class="m">999</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This works because the calculation <code class="language-plaintext highlighter-rouge">var(--squish-at) - 100%</code> is
only positive when the parent container is smaller than <code class="language-plaintext highlighter-rouge">var(--squish-at)</code>. We then multiply it by the <code class="language-plaintext highlighter-rouge">999</code> magic number so
that it is a <em>really big positive number</em> and since the width
of our abbreviation is smaller than this large <code class="language-plaintext highlighter-rouge">max-width</code> that
we have set, the element will definitely be visible.</p>

<p>The other side of the equation is that when the parent container
is larger than our <code class="language-plaintext highlighter-rouge">var(--squish-at)</code>, the calculation
<code class="language-plaintext highlighter-rouge">var(--squish-at) - 100%</code> will be a negative value. Because the
browser converts this negative <code class="language-plaintext highlighter-rouge">max-width</code> to <code class="language-plaintext highlighter-rouge">0</code>, this means
that if the parent container is larger than <code class="language-plaintext highlighter-rouge">var(--squish-at)</code>,
the abbreviation will not be visible.</p>

<p>We now do the same for the <code class="language-plaintext highlighter-rouge">::after</code> pseudo-element, except that
now we use <code class="language-plaintext highlighter-rouge">100% - var(--squish-at)</code> because this is the value
that is positive when the parent element is wider than our
content breakpoint.</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.squishable</span><span class="nd">::after</span> <span class="p">{</span>
  <span class="nl">max-width</span><span class="p">:</span> <span class="n">calc</span><span class="p">((</span><span class="m">100%</span> <span class="n">-</span> <span class="n">var</span><span class="p">(</span><span class="n">--squish-at</span><span class="p">))</span> <span class="err">*</span> <span class="m">999</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>And we add just a few styles for the table to make it more
responsive and make it possible for the columns headers to
shrink.</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.squishable-table</span> <span class="p">{</span>
  <span class="nl">width</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.squishable-table</span> <span class="nt">th</span> <span class="p">{</span>
  <span class="nl">max-width</span><span class="p">:</span> <span class="m">1.5rem</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Because I am using CSS properties, I can set the content
breakpoint for my column based on the content that is in it.
One easy way to estimate a breakpoint is by using the <code class="language-plaintext highlighter-rouge">ch</code> unit
and setting it to the number of characters in the <code class="language-plaintext highlighter-rouge">aria-label</code>
attribute. This isn’t always a good breakpoint, because the <code class="language-plaintext highlighter-rouge">ch</code>
unit is based on the width of the <code class="language-plaintext highlighter-rouge">0</code> character, but it’s a good
starting off point.</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">"squishable"</span>
      <span class="na">aria-label=</span><span class="s">"THN"</span>
      <span class="na">data-short=</span><span class="s">"No."</span> <span class="err">/</span>
      <span class="na">style=</span><span class="s">"--squish-at: 25ch;"</span><span class="nt">&gt;</span>
</code></pre></div></div>

<p>The main point is that I can set it independently and based
on the content that I am putting inside of the element.</p>

<p>Now the width of the table we had before can be determined
based on the content of the table cells and not on the width
of the table header.</p>

<table class="squishable-table" style="max-width: 300px">
  <thead>
    <tr>
      <th>
        <span class="squishable" aria-label="Short Header" data-short="Header" style="--squish-at: 5ch;" />
      </th>
      <th>
        <span class="squishable" aria-label="SuperLongTableHeaderName" data-short="No." style="--squish-at: 25ch;" />
      </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Long content which should actually take up more place</td>
      <td class="number">1</td>
    </tr>
  </tbody>
</table>

<p>Here’s another table that you can play around with if you are
in a browser and can change the width of the viewport. And here
is the <a href="https://codepen.io/joyheron/pen/BaagQLe">Codepen</a> of the
implementation.</p>

<div class="horizontal-scroll">
  <table class="squishable-table">
    <thead>
      <tr>
        <th>
          <span class="squishable" aria-label="Position" data-short="Pos" style="--squish-at: 8ch;" />
        </th>
        <th>
          <span class="squishable" aria-label="Priority" data-short="Prio" style="--squish-at: 8ch;" />
        </th>
        <th>
          <span class="squishable" aria-label="Number" data-short="No." style="--squish-at: 6ch;" />
        </th>
        <th>
          <span class="squishable" aria-label="Address" data-short="Addr." style="--squish-at: 7ch;" />
        </th>
        <th>
          <span class="non-squishable">Name</span>
        </th>
        <th>
          <span class="squishable" aria-label="Telefone No." data-short="Tel." style="--squish-at: 11ch;" />
        </th>
      </tr>
    </thead>
    <tbody>
      <tr><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td></tr>
      <tr><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td></tr>
      <tr><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td></tr>
      <tr><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td></tr>
      <tr><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td></tr>
      <tr><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td></tr>
      <tr><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td><td>&#8230;</td></tr>
    </tbody>
  </table>
</div>

<!-- ![Set the width of a table header responsively](/img/responsive-css-breakpoint.gif "Set the width of a table header responsively") -->]]></content><author><name></name></author><category term="css" /><category term="blog" /><summary type="html"><![CDATA[Use this CSS pattern to dynamically show or abbreviate text based on the amount of space that is available.]]></summary></entry><entry><title type="html">:clojureD</title><link href="https://joyheron.com/sketchnote/conference/2018/02/24/clojureD.html" rel="alternate" type="text/html" title=":clojureD" /><published>2018-02-24T20:00:00+00:00</published><updated>2018-02-24T20:00:00+00:00</updated><id>https://joyheron.com/sketchnote/conference/2018/02/24/clojureD</id><content type="html" xml:base="https://joyheron.com/sketchnote/conference/2018/02/24/clojureD.html"><![CDATA[<p>Clojure is not only my favorite programming language, but I also really enjoy the Clojure community. I feel this is especially the case in Berlin, where the :clojureD takes place, since the great work that the ClojureBridge has been doing means that there is a lot more diversity at the conference than at other tech conferences I am used to.</p>

<p>I had the privilege again this year to introduce some of the talks for one of the tracks, so I also got to enjoy the company of the other organizers of the conference. The whole day was a bit crazy, but I did manage to sketchnote the talks I listened to, so here they are!</p>

<p>The first talk of the day was about teaching Clojure by Michael Sperbsen. I liked the point that the things that make Clojure great for expert users (e.g. simplicity) are actually beside the point when it comes to teaching programming to someone who is a real beginner.</p>

<p><img src="/img/2018-02-24-clojureD/1.jpg" alt=":clojureD 2018" title=":clojureD 2018" /></p>

<p>The next talk was from Dave Liepmann, Matt Huebert, and Jack Rusher who introduced Maria, which is an interactive coding environment for Clojure. It was created for beginners in mind, but it it also pretty cool for people who have some experience with Clojure. When the conference was over, I went back to the hotel and played around with it and can confirm that the idea is pretty great. You can to go to <a href="https://maria.cloud">https://maria.cloud</a> and play around with it, and if you want to save your snippet, you can connect your GitHub account and save it as a gist.</p>

<p><img src="/img/2018-02-24-clojureD/2.jpg" alt=":clojureD 2018" title=":clojureD 2018" /></p>

<p>In the next talk, Alexandrer Mann shared his experience with solving problems with logging in Clojure at CircleCI. I didn’t know that there were so many different loggers used within a single Clojure project!</p>

<p><img src="/img/2018-02-24-clojureD/3.jpg" alt=":clojureD 2018" title=":clojureD 2018" /></p>

<p>In the next talk, my colleague Jan Stępień talked about structuring Clojure applications. Since every Clojure application needs to decide on an architecture, I think Jan’s suggestions make a lot of sense!</p>

<p><img src="/img/2018-02-24-clojureD/4.jpg" alt=":clojureD 2018" title=":clojureD 2018" /></p>

<p>The next talk I listened to was by Kenneth Kalmer about re-frame and building single page apps using ClojureScript. I don’t actually build SPAs (feels too much like rebuilding a browser to me), but I think Kenneth did a good job of introducing re-frame and explaining how to use it. If I ever want to build an SPA, I’ll definitely give re-frame a look!</p>

<p><img src="/img/2018-02-24-clojureD/5.jpg" alt=":clojureD 2018" title=":clojureD 2018" /></p>

<p>The next talk by Dom Kiva-Meyer about GraphQL was definitely amusing, since it compared GraphQL to a Japanese toilet (and really stuck by the metaphor throughout the presentation). I listened to the talk to try to understand the hype behind GraphQL (even though I am not currently using it). I think I did get an overview of the topic, but I was a bit bothered with the REST bashing that took place in the talk (REST was compared to an outhouse in the overarching metaphor). This is because I love REST (I recognize my biases), but I also didn’t recognize the listed problems with REST in my current projects. This makes me wonder what kind of REST everybody else is using. Of course, I believe the background of the talk was also the assumption that everybody is building SPAs (which I am not doing), and I can see where GraphQL could be very useful for someone building an SPA.</p>

<p><img src="/img/2018-02-24-clojureD/6.jpg" alt=":clojureD 2018" title=":clojureD 2018" /></p>

<p>I really enjoyed the next talk by Lisa Passing about exploring interactive art in Clojure. It was really fun to listen to and watch, and I liked the examples of the bubbly art that you can create. Also, I learned something about probability functions and how they can be used to create ‘randomness’ that seems organic to our eyes.</p>

<p><img src="/img/2018-02-24-clojureD/7.jpg" alt=":clojureD 2018" title=":clojureD 2018" /></p>

<p>The next talk was about functional calisthenics by Jorge Gueorguiev Garcia. I think the rules that he presented to practice functional programming are very interesting, although I think the one about one argument functions probably makes more sense in the context of a functional programming language like Haskell, where currying is more commonly used. Still, I think it would be interesting to try to program a kata using the rules that he listed.</p>

<p><img src="/img/2018-02-24-clojureD/8.jpg" alt=":clojureD 2018" title=":clojureD 2018" /></p>

<p>The :clojureD started winding down with the comedic defjoke by Ray McDermott. Then we had the lightning talks. I definitely want to try out the Omnia REPL which was presented by Robert Avram. Saskia Lindner showed a neat tool for debugging re-frame. Juan Facorro made an argument for why we should try out Clojure on the Erlang VM. And Carolyn Stansky gave a great lightning talk about self-care in tech which I absolutely loved, because I have been trying to be more deliberate with taking care of my health.</p>

<p><img src="/img/2018-02-24-clojureD/9.jpg" alt=":clojureD 2018" title=":clojureD 2018" /></p>

<p>All in all a great conference!!</p>]]></content><author><name></name></author><category term="sketchnote" /><category term="conference" /><category term="clojure" /><summary type="html"><![CDATA[Clojure is not only my favorite programming language, but I also really enjoy the Clojure community. I feel this is especially the case in Berlin, where the :clojureD takes place, since the great work that the ClojureBridge has been doing means that there is a lot more diversity at the conference than at other tech conferences I am used to.]]></summary></entry><entry><title type="html">BOB Konferenz</title><link href="https://joyheron.com/sketchnote/conference/2018/02/23/bobkonf.html" rel="alternate" type="text/html" title="BOB Konferenz" /><published>2018-02-23T20:00:00+00:00</published><updated>2018-02-23T20:00:00+00:00</updated><id>https://joyheron.com/sketchnote/conference/2018/02/23/bobkonf</id><content type="html" xml:base="https://joyheron.com/sketchnote/conference/2018/02/23/bobkonf.html"><![CDATA[<p>This year was my first year at the <a href="http://bobkonf.de/">BOB Konf</a> in Berlin. All of the talks were something to do with FP, and it was really interesting to see the broadness of the spectrum of the talks. Here are my sketchnotes.</p>

<p>The first talk of the day at the BobKonf was about by Leif Andersen, who spoke about writing DSLs in Racket in order to be able to edit video. I enjoyed the matching parentheses and each introduction of yet another DSL.</p>

<p><img src="/img/2018-02-23-bobkonf/1.jpg" alt="BOB Konf 2018" title="BOB Konf 2018" /></p>

<p>The next talk was by Stefan Andjelkovic about testing monadic programs using Quick Check and state machine based models. I thought the example was interesting and was reminded a lot about my university days doing formal methods (he even mentioned Event-B, which is the specification language I worked with for my Master’s thesis!).</p>

<p><img src="/img/2018-02-23-bobkonf/2.jpg" alt="BOB Konf 2018" title="BOB Konf 2018" /></p>

<p>I really like the next sketchnote that I was able to make. Michael Wiedeking gave a talk about data structures and explained how to create immutable linked lists, trees, arrays, and queues without sacrificing too much performance. Structural sharing isn’t new for me, but I liked the reminder and I really liked his explanation of how to create ‘Arrays’ (I think these are similar to Clojure’s Vectors) and queues.</p>

<p><img src="/img/2018-02-23-bobkonf/3.jpg" alt="BOB Konf 2018" title="BOB Konf 2018" /></p>

<p>The next talk was given by Maxim Minin about Fix Engines written in Erlang. I learned a little bit about what FIX (financial information eXchange protocol) is and the technology that is used in the stock market.</p>

<p><img src="/img/2018-02-23-bobkonf/4.jpg" alt="BOB Konf 2018" title="BOB Konf 2018" /></p>

<p>I don’t know too much about hardware, so some parts of the talk about GRiSP bare metal functional programming by Nadezda Zryanina went completely over my head. It was really cool to see live coding and the demo of the cute little robot. And it’s pretty cool that you can recompile the program and send it directly to the robot without having to hook it back up to the computer.</p>

<p><img src="/img/2018-02-23-bobkonf/5.jpg" alt="BOB Konf 2018" title="BOB Konf 2018" /></p>

<p>The next talk by Nikita Volkov was about New Hasql, which is a native Haskell Postgres driver that is faster than C. I thought it was really interesting to see how functional programming can be used in order to implement something like a database driver. Also, even though I don’t have a firm grasp on category theory (it seems to slip into my brain and then right back out), I think I understand a little more after this talks, so I will count that as a win!</p>

<p><img src="/img/2018-02-23-bobkonf/6.jpg" alt="BOB Konf 2018" title="BOB Konf 2018" /></p>

<p>The next talk was by Oskar Wickström and was about using finite state machines in programs to ensure that a program is correctly executed. This talk also reminded me of my time doing formal methods (I still like finite state machines!) and I thought the ideas behind the talk were very interesting. Also (as with the previous talk), I think I might have learned at least a little bit about category theory.</p>

<p><img src="/img/2018-02-23-bobkonf/7.jpg" alt="BOB Konf 2018" title="BOB Konf 2018" /></p>

<p>The final talk of the day was by Hannes Mehnert, and I thought it was really interesting to see formal methods used in the context of modelling network protocols. I’m glad that someone is taking the time to do it, since the whole internet depends on them working!</p>

<p><img src="/img/2018-02-23-bobkonf/8.jpg" alt="BOB Konf 2018" title="BOB Konf 2018" /></p>

<p>Since the BOB Konf has too tracks, my sketchnotes and comments are only on half of the conference. Luckily, the videos for the conference are already online (that was fast!), so if you are interested, you can check them out <a href="http://bobkonf.de/2018/en/program.html">here</a>.</p>]]></content><author><name></name></author><category term="sketchnote" /><category term="conference" /><category term="fp" /><summary type="html"><![CDATA[This year was my first year at the BOB Konf in Berlin. All of the talks were something to do with FP, and it was really interesting to see the broadness of the spectrum of the talks. Here are my sketchnotes.]]></summary></entry><entry><title type="html">INNOQ Event</title><link href="https://joyheron.com/sketchnote/innoq-event/2018/02/16/INNOQ-event.html" rel="alternate" type="text/html" title="INNOQ Event" /><published>2018-02-16T18:00:00+00:00</published><updated>2018-02-16T18:00:00+00:00</updated><id>https://joyheron.com/sketchnote/innoq-event/2018/02/16/INNOQ-event</id><content type="html" xml:base="https://joyheron.com/sketchnote/innoq-event/2018/02/16/INNOQ-event.html"><![CDATA[<p>I’ve posted sketchnotes previously about <a href="https://innoq.com">INNOQ</a> events and how much I enjoy them. This event was a pure ‘Vortragsevent’ (i.e. ‘Presentation Event’), which meant that I got to listen to great talks from my colleagues for two days. The focus was on short talks (there were a few 30 minute presentations, mainly 15 minute presentations, and some 5 minute lighting talks). I’m a big fan of the concise format, because I think when you are limited to a shorter period of time, the quality of the presentation is better.</p>

<p>Here are my sketchnotes from the event. I experimented with different colors and styles on the different days. I really like the bees from day one.</p>

<h1 id="day-1">Day 1</h1>

<p><img src="/img/2018-02-14-INNOQ-event/1.jpg" alt="Day 1" title="Day 1" />
<img src="/img/2018-02-14-INNOQ-event/2.jpg" alt="Day 1" title="Day 1" />
<img src="/img/2018-02-14-INNOQ-event/3.jpg" alt="Day 1" title="Day 1" /></p>

<h1 id="day-2">Day 2</h1>

<p><img src="/img/2018-02-14-INNOQ-event/4.jpg" alt="Day 2" title="Day 2" />
<img src="/img/2018-02-14-INNOQ-event/5.jpg" alt="Day 2" title="Day 2" />
<img src="/img/2018-02-14-INNOQ-event/6.jpg" alt="Day 2" title="Day 2" /></p>]]></content><author><name></name></author><category term="sketchnote" /><category term="INNOQ-event" /><category term="INNOQ-event" /><summary type="html"><![CDATA[I’ve posted sketchnotes previously about INNOQ events and how much I enjoy them. This event was a pure ‘Vortragsevent’ (i.e. ‘Presentation Event’), which meant that I got to listen to great talks from my colleagues for two days. The focus was on short talks (there were a few 30 minute presentations, mainly 15 minute presentations, and some 5 minute lighting talks). I’m a big fan of the concise format, because I think when you are limited to a shorter period of time, the quality of the presentation is better.]]></summary></entry><entry><title type="html">core.async</title><link href="https://joyheron.com/sketchnote/clojure-meetup/2018/01/24/clojure-meetup.html" rel="alternate" type="text/html" title="core.async" /><published>2018-01-24T21:00:00+00:00</published><updated>2018-01-24T21:00:00+00:00</updated><id>https://joyheron.com/sketchnote/clojure-meetup/2018/01/24/clojure-meetup</id><content type="html" xml:base="https://joyheron.com/sketchnote/clojure-meetup/2018/01/24/clojure-meetup.html"><![CDATA[<p>Today at the <a href="https://www.meetup.com/de-DE/Dusseldorf-Clojure-Meetup/">Clojure Meetup in Düsseldorf</a>, <a href="https://twitter.com/MrOerni">Björn Ebbinghaus</a> presented Clojure’s core.async for us. A very interesting evening! I love core.async!</p>

<p>Here are my notes:</p>

<p><img src="/img/2018-01-24-clojure-meetup/1.jpg" alt="Clojure Meetup" title="Clojure Meetup" /></p>

<p>After the talk, I absolutely had to try out working with core.async channels and transducers because I didn’t know that worked!</p>

<pre>
(defn c (chan 1 (map inc)))
</pre>

<p>Whenever you put an element in a channel, the transformation in the transducer will be applied to the element before it is retrieved from the channel!</p>

<p>As a bonus, <a href="https://twitter.com/m_mainz">Mario Mainz</a> helped me by giving me a few more tips about how to use spacemacs. I didn’t actually close it immediately!</p>

<p><img src="/img/2018-01-24-clojure-meetup/2.jpg" alt="Clojure Meetup" title="Clojure Meetup" /></p>]]></content><author><name></name></author><category term="sketchnote" /><category term="clojure-meetup" /><category term="clojure" /><category term="meetup" /><summary type="html"><![CDATA[Today at the Clojure Meetup in Düsseldorf, Björn Ebbinghaus presented Clojure’s core.async for us. A very interesting evening! I love core.async!]]></summary></entry><entry><title type="html">EntwickelBar</title><link href="https://joyheron.com/blog/sketchnote/unconference/2017/12/02/entwickelbar.html" rel="alternate" type="text/html" title="EntwickelBar" /><published>2017-12-02T19:30:00+00:00</published><updated>2017-12-02T19:30:00+00:00</updated><id>https://joyheron.com/blog/sketchnote/unconference/2017/12/02/entwickelbar</id><content type="html" xml:base="https://joyheron.com/blog/sketchnote/unconference/2017/12/02/entwickelbar.html"><![CDATA[<p>We just had <a href="https://entwickelbar.github.io">EntwickelBar 1.0</a>, the first and best Open Space Unconference in Düsseldorf. Of course, I am extremely biased since I organized the conference together with two friends (<a href="https://twitter.com/jbendisposto">Jens</a> and <a href="https://twitter.com/cmeter_">Christian</a>).</p>

<p>I love <a href="https://en.wikipedia.org/wiki/Open_Space_Technology">open space</a>. There is some effort involved in organizing an open space event, but the amount of value that all participants can gain from the event far exceeds the amount of effort it takes to put everything together.</p>

<p>I am also continually surprised by how well the open space method works.</p>

<p>At the beginning, we set up the marketplace. Traditionally, this consists of an empty agenda and a circle of Post-ITs and markers in the middle with a ring of chairs around the Post-Its.</p>

<p><img src="/img/2017-12-02-entwickelbar/1.jpg" alt="EntwickelBar" title="EntwickelBar" /></p>

<p>Then the moderator opens the open space, telling the story of open space and how the open space event will run:</p>

<h4 id="principles">principles</h4>

<ol>
  <li>It begins when it begins</li>
  <li>It is over when it is over</li>
  <li>What happens is the only thing that could happen</li>
  <li>Those who come to a session are the right people</li>
</ol>

<h4 id="the-law-of-two-feet">The Law of Two Feet</h4>

<ul>
  <li>As soon as you can no longer contribute something to a session or can no longer learn anything from a new session, you should leave and go somewhere else where you can contribute or learn more.</li>
</ul>

<p><a href="https://twitter.com/cmeter_">Christian</a> got this picture of me doing the open space moderation</p>

<p><img src="/img/2017-12-02-entwickelbar/2.jpg" alt="EntwickelBar" title="EntwickelBar" /></p>

<p>What always astonishes me about open space events is how well it works. In almost no time at all, our agenda was very full with amazing topics.</p>

<p><img src="/img/2017-12-02-entwickelbar/3.jpg" alt="EntwickelBar" title="EntwickelBar" />
<img src="/img/2017-12-02-entwickelbar/4.jpg" alt="EntwickelBar" title="EntwickelBar" /></p>

<p>Keep reading if you want to see <a href="#sketchnotes">my sketchnotes from the different sessions</a> or <a href="#mysketchnotesession">the flip chart pages from my sketchnote session</a>.</p>

<h3 id="sketchnotes-from-the-sessions">Sketchnotes from the sessions</h3>
<p><a name="sketchnotes"></a></p>

<p>I feel like I took away quite a lot from the day. I joined some interesting discussion groups about software design bias and hype driven development, and got a short intro to Test Containers and JUnit 5. I also stopped into the Clojure session briefly just to say hi.</p>

<p>The topic session that I found most interesting was about Trunk Based Development. It was simply very interesting to discuss how the development process is usually different for everybody. Pretty much everybody in the room had an option about the “right way” to develop, even though we all were using Git. We all are still probably convinced that our way is best, but it was definitely eye-opening to discuss that with others. I now also know what trunk-based development is, and even though I will not be doing it myself in the forseeable future, I now also know that some people do use it successfully.</p>

<p>Here are my sketchnotes:</p>

<p><img src="/img/2017-12-02-entwickelbar/13.jpg" alt="EntwickelBar" title="EntwickelBar" />
<img src="/img/2017-12-02-entwickelbar/14.jpg" alt="EntwickelBar" title="EntwickelBar" />
<img src="/img/2017-12-02-entwickelbar/15.jpg" alt="EntwickelBar" title="EntwickelBar" />
<img src="/img/2017-12-02-entwickelbar/16.jpg" alt="EntwickelBar" title="EntwickelBar" />
<img src="/img/2017-12-02-entwickelbar/17.jpg" alt="EntwickelBar" title="EntwickelBar" /></p>

<h3 id="my-sketchnote-section">My Sketchnote Section</h3>
<p><a name="mysketchnotesession"></a></p>

<p>I also held a session about sketchnoting during the conference.</p>

<p>Here is a picture of me holding the session (photo cred: <a href="https://twitter.com/benediktritter">Benedikt Ritter</a> (<a href="https://twitter.com/benediktritter/status/936946342064254976">source</a>))</p>

<p><img src="/img/2017-12-02-entwickelbar/5.jpg" alt="EntwickelBar" title="EntwickelBar" /></p>

<p>In my session, I covered the why and how of making sketchnotes. Then I talked about the elements that can be used in sketchnotes (arrows, etc.) and how to use color meaningfully. Afterwards, we had some further discussion and <a href="https://twitter.com/faradaxian">Mattias Rottländer</a> added to my session by teaching everybody how to draw the docker whale.</p>

<p>Here are my flip charts (in German) from my session:</p>

<p><img src="/img/2017-12-02-entwickelbar/6.jpg" alt="EntwickelBar" title="EntwickelBar" />
<img src="/img/2017-12-02-entwickelbar/7.jpg" alt="EntwickelBar" title="EntwickelBar" />
<img src="/img/2017-12-02-entwickelbar/8.jpg" alt="EntwickelBar" title="EntwickelBar" />
<img src="/img/2017-12-02-entwickelbar/9.jpg" alt="EntwickelBar" title="EntwickelBar" />
<img src="/img/2017-12-02-entwickelbar/10.jpg" alt="EntwickelBar" title="EntwickelBar" />
<img src="/img/2017-12-02-entwickelbar/11.jpg" alt="EntwickelBar" title="EntwickelBar" />
<img src="/img/2017-12-02-entwickelbar/12.jpg" alt="EntwickelBar" title="EntwickelBar" /></p>

<p>All in all, it was a great day!</p>]]></content><author><name></name></author><category term="blog" /><category term="sketchnote" /><category term="unconference" /><category term="entwickelbar" /><category term="openspace" /><category term="unconference" /><summary type="html"><![CDATA[We just had EntwickelBar 1.0, the first and best Open Space Unconference in Düsseldorf. Of course, I am extremely biased since I organized the conference together with two friends (Jens and Christian).]]></summary></entry><entry><title type="html">Facilitation Training</title><link href="https://joyheron.com/sketchnote/workshop/2017/11/28/facilitation-training.html" rel="alternate" type="text/html" title="Facilitation Training" /><published>2017-11-28T19:30:00+00:00</published><updated>2017-11-28T19:30:00+00:00</updated><id>https://joyheron.com/sketchnote/workshop/2017/11/28/facilitation-training</id><content type="html" xml:base="https://joyheron.com/sketchnote/workshop/2017/11/28/facilitation-training.html"><![CDATA[<p>At <a href="https://innoq.com">innoQ</a>, we had the opportunity to participate in a facilitation training with trainer <a href="https://twitter.com/teamfuture17">Christine Neidhardt</a>. The topics we covered were quite advanced, and I’m not quite sure how I will be able to directly apply them right now. My favorite takeaway was “Be the facilitator you wish you had”. I’m looking forward to being able to do some facilitation in the future.</p>

<p>Here are my sketchnotes:</p>

<p><img src="/img/2017-11-28-facilitation-training/1.jpg" alt="Facilitation Training" title="Facilitation Training" />
<img src="/img/2017-11-28-facilitation-training/2.jpg" alt="Facilitation Training" title="Facilitation Training" />
<img src="/img/2017-11-28-facilitation-training/3.jpg" alt="Facilitation Training" title="Facilitation Training" />
<img src="/img/2017-11-28-facilitation-training/4.jpg" alt="Facilitation Training" title="Facilitation Training" />
<img src="/img/2017-11-28-facilitation-training/5.jpg" alt="Facilitation Training" title="Facilitation Training" />
<img src="/img/2017-11-28-facilitation-training/6.jpg" alt="Facilitation Training" title="Facilitation Training" />
<img src="/img/2017-11-28-facilitation-training/7.jpg" alt="Facilitation Training" title="Facilitation Training" /></p>]]></content><author><name></name></author><category term="sketchnote" /><category term="workshop" /><category term="innoQ-workshop" /><category term="moderation" /><category term="facilitation" /><summary type="html"><![CDATA[At innoQ, we had the opportunity to participate in a facilitation training with trainer Christine Neidhardt. The topics we covered were quite advanced, and I’m not quite sure how I will be able to directly apply them right now. My favorite takeaway was “Be the facilitator you wish you had”. I’m looking forward to being able to do some facilitation in the future.]]></summary></entry></feed>