<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Guillaume Meigniez Blog</title>
  <subtitle>Life updates and tech-related thoughts.</subtitle>
  <link href="https://guillaumemeigniez.me/blog.xml" rel="self" />
  <link href="https://guillaumemeigniez.me/" />
  <updated>2026-07-13T00:00:00Z</updated>
  <id>https://guillaumemeigniez.me/</id>
  <author>
    <name>Guillaume Meigniez</name>
  </author>
  <entry>
    <title>Typography tokens - Bonus</title>
    <link href="https://guillaumemeigniez.me/blog/typography-tokens-are-hard-bonus/" />
    <updated>2026-07-13T00:00:00Z</updated>
    <id>https://guillaumemeigniez.me/blog/typography-tokens-are-hard-bonus/</id>
    <content type="html">&lt;p&gt;I recently published a &lt;a href=&quot;https://guillaumemeigniez.me/blog/typography-tokens-are-hard-1/&quot; class=&quot;mdf-link&quot;&gt;2&lt;/a&gt; &lt;a href=&quot;https://guillaumemeigniez.me/blog/typography-tokens-are-hard-2/&quot; class=&quot;mdf-link&quot;&gt;parts&lt;/a&gt; blog post regarding the challenges inherent to building typography design tokens. During the research that led to these posts I wrote down surprising things and went down a few rabbit holes. Those did not make it into the original posts, so I&#39;ll talk about theme here.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Google Fonts&lt;/h3&gt;
&lt;p&gt;Google&#39;s advices regarding Google Fonts is that you should use their CDN and that &lt;a href=&quot;https://fonts.google.com/faq?hl=en#privacy&quot; class=&quot;mdf-link&quot;&gt;they will not&lt;/a&gt; &amp;quot;use any information collected by Google Fonts to create profiles of end users or for targeted advertising&amp;quot;.&lt;span class=&quot;soft-space&quot;&gt;

&lt;/span&gt;I have to say that, before looking into it, I thought that downloading the font via &lt;code class=&quot;mdf-code-inline&quot;&gt;fonts.gstatic.com&lt;/code&gt; was lazy but fine. Now I believe that you should never impose that on your users for privacy reasons.&lt;/p&gt;
&lt;p&gt;Google saying that the user information (IP, referrer, user agent) is not collected by Google Font does not mean that they don&#39;t collect it at all. It&#39;s unclear which services are used by Google to track users online, but it&#39;s pretty obvious that with the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Privacy/Guides/Third-party_cookies&quot; class=&quot;mdf-link&quot;&gt;third party cookies restrictions&lt;/a&gt;, big actors look at other ways to track users such as fingerprinting.&lt;/p&gt;
&lt;p&gt;For now the IP address is considered personal data as defined by GDPR, and downloading third party content on a website shares that data. As far as the fonts are concerned, it is always done without the user&#39;s consent (it wouldn&#39;t make sense to wait for a consent before displaying the expected font), and therefore is illegal. The &lt;a href=&quot;https://www.gesetze-bayern.de/Content/Document/Y-300-Z-BECKRS-B-2022-N-612&quot; class=&quot;mdf-link&quot;&gt;Munich court ruling&lt;/a&gt; from 2022 is very interesting but does not seem to have set a precedent that would impact how websites download fonts.&lt;/p&gt;
&lt;p&gt;Additionally (if I understand the situation correctly) the &lt;a href=&quot;https://en.wikipedia.org/wiki/EU%E2%80%93US_Data_Privacy_Framework&quot; class=&quot;mdf-link&quot;&gt;2023 EU–US Data Privacy Framework&lt;/a&gt; seems to have created the confusion about whether or not that ruling would be the same today.&lt;span class=&quot;soft-space&quot;&gt;

&lt;/span&gt;Anyway, preventing websites from downloading fonts from third parties would be a problem for Data Protection Authorities who lack funding to enforce the law when it comes to consent on the internet.&lt;/p&gt;
&lt;p&gt;That may be one of the reasons why the European Commission with the &lt;a href=&quot;https://digital-strategy.ec.europa.eu/en/library/digital-omnibus-regulation-proposal?ref=element.io&quot; class=&quot;mdf-link&quot;&gt;EU Digital Omnibus proposal&lt;/a&gt; is in the process of changing the meaning of &amp;quot;personal data&amp;quot; to &lt;a href=&quot;https://www.pinsentmasons.com/out-law/news/eu-digital-simplification-to-soften-data-ai-rules&quot; class=&quot;mdf-link&quot;&gt;define it as something&lt;/a&gt; &amp;quot;reasonably likely to be used to identify the natural person to whom the information relates&amp;quot;. Who knows what &amp;quot;reasonably&amp;quot; means.&lt;span class=&quot;soft-space&quot;&gt;

&lt;/span&gt;Two fun facts to conclude this section:&lt;/p&gt;
&lt;ul class=&quot;mdf-list&quot;&gt;
&lt;li class=&quot;mdf-list-item&quot;&gt;IBM Carbon was actually &lt;a href=&quot;https://v10.carbondesignsystem.com/guidelines/typography/code/&quot; class=&quot;mdf-link&quot;&gt;making you download Google Fonts&lt;/a&gt; with Google CDN until version 10. Version 11 came out four years ago but some websites such as &lt;a href=&quot;https://login.ibm.com/authsvc/mtfim/sps/authsvc?PolicyId=urn:ibm:security:authentication:asf:basicldapuser&quot; class=&quot;mdf-link&quot;&gt;IBM&#39;s global login page&lt;/a&gt; still download IBM Plex from &lt;code class=&quot;mdf-code-inline&quot;&gt;fonts.gstatic.com&lt;/code&gt;.&lt;/li&gt;
&lt;li class=&quot;mdf-list-item&quot;&gt;Even if you are careful to self-host fonts on your domain, some bot challenge pages download fonts from &lt;code class=&quot;mdf-code-inline&quot;&gt;fonts.gstatic.com&lt;/code&gt; (for the 5 elements they need to display), which would leak your users personal data.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Figma &amp;amp; DTCG&lt;/h3&gt;
&lt;p&gt;I work on web apps and websites so I&#39;m always surprised when Figma does something that doesn&#39;t exactly match what browser specs say. (I also worked on a fairly large design system for web &amp;amp; mobile, but the mobile part was React Native, thus the use of typography design tokens was pretty much equivalent to a web css-in-js setup.)&lt;/p&gt;
&lt;p&gt;For example, I notice the gap when designers say &amp;quot;hug&amp;quot; and &amp;quot;fill&amp;quot; instead of &amp;quot;fit-content&amp;quot; and &amp;quot;max-content&amp;quot;, &amp;quot;frame&amp;quot; for &amp;quot;div&amp;quot; or &amp;quot;constraints&amp;quot; for &amp;quot;position&amp;quot;. Figma invents a new set of terminologies to match the already established ideas of what a &amp;quot;frame&amp;quot; or a &amp;quot;constraint&amp;quot; are in different platforms. This leads to passionate discussion when naming things for a design system.&lt;/p&gt;
&lt;p&gt;At the same time, Figma does look a lot like it&#39;s made to match the properties of CSS. It feels like Figma is stuck in between being universal enough to match any prototyping practice, and being specific enough so that the web-focused users (probably most of them) have a seamless experience.&lt;/p&gt;
&lt;p&gt;In that sense the &lt;a href=&quot;https://www.w3.org/community/design-tokens/&quot; class=&quot;mdf-link&quot;&gt;Design Tokens Community Group&lt;/a&gt; faces the same dichotomy when building specs for design tokens which have to be both ubiquitous and compatible with unique web specificities.&lt;/p&gt;
&lt;p&gt;For example &lt;a href=&quot;https://github.com/design-tokens/community-group/issues/390&quot; class=&quot;mdf-link&quot;&gt;one of the latest issues&lt;/a&gt; opened on their GitHub repository is asking why there&#39;s no support for &lt;code class=&quot;mdf-code-inline&quot;&gt;em&lt;/code&gt; as a dimension token unit, while &lt;code class=&quot;mdf-code-inline&quot;&gt;px&lt;/code&gt; and &lt;code class=&quot;mdf-code-inline&quot;&gt;rem&lt;/code&gt; already exist. It&#39;s a valid question for someone trying to fit the DTCG specs with their web project. But also isn&#39;t it weird that the DTCG spec has a unit called &amp;quot;rem&amp;quot;, which is a web convention thay may not make sense on other platforms?&lt;/p&gt;
&lt;p&gt;I did not include anything about DTCG in my first two blog posts because its specs are not widely integrated across the design system tech tools yet. Maybe due to the dichotomy mentioned above.&lt;span class=&quot;soft-space&quot;&gt;

&lt;/span&gt;On a side note, DTCG does not indicate any way of building typography design tokens that take into account the &lt;code class=&quot;mdf-code-inline&quot;&gt;@font-face&lt;/code&gt; rule pitfalls.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Font weight tokens&lt;/h3&gt;
&lt;p&gt;When researching the topic of web typography from the designer&#39;s point of view I noticed that there&#39;s a very common misunderstanding of the weight of fonts. Most designer oriented tutorials and content I came across confuse the weight scale of a font with the arbitrary static naming it was given by the font creators.&lt;/p&gt;
&lt;p&gt;It becomes a problem when using a token for font weight thinking that it would work across font families. As if the glyphs in &amp;quot;Montserrat-Medium.ttf&amp;quot; would have the same thickness as &amp;quot;Helvetica-Md.ttf&amp;quot;. As if the &amp;quot;Medium&amp;quot;, &amp;quot;Rg&amp;quot;, &amp;quot;black&amp;quot; or &amp;quot;DARK&amp;quot; that appear in font file names were a norm that matches a predictable thickness.&lt;/p&gt;
&lt;p&gt;One of the points of my previous blog posts was to explain how those are completely arbitrary and how the &lt;code class=&quot;mdf-code-inline&quot;&gt;@font-face&lt;/code&gt; rule must be the link between the numerical weight scale (from 100 to 1000) and the font file.&lt;/p&gt;
&lt;p&gt;Many tutorials on how to build design tokens for typographies in Figma tell you to create primitive weight tokens such as &amp;quot;Medium&amp;quot;, &amp;quot;Regular&amp;quot; etc. In which case the naming has to match the exact weight naming of the font file in Figma. Doing so would obviously break as soon as you change font families.&lt;/p&gt;
&lt;p&gt;I believe that it&#39;s always a bad idea to name weight tokens that way. It only makes the designer&#39;s job easier when creating the token system. It seems to be much more robust to use the numerical scale.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Typography tokens are hard to get right - Part 2</title>
    <link href="https://guillaumemeigniez.me/blog/typography-tokens-are-hard-2/" />
    <updated>2026-06-22T00:00:00Z</updated>
    <id>https://guillaumemeigniez.me/blog/typography-tokens-are-hard-2/</id>
    <content type="html">&lt;p&gt;In &lt;a href=&quot;https://guillaumemeigniez.me/blog/typography-tokens-are-hard-1/&quot; class=&quot;mdf-link&quot;&gt;part 1&lt;/a&gt; we saw that most design systems don&#39;t consider how fonts work on the web when building their tokens system. Not thinking about the CSS &lt;code class=&quot;mdf-code-inline&quot;&gt;@font-face&lt;/code&gt; rule leads to solely performative font-weight, font-family and font-style primitive tokens that cannot be automatically updated.&lt;/p&gt;
&lt;p&gt;Now let&#39;s see what solutions existing design systems have opted for.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Static typography&lt;/h3&gt;
&lt;p&gt;Most design systems are created with one or two specific font families in mind. The fonts are core to the design of the system and are not supposed to ever be modified. It makes sense to do so: different fonts have different ways of filling the space on the page, and you need to build your colours, your animations and your spacings accordingly. A good example for that is &lt;a href=&quot;https://carbondesignsystem.com/&quot; class=&quot;mdf-link&quot;&gt;IBM Carbon&lt;/a&gt; that uses their own historical typography tied to IBM&#39;s global design vision:&lt;/p&gt;
&lt;div class=&quot;mdf-quote&quot;&gt;
  &lt;blockquote cite=&quot;https://carbondesignsystem.com/elements/typography/overview/&quot;&gt;
  Our approach to the typographic system uses IBM Plex as its typeface. It has been carefully engineered with suitable scales, styles, and weights to help create clear hierarchies and organize information that guides users through IBM products or experiences.
  &lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;When you use Carbon Design, you need to download their npm packages. In the &lt;a href=&quot;https://github.com/carbon-design-system/carbon/blob/c393ca1d1f7ea110bae44b2ca0ea5bd3ba4ac8c1/packages/styles/scss/fonts/README.md&quot; class=&quot;mdf-link&quot;&gt;README.md&lt;/a&gt; of &lt;code class=&quot;mdf-code-inline&quot;&gt;@carbon/styles&lt;/code&gt; it&#39;s explained how you&#39;ll have to manually include the fonts you want to use in the code. Their tooling does the rest. But in the end, the family, width and style of fonts are not design tokens.&lt;/p&gt;
&lt;p&gt;Other design systems have a frozen font-family but also expose typography tokens as if you could update them as easily as you change the shade of &lt;code class=&quot;mdf-code-inline&quot;&gt;red-500&lt;/code&gt;. An example of that would be &lt;a href=&quot;https://www.skyscanner.design/latest/welcome-to-backpack-Mtf5OEo4&quot; class=&quot;mdf-link&quot;&gt;Skyscanner&#39;s Backpack&lt;/a&gt; design system with &amp;quot;Skyscanner Relative&amp;quot; and &amp;quot;Larken&amp;quot; custom fonts, &lt;a href=&quot;https://github.com/Skyscanner/backpack-foundations/blob/67a322c376e6855122e8e5bf2a2b69b2b34887fe/packages/bpk-foundations-web/tokens/base.scss#L799&quot; class=&quot;mdf-link&quot;&gt;typography tokens&lt;/a&gt; passed as-is to SCSS mixins and no &lt;code class=&quot;mdf-code-inline&quot;&gt;@font-faces&lt;/code&gt; indications. These tokens are purely performative, and design system authors might not be aware of the extra step required to update their value.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;System fonts&lt;/h3&gt;
&lt;p&gt;Several battle-tested design systems have opted for system fonts. Similarly to the static typographies above, they set a specific list of system fonts as the &lt;code class=&quot;mdf-code-inline&quot;&gt;font-family&lt;/code&gt;. Examples of these can be found in &lt;a href=&quot;https://github.com/salesforce-ux/design-system/blob/ace6c9cfcf03e6eedf030468ee10b2e68f555c51/design-tokens/aliases/font-family.yml&quot; class=&quot;mdf-link&quot;&gt;Salesforce Lightning 2&lt;/a&gt;, &lt;a href=&quot;https://github.com/palantir/blueprint/blob/develop/packages/core/src/design-tokens/tokens/base/typography.tokens.json&quot; class=&quot;mdf-link&quot;&gt;Palantir&#39;s Blueprint&lt;/a&gt; or &lt;a href=&quot;https://primer.style/product/primitives/typography/&quot; class=&quot;mdf-link&quot;&gt;GitHub&#39;s Primer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The advantage of this strategy is that the &amp;quot;system fonts&amp;quot; are expected to already be present on the vast majority of users&#39; devices. Also, even if one of the system fonts is not available, or when setting various font-weight and font-style, the result has good chances to look like what you&#39;d expect.&lt;/p&gt;
&lt;p&gt;But your texts would look generic, and if you are trying to build a brand with a little more character the texts might look a little plain.&lt;/p&gt;
&lt;p&gt;Most importantly the final look of your typography would not be set in stone. You can&#39;t predict what&#39;s available on the user&#39;s device, and might have to design your apps with multiple possible fonts in mind. If the user has one of the system fonts available, it will be used even if the font-style or font-weight do not exist for that specific font on the user&#39;s device. According to the &lt;a href=&quot;https://www.w3.org/TR/css-fonts-4/#font-synthesis-intro&quot; class=&quot;mdf-link&quot;&gt;W3C documentation&lt;/a&gt;, the user agent (browser) might (or not) adapt the characters to look like what it predicts you want:&lt;/p&gt;
&lt;div class=&quot;mdf-quote&quot;&gt;
  &lt;blockquote cite=&quot;https://www.w3.org/TR/css-fonts-4/#font-synthesis-intro&quot;&gt;
  For example, a user agent might:
  &lt;ul class=&quot;mdf-list&quot;&gt;
    &lt;li&gt;synthesize a bold face by drawing a thin stroke around each glyph&lt;/li&gt;
    &lt;li&gt;[...]&lt;/li&gt;
    &lt;li&gt;synthesize an oblique face by geometrical shearing of each glyph&lt;/li&gt;
  &lt;/ul&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;These synthetic fonts are the infamous &lt;em&gt;faux-bold&lt;/em&gt; and &lt;em&gt;faux-italic&lt;/em&gt;, and every browser is free to make them look however they want.&lt;/p&gt;
&lt;p&gt;With system fonts you should be ready for the text to look very different between users.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Generated @font-face&lt;/h3&gt;
&lt;p&gt;If the design system has a token for the font-family (i.e. you&#39;re supposed to be able to change the family), we saw that you have to update the &lt;code class=&quot;mdf-code-inline&quot;&gt;@font-face&lt;/code&gt; every time it changes to adapt which font file each text setting points to. This can technically be done automatically by generating the CSS &lt;code class=&quot;mdf-code-inline&quot;&gt;@font-face&lt;/code&gt; every time the project is built.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://guillaumemeigniez.me/blog/typography-tokens-are-hard-1/&quot; class=&quot;mdf-link&quot;&gt;part 1&lt;/a&gt; we had this example:&lt;/p&gt;
&lt;pre class=&quot;mdf-code-block&quot;&gt;&lt;code&gt;@font-face {
  font-family: Proxima Nova;
  font-weight: 400;
  font-style: italic;
  src: url(/static-assets/font/ProximaNova-RegIt-webfont.woff2) format(&amp;quot;woff2&amp;quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So we&#39;d want the font face rule depend on the tokens like this:&lt;/p&gt;
&lt;pre class=&quot;mdf-code-block&quot;&gt;&lt;code&gt;@font-face {
  font-family: var(--body-italic-font-family);
  font-weight: var(--body-italic-font-weight);
  font-style: var(--body-italic-font-style);
  src: url(var(--body-italic-font-src)) format(var(--body-italic-font-format));
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With two new tokens: one for the URL at which the new font file can be found, and a format token for the type of font file.&lt;/p&gt;
&lt;p&gt;There are still two issues:&lt;/p&gt;
&lt;ul class=&quot;mdf-list&quot;&gt;
&lt;li class=&quot;mdf-list-item&quot;&gt;CSS variables are not supported inside &lt;code class=&quot;mdf-code-inline&quot;&gt;@font-face&lt;/code&gt; rules, so there needs to be a CSS pre-processor such as Sass or a specific build step that does it.&lt;/li&gt;
&lt;li class=&quot;mdf-list-item&quot;&gt;Having the URL as a tokens means that you have to know that the file exists at a specific location (and will stay there). And if that location is your server, you&#39;ll still need to upload the new font file to it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;IBM Carbon &lt;a href=&quot;https://github.com/carbon-design-system/carbon/blob/main/packages/styles/scss/fonts/_sans.scss&quot; class=&quot;mdf-link&quot;&gt;does a version&lt;/a&gt; of this, but their use case is a little different, because they already have a restricted set of fonts, they can pick the right one and set its (local) location inside an auto-generated font-face on build.&lt;/p&gt;
&lt;p&gt;Another example of that is the US Web Design System that &lt;a href=&quot;https://github.com/uswds/uswds/blob/12b176dd9585a467b683ddd0241940838cc03c3c/packages/uswds-core/src/styles/mixins/general/font-face.scss#L9&quot; class=&quot;mdf-link&quot;&gt;generates&lt;/a&gt; &lt;code class=&quot;mdf-code-inline&quot;&gt;@font-face&lt;/code&gt; on build based on a set of design tokens. However, just like IBM Carbon, USWDS specifies &lt;a href=&quot;https://designsystem.digital.gov/components/typography/&quot; class=&quot;mdf-link&quot;&gt;a set of font families&lt;/a&gt; that are shipped with the design system itself.&lt;/p&gt;
&lt;p&gt;For both of these design systems you could still set an URL for your custom fonts requirements.&lt;/p&gt;
&lt;p&gt;On a side note, using font sources from Google Fonts is convenient, but is not a good idea, especially in the EU. You would condemn all your users to ping a Google server every time they open a web page using your design tokens, which (most probably) helps tracking their behaviour. In 2022 &lt;a href=&quot;https://www.gesetze-bayern.de/Content/Document/Y-300-Z-BECKRS-B-2022-N-612&quot; class=&quot;mdf-link&quot;&gt;a Court in Munich&lt;/a&gt; ruled the practice of sharing a user&#39;s IP with a US server through the download of a Google font unlawful.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Variable fonts&lt;/h3&gt;
&lt;p&gt;Last but not least, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Fonts/Variable_fonts&quot; class=&quot;mdf-link&quot;&gt;variable fonts&lt;/a&gt; can be a piece of the solution. If your priority is to be able to update &lt;code class=&quot;mdf-code-inline&quot;&gt;font-weight&lt;/code&gt; and &lt;code class=&quot;mdf-code-inline&quot;&gt;font-style&lt;/code&gt; whenever you want, they might be your best shot.&lt;/p&gt;
&lt;p&gt;With variable fonts, you only have one or two font files. That single file can produce a set of glyphs for any variation of font weight and style. Which means you only have one &lt;code class=&quot;mdf-code-inline&quot;&gt;@font-face&lt;/code&gt; rule that sets the link between the font name and its file:&lt;/p&gt;
&lt;pre class=&quot;mdf-code-block&quot;&gt;&lt;code&gt;@font-face {
  font-family: &amp;quot;MyVariableFontName&amp;quot;;
  src: url(&amp;quot;path/to/font/file/my-variable-font.woff2&amp;quot;)
    format(&amp;quot;woff2-variations&amp;quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now whatever the value of your &lt;code class=&quot;mdf-code-inline&quot;&gt;--body-italic-font-weight&lt;/code&gt; and &lt;code class=&quot;mdf-code-inline&quot;&gt;--body-italic-font-style&lt;/code&gt; are, there is a predictable glyph displayed on screen. That&#39;s very convenient. And until recently Figma made it hard to work with variable fonts, but since recently you can have a variable font weight that is a number value bound to a Figma Variable. Which makes the token integration seamless.&lt;/p&gt;
&lt;p&gt;It however does not solve the issue of updating the font-family. Also using variable fonts or not is still up for debate since they might raise concerns regarding the file sizes or their support. If you need to support older versions of browser (or if you&#39;re working with platforms other than the web) that would not support variable fonts, you might need to have fallback fonts that would be static anyways.&lt;/p&gt;
&lt;p&gt;Examples of design systems using variable fonts with a token for font-weight are &lt;a href=&quot;https://www.figma.com/design/p25sVQhNFwWsea9SIJDmej/ADS-Foundations--Community-?node-id=26062-88725&amp;amp;t=PppzJCVxh4RLTk29-4&quot; class=&quot;mdf-link&quot;&gt;Atlassian ADS&lt;/a&gt; or &lt;a href=&quot;https://polaris-react.shopify.com/tokens/font&quot; class=&quot;mdf-link&quot;&gt;Shopify&#39;s Polaris React&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We can see from these different strategies that there is no magic trick making typography tokens easy. You&#39;ll have to make compromise on your design system tokens exhaustivity (hey it&#39;s not a bad thing to be opinionated!). Technical solutions can exist, but are so much more expensive than their benefit in flexibility that no one has built them yet.&lt;/p&gt;
&lt;p&gt;Stay tuned for the &lt;a href=&quot;https://guillaumemeigniez.me/blog/typography-tokens-are-hard-bonus/&quot; class=&quot;mdf-link&quot;&gt;bonus part&lt;/a&gt; of this tokens series. I&#39;ll discuss some unexpected things and rabbit holes I ended up researching along the writing of these posts.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Typography tokens are hard to get right - Part 1</title>
    <link href="https://guillaumemeigniez.me/blog/typography-tokens-are-hard-1/" />
    <updated>2026-06-09T00:00:00Z</updated>
    <id>https://guillaumemeigniez.me/blog/typography-tokens-are-hard-1/</id>
    <content type="html">&lt;p&gt;Let&#39;s say you are a designer or a developer maintaining a design system for the web.&lt;span class=&quot;soft-space&quot;&gt;

&lt;/span&gt;The system is ideally integrated end-to-end between your design tool (e.g. Figma variables) and the code (e.g. CSS variables). Updating the variable value in Figma automatically changes its value in the code, and the modification propagates to the end user.&lt;/p&gt;
&lt;p&gt;Have you ever tried updating your typography tokens? Chances are that for some of them you can&#39;t change their values that easily, and you might not realise it until it breaks your design system users&#39; websites.&lt;/p&gt;
&lt;img src=&quot;https://guillaumemeigniez.me/blog/typography-tokens-are-hard-1/Qllcrcyshh-800.webp&quot; alt=&quot;Visualization of a design tokens tree where semantic typography font size token blocks point to primitive tokens&quot; style=&quot;height: auto&quot; width=&quot;800&quot; height=&quot;433&quot;&gt;
&lt;p&gt;The goal of this series of blog posts is to show why it may be the case and what solutions exist to make it right.&lt;/p&gt;
&lt;p&gt;Unlike colour tokens (that are quite straightforward to set up) typography tokens might not behave as you think if you are not aware of how fonts work on the web.&lt;/p&gt;
&lt;p&gt;But let&#39;s start from the beginning, what do typography tokens usually look like?&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Typography tokens&lt;/h3&gt;
&lt;p&gt;If you are using Figma, you have &amp;quot;typography styles&amp;quot; each having a few typography parameters mapped to Figma variables. You probably have something resembling the following typography variables setup: &lt;code class=&quot;mdf-code-inline&quot;&gt;fontFamily&lt;/code&gt;, &lt;code class=&quot;mdf-code-inline&quot;&gt;fontWeight&lt;/code&gt;, &lt;code class=&quot;mdf-code-inline&quot;&gt;fontSize&lt;/code&gt;, &lt;code class=&quot;mdf-code-inline&quot;&gt;lineHeight&lt;/code&gt;, &lt;code class=&quot;mdf-code-inline&quot;&gt;fontStyle&lt;/code&gt; and maybe &lt;code class=&quot;mdf-code-inline&quot;&gt;letterSpacing&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In the code, it looks the same. If you open Dev Mode on Figma, or if you look at the apps CSS you&#39;ll see that the CSS styles match your token names. Here is an example of how these tokens would be used in CSS:&lt;/p&gt;
&lt;pre class=&quot;mdf-code-block&quot;&gt;&lt;code&gt;.text {
  font-family: var(--body-italic-font-family);
  font-weight: var(--body-italic-font-weight);
  font-style: var(--body-italic-font-style);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Easy, it makes sense, one CSS property = one token = one typography style parameter.&lt;/p&gt;
&lt;p&gt;If you tried updating the value of the font weight of one of your typography styles (let&#39;s say &lt;code class=&quot;mdf-code-inline&quot;&gt;bodyItalic.fontWeight&lt;/code&gt;) in Figma, it would update and be applied instantly in the Figma workspace. However when the change propagates to the code, it would most certainly not have the expected result. And it boils down to the way fonts work on the web.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Web fonts&lt;/h3&gt;
&lt;p&gt;When you open a web page, your browser has to download a font file associated with the text that you want to display on screen. You can see that by opening your browser inspector&#39;s &amp;quot;Network&amp;quot; tab and by filtering on &amp;quot;Font&amp;quot;:&lt;/p&gt;
&lt;img src=&quot;https://guillaumemeigniez.me/blog/typography-tokens-are-hard-1/4Aui9yDUM2-800.webp&quot; alt=&quot;Screenshot of a browser window open on DuckDuckGo with the developer tools open on the Network tab and filtered on the Fonts, where we see 9 font files being downloaded&quot; style=&quot;height: auto&quot; width=&quot;800&quot; height=&quot;308&quot;&gt;
&lt;p&gt;In the example above there are multiple files downloaded just for the Proxima Nova font: &amp;quot;Reg&amp;quot; (Regular), &amp;quot;RegIt&amp;quot; (Regular Italic), &amp;quot;SBold&amp;quot;, &amp;quot;Bold&amp;quot;, &amp;quot;ExtraBold&amp;quot;.&lt;/p&gt;
&lt;p&gt;This happens because each font file only contains one specific combination of font family, weight and font style, i.e. &lt;code class=&quot;mdf-code-inline&quot;&gt;ProximaNova-RegIt-webfont.woff2&lt;/code&gt; is the one file that contains all the glyphs of the Proxima Nova font family, with the regular weight and the italic style. If for example one piece of text is not italic, the browser needs to download a whole new file for that font family, that weight and the font-style.&lt;/p&gt;
&lt;p&gt;So the browser knows thanks to CSS that it needs &amp;quot;Proxima Nova&amp;quot;, in weight 400 and in style italic, but how does it link that requirement to the &lt;code class=&quot;mdf-code-inline&quot;&gt;ProximaNova-RegIt-webfont.woff2&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;Well this is the piece that many design system teams miss. This matching between font files and CSS typography styles is done through a CSS &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/At-rules/@font-face&quot; class=&quot;mdf-link&quot;&gt;font-face @-rule&lt;/a&gt;. If you look in the css files loaded by your browser when you open a web page, you&#39;ll also find somewhere something like:&lt;/p&gt;
&lt;pre class=&quot;mdf-code-block&quot;&gt;&lt;code&gt;@font-face {
  font-family: Proxima Nova;
  src: url(/static-assets/font/ProximaNova-RegIt-webfont.woff2) format(&amp;quot;woff2&amp;quot;);
  font-weight: 400;
  font-style: italic;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is a &lt;code class=&quot;mdf-code-inline&quot;&gt;@font-face&lt;/code&gt;. Whenever the browser finds a text that must be displayed using &amp;quot;Proxima Nova&amp;quot;, with a weight of 400 and a style of italic, it looks at the font-face rule in CSS, and deduces that the character glyphs to use are to be found at &lt;code class=&quot;mdf-code-inline&quot;&gt;/static-assets/font/ProximaNova-RegIt-webfont.woff2&lt;/code&gt;. Then the font file is downloaded and used to display the characters.&lt;/p&gt;
&lt;p&gt;The catch is that the &lt;code class=&quot;mdf-code-inline&quot;&gt;@font-face&lt;/code&gt; is most of the time hard-coded by developers, and only contains the already existing combination of family, weight and style.&lt;/p&gt;
&lt;p&gt;When you update your &lt;code class=&quot;mdf-code-inline&quot;&gt;bodyItalic.fontWeight&lt;/code&gt; token from &lt;code class=&quot;mdf-code-inline&quot;&gt;400&lt;/code&gt; to &lt;code class=&quot;mdf-code-inline&quot;&gt;500&lt;/code&gt;, the browser sees a text node with the following styles:&lt;/p&gt;
&lt;pre class=&quot;mdf-code-block&quot;&gt;&lt;code&gt;.text {
	font-family: var(--body-italic-font-family); // &amp;quot;Proxima Nova&amp;quot;
	font-weight: var(--body-italic-font-weight); // Previously 400 now 500
	font-style: var(--body-italic-font-style); // &amp;quot;italic&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It looks up the &lt;code class=&quot;mdf-code-inline&quot;&gt;@font-face&lt;/code&gt; for that combination. That matching rule does not exist because font-face setup is not dynamically reacting to the typography tokens. The browser tries to display something that looks like what you wanted but you don&#39;t get the expected result. What you eventually get displayed is hard to predict, and might break readability in some contexts. The browser could choose to swap your font for a fallback, or to change the weight of your snippet to match one of the existing combinations in the font-face, or even to perform a &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/font-synthesis&quot; class=&quot;mdf-link&quot;&gt;font synthesis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On a side note, updating the font size, the line height or the letter spacing should not be a problem since these parameters are not dependent on the font file being loaded.&lt;/p&gt;
&lt;p&gt;In the end, the token pipeline breaks silently. Everything looked fine on Figma, the modification seemed benign, and it only broke at the last step when you, the designer, see the typography issue on the website.&lt;/p&gt;
&lt;p&gt;The perfect solution to this problem does not seem to exist yet. It&#39;s not that easy to make the &lt;code class=&quot;mdf-code-inline&quot;&gt;@font-face&lt;/code&gt; dynamically react to the token change because you would need to dynamically specify a location for a font file (among other things).&lt;/p&gt;
&lt;p&gt;Some popular design systems have come up with (mostly partial) solutions to this. Following or not their example will depend on the specifications of your own design systems.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://guillaumemeigniez.me/blog/typography-tokens-are-hard-2/&quot; class=&quot;mdf-link&quot;&gt;part 2&lt;/a&gt; I&#39;ll compare the pros and cons of popular design system approaches.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>8 steps to better accessibility</title>
    <link href="https://guillaumemeigniez.me/blog/8StepsToBetterAccessibility/" />
    <updated>2026-02-23T00:00:00Z</updated>
    <id>https://guillaumemeigniez.me/blog/8StepsToBetterAccessibility/</id>
    <content type="html">&lt;p&gt;For 2 years, I was working at a French publicly funded company building software for tens of thousands of teachers and culture professionals, and for millions of French teenagers. As a front-end developer interested in the matter of web accessibility, I organised accessibility audits, then did follow-ups and corrections, I participated in accessibility planning and in choosing new tools, and I helped setup a new design system.&lt;/p&gt;
&lt;p&gt;Inspired by &lt;a href=&quot;https://www.joelonsoftware.com/2000/08/09/the-joel-test-12-steps-to-better-code/&quot; class=&quot;mdf-link&quot;&gt;Joel on software&lt;/a&gt;, and reflecting on that intense experience, I built a set of 8 accessibility questions to ask in order to evaluate a company&#39;s capacity at developing accessible software. Those questions have simple yes or no answers, yet they&#39;re not always easy things to do. I believe that they encapsulate what I witnessed in the last few years.&lt;/p&gt;
&lt;p&gt;Answering &amp;quot;yes&amp;quot; to less than 6/8 of those means your company might not release accessible software anytime soon.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;1. Do you have an accessibility bugs database?&lt;/h3&gt;
&lt;p&gt;Is there a document where all known accessibility issues of the product are listed? Not everyone reads accessibility audit reports (if they exist), and not everyone tests the app on a regular basis. There needs to be a document for teams to know what fix could be integrated in their development process. A single source of truth that might just be a notion table or an excel spreadsheet that&#39;s kept up to date and that&#39;s easily consultable by product teams.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;2. Do you fix known accessibility issues before building new features?&lt;/h3&gt;
&lt;p&gt;When a team is working on a new feature, do they fix the known accessibility issues related to that feature&#39;s scope first? If you answered &amp;quot;yes&amp;quot; to question 1, you do have a database of known issues. Is that source of information consulted before building a new feature? For example if the team was adding a section to a form on a page that&#39;s not responsive, would that page be made responsive at the same time? Another way to frame the question is: &amp;quot;Is there an effort to reduce the accessibility debt?&amp;quot;.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;3. Do you have a monitored accessibility feedback channel?&lt;/h3&gt;
&lt;p&gt;Ultimately you&#39;re doing accessibility for the users. When a user is unable to do an action, they will likely want to tell you about it. There needs to be an easy way to send a message from the app to the accessibility team (or to the team in charge of that part of the app). If you are using a third party assistant (such as a chatbot), you need to make sure that its UI is also fully accessible. You should at least have a dedicated email address to which people can report accessibility problems. Finding that communication channel should be possible in a reasonable number of clicks from anywhere in the app. And most importantly, there needs to be someone on the other end of that channel that reads the complaints.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;4. Do you consider diverse experiences while testing?&lt;/h3&gt;
&lt;p&gt;The &amp;quot;R&amp;quot; in the accessibility &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Accessibility/Guides/Understanding_WCAG&quot; class=&quot;mdf-link&quot;&gt;P.O.U.R. principles&lt;/a&gt; stands for &amp;quot;Robust&amp;quot;. It means that your product should account for a wide diversity of usages. It&#39;s impossible to predict what combination of hardware &amp;amp; software will be used to access your website. Therefore, you need to have as much diversity as possible as early as possible in the creation process. Do you test the software with disabled people? Do you test the website on different operating systems, on different browsers, with different devices? It&#39;s common for modern teams to be using only MacBooks with chromium based browsers, which is only the setup of &lt;a href=&quot;https://webaim.org/projects/screenreadersurvey10/&quot; class=&quot;mdf-link&quot;&gt;2% of screen reader users&lt;/a&gt;.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;5. Can everyone in your product teams use basic assistive technologies and audit tools?&lt;/h3&gt;
&lt;p&gt;Can your designers, developers, QAs and product managers go through a page with a screen reader? Can they tell if a colour contrast is high enough? Can they read the automated tests results of tools such as &lt;a href=&quot;https://chromewebstore.google.com/detail/axe-devtools-web-accessib/lhdoppojpmngadmnindnejefpokejbdd&quot; class=&quot;mdf-link&quot;&gt;axe-core&lt;/a&gt;, &lt;a href=&quot;https://chromewebstore.google.com/detail/headingsmap/flbjommegcjonpdmenkdiocclhjacmbi&quot; class=&quot;mdf-link&quot;&gt;headingsmap&lt;/a&gt; or lighthouse? Can they open the dev console on their browser? Everyone who thinks about the user experience should at least be able to spot the critical issues that would block a user. Everyone has to learn how to test for accessibility at some point. That&#39;s why accessibility testing trainings are essential. And those trainings need to be adapted to different types of jobs.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;6. Is there someone with a dedicated budget that is in charge of the accessibility strategy?&lt;/h3&gt;
&lt;p&gt;You need someone whose job it is to organise the accessibility strategy: plan the trainings, organise the documentation, manage the issues database, keep a roadmap up to date, talk to the leadership about accessibility status, organise user tests and audits. That person absolutely needs to have a seat at the table. If the accessibility evangelist of the company doesn&#39;t have a dedicated budget, managers will say that &amp;quot;yes accessibility is the priority of the company&amp;quot; and then allocate no money to it.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;7. Do product teams have easy access to accessibility resources that they understand?&lt;/h3&gt;
&lt;p&gt;Accessibility documentation can be intimidating if not carefully crafted. A designer does not need the same documentation as a developer. Ideally there should be a variety of accessibility documentation so that everyone can find the information with the right level of context. There could also be an accessibility specialist available to answer accessibility questions as new features are being built.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;8. Do the teams use accessible building blocks?&lt;/h3&gt;
&lt;p&gt;Is there a design system (internal or external)? It&#39;s necessary (yet not sufficient) that the building blocks of an app are accessible by design. And has that system been audited for accessibility? If there&#39;s a UI kit, do the components of that kit have accessibility unit tests? And does the ci include automated visual testing for basic blocks? Is that new select with autocomplete library that was recently installed compliant with WCAG? (probably not)&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Chess, chess, chess</title>
    <link href="https://guillaumemeigniez.me/blog/chess-chess-chess/" />
    <updated>2026-01-08T00:00:00Z</updated>
    <id>https://guillaumemeigniez.me/blog/chess-chess-chess/</id>
    <content type="html">&lt;p&gt;I started playing chess on &lt;a href=&quot;https://www.chess.com&quot; class=&quot;mdf-link&quot;&gt;chess.com&lt;/a&gt; in 2013. I used to play video games on my computer but after graduating from high school I said goodbye to my digital friends and uninstalled Steam. I was playing what felt like a lot (on average 3 to 4 hours a day), and I was about to move to Paris to begin the &lt;em&gt;classes préparatoires&lt;/em&gt;: a two-year intensive Maths and Physics program that prepares students for the French engineering contests.&lt;/p&gt;
&lt;p&gt;Unlike the engineering school I later joined, the classes prépa are an extremely old school environment where nothing is digital: blackboards, mandatory fountain pen with black ink, and overhead projectors, but no computer. I was very busy learning about Fourier, Lagrangen Gauss and diagonalizable matrices and had no spare time to played video games. My only distraction was watching YouTube during study breaks.&lt;/p&gt;
&lt;p&gt;Still, I was later reintroduced to the game of chess as an adult by the video game influencer Hutch (before his political Twitch career). I was also fascinated by &lt;a href=&quot;https://www.youtube.com/watch?v=qqU-YjP7Adk&quot; class=&quot;mdf-link&quot;&gt;the blitz commentary by Chess Network&lt;/a&gt; who has been making videos since 2007. One day I realized I could open a new tab and immediately be playing for 10 minutes against someone else in the world, and I&#39;ve been playing most days ever since. (Honorable mention to &lt;a href=&quot;https://www.youtube.com/@chessbrah&quot; class=&quot;mdf-link&quot;&gt;chessbrah&lt;/a&gt; who made me feel that playing chess was actually fun and cool)&lt;/p&gt;
&lt;p&gt;Playing chess online is very special. Thanks to &lt;a href=&quot;https://en.wikipedia.org/wiki/Elo_rating_system&quot; class=&quot;mdf-link&quot;&gt;the Elo ranking system&lt;/a&gt;, you are always playing someone who&#39;s approximately the same level as you. Playing chess when I was 600 Elo is the same feeling as playing chess at 2000 Elo: it&#39;s the same excitement, the same disconnection from time and reality, and the same frustration when losing. Every game is a battle that you fight for the dopamine hit of winning (maybe). But losing a few times in a row makes the rest of your day miserable. So is it worth playing? What&#39;s the point in spending thousands of hours doing it if the downside of losing overcomes the joy of winning? (besides learning to recognize flags) (&lt;a href=&quot;https://en.wikipedia.org/wiki/The_Myth_of_Sisyphus&quot; class=&quot;mdf-link&quot;&gt;at least, does recognizing the absurdity of it make me more free&lt;/a&gt;?)&lt;/p&gt;
&lt;p&gt;I don&#39;t have answers yet, I just keep playing because it&#39;s the default thing my brain wants to do on my computer when I&#39;m not working. I might as well document the journey and set some goals.&lt;/p&gt;
&lt;p&gt;I never felt like learning chess theory but for Christmas I got a chess book &amp;quot;1. d4 The Catalan&amp;quot; by Boris Avrukh. In 2026 I&#39;ll try to dedicate time to practicing theory. Reaching 2000 Elo in Rapid on &lt;a href=&quot;http://chess.com&quot; class=&quot;mdf-link&quot;&gt;chess.com&lt;/a&gt; in 2025 felt like an accomplishment. This year I&#39;d like to get closer to 2000 Elo in Blitz. Happy new year!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Frontend virtualization, performances vs accessibility</title>
    <link href="https://guillaumemeigniez.me/blog/frontend-virtualization-performances-vs-accessibility/" />
    <updated>2025-12-28T00:00:00Z</updated>
    <id>https://guillaumemeigniez.me/blog/frontend-virtualization-performances-vs-accessibility/</id>
    <content type="html">&lt;p&gt;I recently subscribed to &lt;a href=&quot;https://frontendmasters.com/&quot; class=&quot;mdf-link&quot;&gt;Frontend Masters&lt;/a&gt; and started watching some of their online courses. I&#39;ve been following the &amp;quot;expert&amp;quot; path and am pretty happy with the quality of the content for now. However, one of the courses I initially subscribed to left me puzzled.&lt;/p&gt;
&lt;p&gt;The course is called &lt;a href=&quot;https://frontendmasters.com/courses/frontend-system-design/&quot; class=&quot;mdf-link&quot;&gt;&amp;quot;Frontend System Design&amp;quot;&lt;/a&gt;. It was released in 2024 and focuses on Observer APIs, networking, optimization, and virtualization. It ends with a mock system design interview that is especially interesting in how it dissects a part of the frontend hiring process that is rarely documented. During that interview exercise, the teacher reuses what&#39;s been learned during the course and designs an infinite scrolling card feed with virtualization.&lt;/p&gt;
&lt;p&gt;During the final Q&amp;amp;A session, he mentions how that method of virtualization is inaccessible, and briefly explains why. It annoyed me a little that the one course I was looking forward to as the pinnacle of frontend systems knowledge would knowingly ignore the accessibility of the solution. It&#39;s just a mock interview and it does not represent the state of the industry, but it made me want to dive deeper into virtualization.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Inaccessibility of virtualization&lt;/h3&gt;
&lt;p&gt;Virtualization is an optimization technique for the rendering of very long lists of elements. To minimize the number of elements rendered, a virtualized list only displays what&#39;s visible inside the user&#39;s viewport. When the user scrolls down, items from the top of the list are reused to make new items appear below. The list is positioned in a new layer and CSS transforms are used to reduce the number of re-paint of the absolutely positioned elements.&lt;/p&gt;
&lt;p&gt;The problematic word above is &amp;quot;visible&amp;quot;. If only what&#39;s visible by scrolling is rendered, it means that you have no information and no interaction is possible with other items in the list.&lt;/p&gt;
&lt;ul class=&quot;mdf-list&quot;&gt;
&lt;li class=&quot;mdf-list-item&quot;&gt;Using a keyboard, elements other than the ones in the viewport are not reachable.&lt;/li&gt;
&lt;li class=&quot;mdf-list-item&quot;&gt;When navigating via headings or links, only a subset of the actual content is available.&lt;/li&gt;
&lt;li class=&quot;mdf-list-item&quot;&gt;Using screen readers, the count of items or the current position are wrong.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are the first few things that I can think of, and I don&#39;t see obvious adjustments to fix them. There is a fundamental misunderstanding. Virtualization is an optimization of what we see on the screen, as if any other element of the render tree were a useless overload consuming memory. I have learned that considering accessibility when building an interface often translates to asking myself &amp;quot;does this still work without a screen and a mouse?&amp;quot;.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;State of the art&lt;/h3&gt;
&lt;p&gt;The most popular libraries &lt;a href=&quot;https://github.com/bvaughn/react-window&quot; class=&quot;mdf-link&quot;&gt;react-window&lt;/a&gt; and &lt;a href=&quot;https://github.com/bvaughn/react-virtualized&quot; class=&quot;mdf-link&quot;&gt;react-virtualized&lt;/a&gt; were created to implement this pattern. I&#39;m pretty sure they solve the problem incredibly well for many users.&lt;/p&gt;
&lt;p&gt;But looking at accessibility issues on react-window&#39;s GitHub, there&#39;s one from &lt;a href=&quot;https://github.com/bvaughn/react-window/issues/834&quot; class=&quot;mdf-link&quot;&gt;last September&lt;/a&gt; that was opened because &lt;code class=&quot;mdf-code-inline&quot;&gt;&amp;lt;li&amp;gt;&lt;/code&gt; tags were not direct children of &lt;code class=&quot;mdf-code-inline&quot;&gt;&amp;lt;ul&amp;gt;&lt;/code&gt; tags. &lt;a href=&quot;https://github.com/bvaughn/react-window/issues/650&quot; class=&quot;mdf-link&quot;&gt;Another one from 2023&lt;/a&gt; was closed as &amp;quot;not planned&amp;quot; because it points out that a focused element will lose focus when the user scrolls (because the whole item is deleted from the render tree).&lt;/p&gt;
&lt;p&gt;On the react-virtualized GitHub page, accessibility issues are not addressed.&lt;/p&gt;
&lt;p&gt;I couldn&#39;t find any blog post mentioning how virtualization raises accessibility concerns, while it seems to be a widely used solution. As of today, the two libraries mentioned are dependencies of respectively 2313 and 1667 other packages on npm, with a total of more than 3M downloads weekly.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Optimization is about compromise&lt;/h3&gt;
&lt;p&gt;Optimization is about compromise. But it&#39;s not performance vs accessibility unless developers and designers voluntarily lock all other dimensions to treat it as a binary trade-off.&lt;/p&gt;
&lt;p&gt;The most accessible solution tends to be the one that uses the native power of the platform. This is because an accessible solution is one for which browsers and assistive technologies work well together and follow the underlying platform specs. Thus pursuing accessibility often means reducing performance costs.&lt;/p&gt;
&lt;p&gt;Yet I&#39;ve noticed that optimizing without caring about accessibility often leads to over-engineered solutions that end up worse for the user.&lt;/p&gt;
&lt;p&gt;That&#39;s what I felt when watching the virtualization from the Frontend Masters course: I learned a lot during the course, but if an engineer in my team suggested that JS-intensive solution to fix a render performance bottleneck, I&#39;d push back. Maybe a pagination would work? Also why is there so many elements in the DOM to begin with? I&#39;m sure there is are discussions to have here.&lt;/p&gt;
&lt;p&gt;Virtualization is the heavy yet easy solution. I get it. For an engineer, virtualization is satisfying to implement. And it&#39;s such a common pattern now that finding alternatives is frustrating as it&#39;s an attempt to get out of the accessibility vs performance opposition by going back to something simpler.&lt;/p&gt;
&lt;p&gt;This negative sentiment of &lt;em&gt;going back&lt;/em&gt; is the hard part. And it&#39;s one of the things we need to work on the most as senior frontend developers.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>The articulation of design and engineering</title>
    <link href="https://guillaumemeigniez.me/blog/the-articulation-of-design-and-engineering/" />
    <updated>2025-12-16T00:00:00Z</updated>
    <id>https://guillaumemeigniez.me/blog/the-articulation-of-design-and-engineering/</id>
    <content type="html">&lt;p&gt;&amp;quot;Design Engineer&amp;quot; seems to be the most popular umbrella title right now for people working at the intersection of design and front-end development. However, it&#39;s hard to understand what it covers when reading job listings and blog posts. Everyone seems to define it by a different scope and a different skill list.&lt;/p&gt;
&lt;p&gt;What is certain is that it&#39;s about bridging the gap between software development and design in the context of building digital products. Some talk about a &lt;a href=&quot;https://css-tricks.com/the-great-divide/&quot; class=&quot;mdf-link&quot;&gt;great divide&lt;/a&gt; between the &lt;a href=&quot;https://bradfrost.com/blog/post/front-of-the-front-end-and-back-of-the-front-end-web-development/&quot; class=&quot;mdf-link&quot;&gt;front-end of the front-end&lt;/a&gt; and the back-end of the back-end. Yet something feels wrong. If it were that simple, why can&#39;t we agree on a definition?&lt;/p&gt;
&lt;p&gt;I worked for 4 years in a startup as a front-end engineer in charge of the front-end development and design, and then 2 years as a senior front-end engineer focused on accessibility and design systems. I can describe what articulating the design and engineering worlds together felt like, and what issues the role emerged from.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Design tools abstract away the web platform&lt;/h3&gt;
&lt;p&gt;Web browsers are a complex stack of technologies and a confusing stack of specs. Product designers have a lot on their plate already, it&#39;s materially impossible for them to have a deep understanding of the platform. The web has strengths and limits that are not obvious from browsing the web and by using tools such as Figma.&lt;/p&gt;
&lt;p&gt;It&#39;s obviously not a skill issue, in order to co-create a high-quality product everyone needs to limit their area of expertise.&lt;/p&gt;
&lt;p&gt;If Figma was as precise as HTML, CSS and Javascript in describing interfaces for the web, the tool would be the web itself. And it is normal that the design tools constitute a level of abstraction. The gap between what&#39;s designed and what&#39;s then built by the developer is wide enough that a structural misunderstanding exists between engineers and designers.&lt;/p&gt;
&lt;p&gt;Are good product designers expected to know the difference between &lt;code class=&quot;mdf-code-inline&quot;&gt;focus&lt;/code&gt; and &lt;code class=&quot;mdf-code-inline&quot;&gt;focus-visible&lt;/code&gt; on interactive elements? Yes they might, but should they know that most browsers do not differentiate the two on &lt;code class=&quot;mdf-code-inline&quot;&gt;input&lt;/code&gt; HTML tags? Or that a &lt;code class=&quot;mdf-code-inline&quot;&gt;focus-within&lt;/code&gt; that is also a &lt;code class=&quot;mdf-code-inline&quot;&gt;focus-visible&lt;/code&gt; should not be used because the CSS property &lt;code class=&quot;mdf-code-inline&quot;&gt;:has&lt;/code&gt; is only supported by 91% of the company&#39;s users? Probably not.&lt;/p&gt;
&lt;p&gt;Yet the designs are (mostly) created in Figma and then handed to the developer who has limited time to produce the implementation.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Front-end developers lack design context&lt;/h3&gt;
&lt;p&gt;The design being viewed as descending upon the front-end developer, the developer &lt;em&gt;must&lt;/em&gt; implement it. What &lt;em&gt;can&lt;/em&gt; be built takes precedence over what &lt;em&gt;should&lt;/em&gt; be built. The responsibility for design choices is eventually borne unilaterally by designers.&lt;/p&gt;
&lt;p&gt;Should this icon color be added to the app even though it doesn&#39;t match any pre-existing color? That dialog has a title that does not match the common pattern, is that a new design directive or a mistake from the designer? The developer lacks knowledge of design decisions, the new design system foundations or a new accessibility pattern. And challenging the design might delay the feature by a whole cycle.&lt;/p&gt;
&lt;p&gt;At some point, someone with the technical expertise and a product-level understanding of the existing patterns must voice an opinion on the design. Someone who knows how UIs are built across that product.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;The articulation&lt;/h3&gt;
&lt;p&gt;The argument here is that there is a gap in knowledge and understanding that cannot be filled without a new articulating role and vision. The tools and tech stack have become so complicated that no one covers both design and front-end development as 2 separate people would. It is not just &amp;quot;front-end of the front-end&amp;quot; that is needed here, because a global vision is required.&lt;/p&gt;
&lt;p&gt;The role needed is of a front-end developer who has a good technical understanding of the product, who is able to collaborate with designers, to write documentation for different audiences and to navigate between teams.&lt;/p&gt;
&lt;p&gt;The person in that role has two different approaches to the same problem. When the designers want a new pattern introduced, that person helps define it in a way that is compatible with the technical constraints. They can then implement those patterns and promote them to the engineering teams. They produce two different forms of documentation, because the reasons why a designer understands the importance of a guideline is not the same as for the developer.&lt;/p&gt;
&lt;p&gt;Every company has a different approach based on their needs which can vary depending on the skills of their employees. There isn&#39;t one recipe, there isn&#39;t one divide. That&#39;s why &lt;a href=&quot;https://maggieappleton.com/design-engineers&quot; class=&quot;mdf-link&quot;&gt;so many job titles exist&lt;/a&gt; : Design Engineer, UX Engineer, UI Engineer, Design System Developer, Front-End of the Front-End, etc.&lt;/p&gt;
&lt;p&gt;My experience made me realize the need for a role with a wider perspective. Someone who works across teams and operates in both design and engineering.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Inaccessibility first</title>
    <link href="https://guillaumemeigniez.me/blog/InaccessibilityFirst/" />
    <updated>2025-02-16T00:00:00Z</updated>
    <id>https://guillaumemeigniez.me/blog/InaccessibilityFirst/</id>
    <content type="html">&lt;p&gt;A non-negligible proportion of developers code with the help of generative AI. According to &lt;a href=&quot;https://survey.stackoverflow.co/2024/ai#sentiment-and-usage-ai-select&quot; class=&quot;mdf-link&quot;&gt;the 2024 stackoverflow study&lt;/a&gt;, 62% of them used AI in the development process during that year, and even more are planning on using it in 2025. That&#39;s a reality that should be questioned and challenged, of course, but that should also be analysed as a trend that is not on the way out.&lt;/p&gt;
&lt;p&gt;I notice this at work when reviewing pull requests that have completely or partially been written with the help of a generative AI. As one of the developers responsible for ensuring the accessibility of the features deployed to production, I review a lot of the code that&#39;s pushed. I&#39;m often surprised by the poor attention to accessible code, especially when it&#39;s a snippet that I suspect has been produced with a help of a language model. If we let the AIs code without careful reviews, we would very quickly have less inclusive user experiences.&lt;/p&gt;
&lt;p&gt;An AI Assistant does not &lt;em&gt;think&lt;/em&gt;, it does not &lt;em&gt;reason&lt;/em&gt; nor does it &lt;em&gt;hallucinate&lt;/em&gt;. It uses a model that projects text into a space where are identified the most probable following words that would constitute an answer. If you ask it to give a more friendly, more serious or more WCAG 2.2 compliant answer, it will transfer the answer along a vector, and generate another text that will &lt;em&gt;probably&lt;/em&gt; be more aligned with what is expected.&lt;/p&gt;
&lt;p&gt;The web being notoriously a widely inaccessible place, and the generative AI models being trained on it, generated HTML code is most likely inaccessible, thus inaccessible by design. According to &lt;a href=&quot;https://webaim.org/projects/million/&quot; class=&quot;mdf-link&quot;&gt;webaim.org&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;mdf-quote&quot;&gt;
  &lt;blockquote cite=&quot;https://webaim.org/projects/million/&quot;&gt;
  Across the one million home pages, 56,791,260 distinct accessibility errors were detected—an average of 56.8 errors per page. The number of detected errors increased notably (13.6%) since the 2023 analysis which found 50 errors/page.
  &lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;As long as the web remains that way (and we are only talking about home pages, not even forms, videos, canvas or data visualisations), there is no way a LLM would provide accessible HTML code. And the situation tends to worsen with code being continuously generated and deployed to the internet.&lt;/p&gt;
&lt;p&gt;I have no hope for generative AI to be a net positive for users in the future. I still wanted to see how severe the situation is, so I tried asking DeepSeek, Claude and ChatGPT to build HTML ans JS code for a multiple select form input. And see how far it is from making something accessible. I used the free versions of the models, thus I don&#39;t expect the best quality answers (although it should not be that far from it), but it still gives me a good representation of what developers are using.&lt;/p&gt;
&lt;p&gt;I provided the following prompt to DeepSeek V3 (I also generated the prompt with a generative AI because that&#39;s the level of degeneracy prompt engineers (?) recommend to be at).&lt;/p&gt;
&lt;div class=&quot;mdf-quote&quot;&gt;
  &lt;blockquote&gt;
  Write HTML and JavaScript code for a multiselect form element. When a user clicks a trigger button, a dropdown should open, allowing the user to select multiple countries from the following options: &#39;France&#39;, &#39;Italy&#39;, &#39;Spain&#39;, and &#39;Monaco&#39;.
  &lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;The model generated the following HTML snippet (along with a ton of javascript, css and explanations):&lt;/p&gt;
&lt;pre class=&quot;mdf-code-block&quot;&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;dropdown&amp;quot;&amp;gt;
  &amp;lt;button onclick=&amp;quot;toggleDropdown()&amp;quot;&amp;gt;Select Countries&amp;lt;/button&amp;gt;
  &amp;lt;div id=&amp;quot;dropdownContent&amp;quot; class=&amp;quot;dropdown-content&amp;quot;&amp;gt;
    &amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; value=&amp;quot;France&amp;quot; /&amp;gt; France&amp;lt;/label&amp;gt;
    &amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; value=&amp;quot;Italy&amp;quot; /&amp;gt; Italy&amp;lt;/label&amp;gt;
    &amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; value=&amp;quot;Spain&amp;quot; /&amp;gt; Spain&amp;lt;/label&amp;gt;
    &amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; value=&amp;quot;Monaco&amp;quot; /&amp;gt; Monaco&amp;lt;/label&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I&#39;ll be honest it looks better that what I expected. It at least did use appropriate semantic HTML tags! But that&#39;s all there is to say that&#39;s good about it. The keyboard inputs are off, the dropdown pattern is nonexistent, the opening and closing are not announced to assistive technologies, the dropdown closes when an item is checked etc.&lt;/p&gt;
&lt;p&gt;It is really not good, and good luck debugging why, when you have this multiselect in a form and you press &amp;quot;Enter&amp;quot; while focused anywhere, the dropdown opens instead of submitting... (A &lt;code class=&quot;mdf-code-inline&quot;&gt;button&lt;/code&gt; has the default type &amp;quot;submit&amp;quot;, and pressing &amp;quot;Enter&amp;quot; triggers the first submit button within the &lt;code class=&quot;mdf-code-inline&quot;&gt;form&lt;/code&gt; tag.)&lt;/p&gt;
&lt;p&gt;&amp;quot;Hey but you should not expect it to work as is, it should help you get to a viable solution. Also good prompting would involve asking it for an accessible experience!&amp;quot;&lt;/p&gt;
&lt;p&gt;If I&#39;m using a generative AI to build an HTML component, I probably have limited knowledge of how to do it. And the chances that I would go deeper than the visual aspect and an acceptable mouse experience are low. But let&#39;s give DeepSeek another chance, maybe the secret sauce of a11y prompting is to ask explicitly that we want HTML that works for everyone. My guess is that we have to tell it exactly what to do, so much that writing the code yourself is faster.&lt;/p&gt;
&lt;div class=&quot;mdf-quote&quot;&gt;
  &lt;blockquote&gt;
    Hey it seems that this code is not very accessible. I want to create a user experience that is as inclusive as possible. Do you think you could re-write the code but with that in mind ?
  &lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;And I got this HTML snippet:&lt;/p&gt;
&lt;pre class=&quot;mdf-code-block&quot;&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;dropdown&amp;quot;&amp;gt;
  &amp;lt;button
    id=&amp;quot;dropdownButton&amp;quot;
    class=&amp;quot;dropdown-button&amp;quot;
    aria-haspopup=&amp;quot;true&amp;quot;
    aria-expanded=&amp;quot;false&amp;quot;
    onclick=&amp;quot;toggleDropdown()&amp;quot;
    onkeydown=&amp;quot;handleButtonKeydown(event)&amp;quot;
  &amp;gt;
    Select Countries
  &amp;lt;/button&amp;gt;
  &amp;lt;div
    id=&amp;quot;dropdownContent&amp;quot;
    class=&amp;quot;dropdown-content&amp;quot;
    role=&amp;quot;menu&amp;quot;
    aria-labelledby=&amp;quot;dropdownButton&amp;quot;
  &amp;gt;
    &amp;lt;label role=&amp;quot;menuitemcheckbox&amp;quot; tabindex=&amp;quot;0&amp;quot;&amp;gt;
      &amp;lt;input
        type=&amp;quot;checkbox&amp;quot;
        value=&amp;quot;France&amp;quot;
        onchange=&amp;quot;updateSelectedCountries()&amp;quot;
      /&amp;gt;
      France
    &amp;lt;/label&amp;gt;
    &amp;lt;label role=&amp;quot;menuitemcheckbox&amp;quot; tabindex=&amp;quot;0&amp;quot;&amp;gt;
      &amp;lt;input
        type=&amp;quot;checkbox&amp;quot;
        value=&amp;quot;Italy&amp;quot;
        onchange=&amp;quot;updateSelectedCountries()&amp;quot;
      /&amp;gt;
      Italy
    &amp;lt;/label&amp;gt;
    // [...]
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;p&amp;gt;
  Selected Countries: &amp;lt;span id=&amp;quot;selectedCountries&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/p&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let&#39;s gooo, so many more attributes &lt;span aria-hidden=&quot;true&quot;&gt;💖&lt;/span&gt;! As a developer who doesn&#39;t know much about accessibility but who cares about providing an inclusive experience, I might stop there and consider that my job is done. Unfortunately, this HTML code is almost as bad as the initial snippet. It is a mess of patterns projected through attributes on those poor HTML tags.&lt;/p&gt;
&lt;p&gt;As I am myself not a WCAG expert, I might not be able to explain all the intricacies of what patterns that code is going for. If I&#39;m careless or pressured by time, I&#39;m more inclined to trust what the chatbot generated.&lt;/p&gt;
&lt;p&gt;What I am used to saying to junior frontend developers who tend to write a lot of code is that they should be able to explain every line they write. When creating a pull request, I recommend that they re-read every change and are ready to justify every change.&lt;/p&gt;
&lt;p&gt;You can ask the AI to generate text explaining every piece of a line of code, but it will not question its own quality unless you force it to. You have to do the work yourself in the end, there is no escaping for reading the docs of what the &lt;code class=&quot;mdf-code-inline&quot;&gt;role=&amp;quot;menu&amp;quot;&lt;/code&gt; does, or for example I asked:&lt;/p&gt;
&lt;div class=&quot;mdf-quote&quot;&gt;
  &lt;blockquote&gt;
    Can you explain this line in more details: 
    &lt;div class=&quot;mdf-code-block&quot;&gt;&amp;lt;label role=&quot;menuitemcheckbox&quot; tabindex=&quot;0&quot;&amp;gt; &amp;lt;input type=&quot;checkbox&quot; value=&quot;Monaco&quot; onchange=&quot;updateSelectedCountries()&quot; /&amp;gt; Monaco &amp;lt;/label&amp;gt;&lt;/div&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;DeepSeek answered with 100 lines of explanation of what every little piece does. It&#39;s crazy to have been trained on all of the docs that exist, being able to restitute them on the fly, but still consider that &lt;code class=&quot;mdf-code-inline&quot;&gt;tabindex=&amp;quot;0&amp;quot;&lt;/code&gt; on a label containing a checkbox input (that btw is the element bearing the &lt;code class=&quot;mdf-code-inline&quot;&gt;onchange&lt;/code&gt; attribute) is any good. And I&#39;m not mentioning that the misuse of roles &lt;code class=&quot;mdf-code-inline&quot;&gt;menu&lt;/code&gt; and &lt;code class=&quot;mdf-code-inline&quot;&gt;menuitemcheckbox&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I have asked the same questions to ChatGPT and Claude, and got same kind of results with and without accessibility encouragements. And I&#39;ll spare you the 200+ lines per chatbot of &lt;em&gt;reasoning&lt;/em&gt; that lead nowhere.&lt;/p&gt;
&lt;p&gt;It doesn&#39;t work and it cannot work, LLMs are made to restitute a well formed soup of all the things that seemed to be valuable code in the training sets. I even less believe now that coding assistance can do more than what automated accessibility testing already does.&lt;/p&gt;
&lt;p&gt;It is so assertive though... It takes so much effort to convince stakeholders that real people should be spending time working on accessibility that I&#39;m pretty sure LLMs will be the easy yet broken solution in the next few years. Good news: after the bubble bursts my job will still exist, bad news: user experience will suffer.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>A Tool for Creating More Accessible Design Tokens</title>
    <link href="https://guillaumemeigniez.me/blog/toolAccessibleDesignTokens/" />
    <updated>2024-12-08T00:00:00Z</updated>
    <id>https://guillaumemeigniez.me/blog/toolAccessibleDesignTokens/</id>
    <content type="html">&lt;p&gt;Building an internal design system at my company is an exciting position as it pushes me to dig into the frontend and design decisions history as much as it frees space to reorganise parts of the apps.&lt;/p&gt;
&lt;p&gt;Both frontend engineers and product designers work to bridge the gap between today&#39;s users needs and yesterday&#39;s users needs, and the design system is a powerful lever for achieving this.&lt;/p&gt;
&lt;p&gt;At my company, the design system started with a set of design tokens. Crafting a cohesive system of tokens is challenging since it must be understood by everyone as clearly and quickly as possible. And each set of tokens comes with its own challenges. For instance when choosing colours for a product, considering the contrast ratio in-between text colours and background colours is essential.&lt;/p&gt;
&lt;p&gt;Yesterday&#39;s user and today&#39;s share the need for an accessible experience. Measuring accessibility is tricky, and companies are often more interested in measuring the conformity to a norm. A number of guidelines can be considered : (Globally &lt;abbr title=&quot;Web content accessibility guidelines&quot;&gt;WCAG&lt;/abbr&gt; 2.2, and in my context the French guidelines RGAA (&lt;a href=&quot;https://accessibilite.numerique.gouv.fr/&quot; class=&quot;mdf-link&quot;&gt;Référentiel Général d&#39;Amélioration de l&#39;Accessibilité&lt;/a&gt;) and the Luxembourgeois guidelines RAAM (&lt;a href=&quot;https://accessibilite.public.lu/fr/raam1/referentiel-technique.html&quot; class=&quot;mdf-link&quot;&gt;Référentiel d’Accessibilité des Applications Mobiles&lt;/a&gt;)). These guidelines can be cryptic and asserting the conformity of the hundreds of criteria takes forever.&lt;/p&gt;
&lt;p&gt;As far as colour contrast is concerned, each have its own way of assessing the accessibility of text over a background. The ratio itself is (for now, and as far as I know) aligned with WCAG 2.2 AA criteria, but the definition of &amp;quot;large text&amp;quot; varies.&lt;/p&gt;
&lt;p&gt;To overcome the complexity of assessing the conformity of a set of colour design tokens to various accessibility guidelines, I built a &lt;a href=&quot;https://www.contrastcheckergrid.com&quot; class=&quot;mdf-link&quot;&gt;design tokens contrast checker grid that is available here&lt;/a&gt;. &lt;a href=&quot;https://contrast-grid.eightshapes.com/&quot; class=&quot;mdf-link&quot;&gt;This type of tool already exists&lt;/a&gt;, but they are very often inaccessible themselves and don&#39;t offer options for alternative validation methods. Also I don&#39;t know if there is a colour contrast grid trend right now but &lt;a href=&quot;https://codepen.io/davatron5000/pen/YzmwEZZ?editors=0010&quot; class=&quot;mdf-link&quot;&gt;Dave Rupert just created a codepen contrast grid&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The options of the first version of my website are limited, but I plan on adding more tokens import options and more contrast checking mechanisms. A question has kept me up at night (at least one night, reading through github drama). WCAG 3 is being discussed, and I&#39;d like to be up to date with the official contrast verification guidelines. Especially because it will likely include a new method of verification, and it will diverge from the French RGAA to which my company will still need to comply to.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://www.w3.org/WAI/GL/WCAG3/2021/how-tos/visual-contrast-of-text/&quot; class=&quot;mdf-link&quot;&gt;the WCAG docs&lt;/a&gt; another algorithm is mentioned : &lt;a href=&quot;https://github.com/Myndex/SAPC-APCA&quot; class=&quot;mdf-link&quot;&gt;APCA&lt;/a&gt;. It&#39;s a promising method that takes into consideration the non-linearity of human perception when looking at colours. However &lt;a href=&quot;https://github.com/w3c/silver/issues/574&quot; class=&quot;mdf-link&quot;&gt;some people raised concerns&lt;/a&gt; regarding the method, and &lt;a href=&quot;https://github.com/w3c/wcag3/issues/10&quot; class=&quot;mdf-link&quot;&gt;other techniques might be under examination&lt;/a&gt;. Yet some people think that &lt;a href=&quot;https://medium.com/@Marindessables/apca-r%C3%A9volution-dans-la-mesure-du-contraste-de-couleurs-pour-une-accessibilit%C3%A9-am%C3%A9lior%C3%A9e-c44e0b3f7c81&quot; class=&quot;mdf-link&quot;&gt;APCA it is going to be the WCAG 3 choice&lt;/a&gt; for sure. Although the last update &lt;a href=&quot;https://yatil.net/blog/wcag-3-is-not-ready-yet&quot; class=&quot;mdf-link&quot;&gt;in Eric Eggert&#39;s blog post about WCAG 3&lt;/a&gt; states that according to the Accessibility Guidelines Working Group Co-Chair: &amp;quot;APCA is not in the current draft&amp;quot;.&lt;/p&gt;
&lt;p&gt;Adding that algorithm to the checker I built could be very useful, regardless of whether it&#39;s included in WCAG 3. But it seem impossible to officially implement an APCA tester &lt;a href=&quot;https://git.apcacontrast.com/documentation/minimum_compliance.html&quot; class=&quot;mdf-link&quot;&gt;without stating what the author wants&lt;/a&gt;. I&#39;m not sure I understand the need for an integration compliance document for an algorithm that would be part of an official WCAG. To be continued..&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>3 lines for 3 dependencies</title>
    <link href="https://guillaumemeigniez.me/blog/3LinesFor3Dependencies/" />
    <updated>2024-08-15T00:00:00Z</updated>
    <id>https://guillaumemeigniez.me/blog/3LinesFor3Dependencies/</id>
    <content type="html">&lt;p&gt;At work this week we noticed that the package &lt;code class=&quot;mdf-code-inline&quot;&gt;react-autosize-textarea&lt;/code&gt; of our React frontend app had dependencies that were not kept up to date. A quick look at the &lt;a href=&quot;https://github.com/buildo/react-autosize-textarea&quot; class=&quot;mdf-link&quot;&gt;github repository&lt;/a&gt; showed that the last release was in 2018 and that it has been archived in March of this year. Which led us to look into why we needed that library 🤔.&lt;/p&gt;
&lt;p&gt;The &lt;code class=&quot;mdf-code-inline&quot;&gt;react-autosize-textarea&lt;/code&gt; library exports a React component named &amp;quot;TextArea&amp;quot; rendering a regular &lt;code class=&quot;mdf-code-inline&quot;&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt; HTML tag which height will resize based on its content so that a user will not have to scroll vertically within the input. It receives 3 props : the minimum height in rows, the maximum height in rows and a &lt;code class=&quot;mdf-code-inline&quot;&gt;onResize&lt;/code&gt; callback.&lt;/p&gt;
&lt;p&gt;Among the three dependencies of this package, there is &amp;quot;line-height&amp;quot; that gets the actual &lt;code class=&quot;mdf-code-inline&quot;&gt;line-height&lt;/code&gt; of the text within the input and with which is computed the max height allowed. And another dependency named &amp;quot;autoresize&amp;quot; that actually does the work of computing the height of a &lt;code class=&quot;mdf-code-inline&quot;&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt; so that it matches the inner &lt;code class=&quot;mdf-code-inline&quot;&gt;scrollHeight&lt;/code&gt;. Our &lt;code class=&quot;mdf-code-inline&quot;&gt;react-autosize-textarea&lt;/code&gt; does not much besides being the React abstraction of the &amp;quot;autoresize&amp;quot; package.&lt;/p&gt;
&lt;p&gt;After looking at what&#39;s done in &lt;a href=&quot;https://github.com/jackmoore/autosize/blob/master/src/autosize.js&quot; class=&quot;mdf-link&quot;&gt;autosize&lt;/a&gt; and the &lt;a href=&quot;https://medium.com/@oherterich/creating-a-textarea-with-dynamic-height-using-react-and-typescript-5ed2d78d9848&quot; class=&quot;mdf-link&quot;&gt;various articles&lt;/a&gt; &lt;a href=&quot;https://css-tricks.com/auto-growing-inputs-textareas/&quot; class=&quot;mdf-link&quot;&gt;on the web&lt;/a&gt;, we found a simple and accessible solution to replace the library.&lt;/p&gt;
&lt;p&gt;On a side note, we excluded these solutions : computing the inner height with the number of &amp;quot;&#92;n&amp;quot; occurrences does not work because of blocks of text that are displayed on multiple lines, and the &lt;code class=&quot;mdf-code-inline&quot;&gt;contenteditable&lt;/code&gt; &lt;code class=&quot;mdf-code-inline&quot;&gt;span&lt;/code&gt; solution doesn&#39;t work for us either because the French accessibility guidelines (RGAA: Référentiel Général d&#39;Amélioration de l&#39;Accessibilité) makes us build a UI that also works with CSS disabled (in which case the fake input cannot be identified as an input anymore).&lt;/p&gt;
&lt;p&gt;Within our React TextArea component, we have a &lt;code class=&quot;mdf-code-inline&quot;&gt;ref&lt;/code&gt; on the HTML input named &amp;quot;textAreaRef&amp;quot; and a &lt;code class=&quot;mdf-code-inline&quot;&gt;rows&lt;/code&gt; prop that&#39;s passed to the input.&lt;/p&gt;
&lt;pre class=&quot;mdf-code-block&quot;&gt;&lt;code&gt;function updateTextAreaHeight() {
  if (textAreaRef.current) {
    //  Reset the textarea height to its initial value based on the &#39;rows&#39; props before reading the scrollHeight
    //  so that the input is able to shrink back to its smallest height
    textAreaRef.current.style.height = `unset`;

    const scrollHeight = textAreaRef.current.scrollHeight;
    textAreaRef.current.style.height = `${scrollHeight}px`;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We update the size of the input on init of the React component and whenever the value of the input changes. Inspired by what&#39;s done in the &amp;quot;autoresize&amp;quot; repository, we use the &lt;code class=&quot;mdf-code-inline&quot;&gt;scrollHeight&lt;/code&gt; trick to know the actual height of the content. And we reset the height to &lt;code class=&quot;mdf-code-inline&quot;&gt;unset&lt;/code&gt; and not &lt;code class=&quot;mdf-code-inline&quot;&gt;0&lt;/code&gt; so that our &lt;code class=&quot;mdf-code-inline&quot;&gt;rows&lt;/code&gt; props is still the minimum height.&lt;span class=&quot;soft-space&quot;&gt;

&lt;/span&gt;Now if we wanted a maximum we could simply compute the maximum height in pixels based on the line-height that&#39;s obtained by dividing the &lt;code class=&quot;mdf-code-inline&quot;&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt; height when its height is &lt;code class=&quot;mdf-code-inline&quot;&gt;unset&lt;/code&gt;, knowing the minimum number of rows. Something like :&lt;/p&gt;
&lt;pre class=&quot;mdf-code-block&quot;&gt;&lt;code&gt;//  ...
const clientHeight = textAreaRef.current.clientHeight;
const maxHeight = (maxRows * clientHeight) / rows;

const scrollHeight = textAreaRef.current.scrollHeight;
textAreaRef.current.style.height = `${Math.min(scrollHeight, maxHeight)}px`;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That solution may not work for everyone, but the minimal React use case does not require any third party library, unless there&#39;s a need for a more robust browser compatibility. The solution we choose is not cutting-edge technology, then why did we choose to download that library in the first place ?&lt;/p&gt;
&lt;p&gt;In an older codebase such as ours where most of the code was written by people that are not here anymore, it&#39;s hard to find precise answers. But I&#39;m not surprised by the initial decision. As a frontend team we are fighting against wild libraries that have been installed in the last 6 years and that we have to maintain today.&lt;/p&gt;
&lt;p&gt;I suspect that there are 3 different problems here :&lt;/p&gt;
&lt;ul class=&quot;mdf-list&quot;&gt;
&lt;li class=&quot;mdf-list-item&quot;&gt;
&lt;p&gt;Everyone is focused on their team&#39;s delivery and not enough people do the tedious work of monitoring and evaluating each dependency on a regular basis.&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;mdf-list-item&quot;&gt;
&lt;p&gt;Many frontend developer think that installing a library is - most of the time - the best solution to their day-to-day delivery problem. I&#39;ve had the same debate multiple times : beyond all security/bundle size questions, is installing a dependency more maintenance work or less maintenance work ?&lt;/p&gt;
&lt;p&gt;I believe it is more maintenance most of the time. Every week we have dependabot failing at upgrading some library for reasons completely unrelated to the 3 lines of code that we actually depend on. While I have multiple examples in the codebase of homemade snippets that have never changed and that were chosen instead of a third party library. Because the 3 lines that we wrote ourselves match exactly what we need them for.&lt;/p&gt;
&lt;p&gt;Now, there seem to be two reasons for people to prefer installing new dependencies : it is very satisfying. In the React ecosystem, it is especially easy to plug in a new library that brings a lot of value to the user immediately with limited costs (reading a few lines of documentation).&lt;/p&gt;
&lt;p&gt;Also people have taken the gaussian meme of dependencies a little too seriously : as a junior developer, you start by installing all possible packages. Then you understand that making everything yourself offers more control i.e. customisation and optimisation. And eventually you realise that some harder things have already been solved and that you shouldn&#39;t reinvent the wheel every single time.&lt;/p&gt;
&lt;p&gt;There is a nuance to the last stage : identifying what&#39;s hard enough, so that it is worth all the maintenance, security, accessibility and code size questions is subtle. For example, building a complex dropdown menu from scratch may not be worth it for accessibility reasons. Same goes for building your own highly customisable range picker if you have 1 week sprint to make it work.&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;mdf-list-item&quot;&gt;
&lt;p&gt;The systematic need for React wrapper library is a little extreme. We probably shouldn&#39;t use them as much as we do because we all know enough how a React component lifecycle works to build our own. And when I see that &lt;a href=&quot;https://www.npmjs.com/package/react-autosize-textarea&quot; class=&quot;mdf-link&quot;&gt;react-autosize-textarea&lt;/a&gt; has 150 000 weekly downloads I&#39;m puzzled.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We all try to be careful and to make the best decisions for the future of the codebase. The evaluation of existing packages and the discussion around the new dependencies should happen. And since we may be at a point in time where the well used React wrappers maintainers communities are progressively dying after 5 to 10 years of loyal services, let&#39;s be even more careful 👀.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Everything I missed</title>
    <link href="https://guillaumemeigniez.me/blog/everythingIMissed/" />
    <updated>2024-05-20T00:00:00Z</updated>
    <id>https://guillaumemeigniez.me/blog/everythingIMissed/</id>
    <content type="html">&lt;p&gt;Last time I worked on this website, I was confident I had built something clean, well designed and accessible. Returning to it after a year learning about accessibility, I realize I had made a few mistakes.&lt;/p&gt;
&lt;p&gt;Making websites accessible is challenging. I work at a company that needs to comply with the &lt;abbr title=&quot;Référentiel général d&#39;amélioration de l&#39;accessibilité&quot;&gt;RGAA&lt;/abbr&gt; (the French guidelines for web accessibility). It’s a set of rules inspired by &lt;abbr title=&quot;Web content accessibility guidelines&quot;&gt;WCAG&lt;/abbr&gt;, the latest version being equivalent to AA in terms of compliance. However it presents things a bit differently.&lt;/p&gt;
&lt;p&gt;The French guidelines seem to give more room for interpretation. Last week in the RGAA mailing list exchanges someone asked if in a form (in French) with an email field, the label « E-mail » is clear enough, or if giving an explicit example is required. One would expect that there are enough email inputs out there to know the best practice for accessible labels.&lt;span class=&quot;soft-space&quot;&gt;

&lt;/span&gt;(After endless yet gripping discussions, consensus seems to lean toward the additional format example. One reason being that in French, there are a ton of ways to say « E-Mail »)&lt;/p&gt;
&lt;p&gt;Thus, the habits I have regarding accessibility may not be the same as someone working with WCAG (and I&#39;d love your feedback on that!). Here’s the things I had to fix to make this website more accessible.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Emoji&lt;/h3&gt;
&lt;p&gt;I had a bunch of &lt;i&gt;emoji&lt;/i&gt; that were interpreted by assistive technology as words although they are decorative. If the interpreted text does not make sense, it&#39;s important to either add an outer span with alternative text or ignore the &lt;i&gt;emoji&lt;/i&gt; with &lt;code class=&quot;mdf-code-inline&quot;&gt;aria-hidden=&amp;quot;true&amp;quot;&lt;/code&gt;. I now even avoid using them to convey meaning because they don’t look the same based on context.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Links&lt;/h3&gt;
&lt;p&gt;Before my review, all the links would open in a new tab without any indication. Opening a link in a new tab should not be the default behavior. When I learned that &lt;code class=&quot;mdf-code-inline&quot;&gt;target=&amp;quot;_blank&amp;quot;&lt;/code&gt; would do just that, I started using it everywhere. But users should be able to choose how they want a link to open, and opening in a new tab can be disorienting for someone navigating with assistive technology.&lt;/p&gt;
&lt;p&gt;I’m using hexo as a blog templating tool, and the build step sets all links as opening in a new tab. To fix that, I explicitly set all blog posts links to open in the current tab, and for the few links left opening in a new tab I added an icon next to the link with an accessible text describing the behavior.&lt;/p&gt;
&lt;p&gt;I also had some links with the url as a name. Showing the full url as the name of a link will force the assistive technology to interpret all the characters. Thus I made sure links all have explicit names.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Text&lt;/h3&gt;
&lt;p&gt;I had my default &lt;code class=&quot;mdf-code-inline&quot;&gt;font-size&lt;/code&gt; set to 16 pixels on both the &lt;code class=&quot;mdf-code-inline&quot;&gt;html&lt;/code&gt; and &lt;code class=&quot;mdf-code-inline&quot;&gt;body&lt;/code&gt; elements. I don&#39;t remember if I added that myself or if it was already in the CSS reset file I copy-pasted from somewhere, but it&#39;s not good! The default &lt;code class=&quot;mdf-code-inline&quot;&gt;font-size&lt;/code&gt; of the website should not be set in pixels, otherwise changing the default &lt;code class=&quot;mdf-code-inline&quot;&gt;font-size&lt;/code&gt; at the browser level will not have any effect on how the text is displayed.&lt;/p&gt;
&lt;p&gt;Also I had my line height set to one time the size of the font. Line height should be greater than 1.5 times the font-size to make it easier to read.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Page&lt;/h3&gt;
&lt;p&gt;My blog post pages all had the same title as the home page. All pages should have explicit titles and the information they provide should start with the things most related to the current context. That way a person reading the title from another tab knows faster what&#39;s on the page.&lt;/p&gt;
&lt;p&gt;I did add a &lt;code class=&quot;mdf-code-inline&quot;&gt;lang=&amp;quot;en&amp;quot;&lt;/code&gt; to my pages, but I forgot that some of my posts are in French... Therefore I set the &lt;code class=&quot;mdf-code-inline&quot;&gt;lang&lt;/code&gt; attribute around the French text in my blog posts.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Alt text&lt;/h3&gt;
&lt;p&gt;Last but not least, over the years I&#39;ve added collections of photos without considering alternative text for images. I had added the &lt;code class=&quot;mdf-code-inline&quot;&gt;alt&lt;/code&gt; attribute but with meta information. Now all photos and images have a proper description of what&#39;s to be seen in them.&lt;/p&gt;
&lt;p&gt;Now, I&#39;m pretty confident I have a clean, well designed and accessible website. See you next year for a new set of fixes &lt;span aria-hidden=&quot;true&quot;&gt;😎&lt;/span&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>An interactive map for investigative journalism</title>
    <link href="https://guillaumemeigniez.me/blog/NotesMapInvestigation/" />
    <updated>2022-09-07T00:00:00Z</updated>
    <id>https://guillaumemeigniez.me/blog/NotesMapInvestigation/</id>
    <content type="html">&lt;p&gt;In the beginning of 2022, I have built for the &lt;a href=&quot;https://forbiddenstories.org&quot; class=&quot;mdf-link&quot;&gt;Forbidden Stories&lt;/a&gt; platform their one year anniversary map of the &lt;a href=&quot;https://forbiddenstories.org/about-the-pegasus-project/&quot; class=&quot;mdf-link&quot;&gt;Project Pegasus&lt;/a&gt; initial release. They wanted to make accessible the data related to the (sometimes potential) victims and (sometimes potential) clients of the Pegasus spyware.&lt;/p&gt;
&lt;p&gt;The revelations being international and based on geographic data we built a web interactive world map. The experience is split in two distinct parts. First is the explanatory part with a scrollytelling identifying the events that occured during and after the revelations. And then an exploratory part where the user is given full access to the world map so that they find detailed description of every country’s involvement.&lt;/p&gt;
&lt;!-- &lt;a href=&quot;https://forbiddenstories.org/pegasus-project-impacts-map/&quot;&gt;The result is available here.&lt;/a&gt; --&gt;
&lt;img src=&quot;https://live.staticflickr.com/65535/52341331315_456c3daaab_z.jpg&quot; alt=&quot;Screenshot of the app where we see a map of the world centered on the atlantic ocean. Every country is grey besides France, Hungary, Israel and El Salvador that are red.&quot;&gt;
&amp;nbsp;
&lt;h3 class=&quot;mdf-title3&quot;&gt;The map&lt;/h3&gt;
&lt;p&gt;In the context of an international investigative journalism project, every element of the map becomes important and not every question is easy to answer. Especially concerning the map itself.&lt;/p&gt;
&lt;p&gt;As far as the map projection is concerned, I worked with d3-geo that offers many projection options. We eventually chose the Natural Earth Projection for how it eases the interactions with the map, and does have a convenient scale for the areas where the main Pegasus Project actions are happening.&lt;/p&gt;
&lt;p&gt;Deciding upon which border to display is sensitive and the rules are unclear. We went for the most used borders in French mainstream media maps such as Le Monde ones. For the contention over West Sahara for example, Google Maps “solves” it by displaying different borders based on where you connect from.&lt;/p&gt;
&lt;img src=&quot;https://live.staticflickr.com/65535/52341204944_92e20ac651_z.jpg&quot; alt=&quot;Screenshot of the app where we see a map of the world. All countries that have a (sometimes suspected) role in the Pegasus Project are highlighted.&quot;&gt;
&amp;nbsp;
&lt;h3 class=&quot;mdf-title3&quot;&gt;The accessibility&lt;/h3&gt;
&lt;p&gt;I’ve had dedicated time to work on improving the accessibility. Accessibility in data visualisation can be tricky because developers are not used to doing it systematically. Many code examples for web dataviz libraries omit the accessible part.&lt;/p&gt;
&lt;p&gt;On the internet, 1-2% of people navigate without having JS enabled (maybe even more when it comes to reading articles as users disable javascript to bypass paywalls). As the data of the app is only be accessible through the interactive map, giving a specific access to the information to these users is primordial. I created a separate website that doesn’t require javascript, and that displays the scrollytelling text, images of the map, and the list of links to all countries texts.&lt;/p&gt;
&lt;p&gt;Navigation was another concern. Especially the scrollytelling that is not rare, but its use may not be obvious to all readers. I made sure it would be navigable through scrolling with mouse or arrows, TAB, and with buttons. The scrollytelling being displayed as an intro to the exploration of countries, I made sure it’s skippable and that the user can come back to it at any time.&lt;/p&gt;
&lt;p&gt;I tested the app with VoiceOver to make sure it’s usable with at least one screen reader to eliminate the most serious mistakes. I know that VoiceOver is not the most used, and that all screen readers don’t work the same way. One of my regrets about this project was not having enough time before release to do it.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Spark AR filters with custom GLSL shaders</title>
    <link href="https://guillaumemeigniez.me/blog/sparkARCustomShaders/" />
    <updated>2022-01-01T00:00:00Z</updated>
    <id>https://guillaumemeigniez.me/blog/sparkARCustomShaders/</id>
    <content type="html">&lt;p&gt;SparkAR is Facebook&#39;s powerful and surprisingly accessible tool for creating 3D scenes that can be used as Facebook or Instagram filters. For about two years now, SparkAR&#39;s team added a SparkSL section to their documentation where they describe an underused tool of their software.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sparkar.facebook.com/ar-studio/learn/sparksl/sparksl-overview&quot; class=&quot;mdf-link&quot;&gt;SparkSL&lt;/a&gt; for Spark Shader Language is a superset of GLSL 1.0. It&#39;s a programming language for shader files (.sca) that can be imported into a SparkAR scene to be applied as textures to objects materials.&lt;/p&gt;
&lt;p&gt;If you don&#39;t know what GLSL or shaders are, I recommend reading &lt;a href=&quot;https://thebookofshaders.com&quot; class=&quot;mdf-link&quot;&gt;The Book of Shaders&lt;/a&gt;. With them, you&#39;ll be able - for any material in your scenes - to make visual effects that you couldn&#39;t do with textures &amp;amp; the basic shader tools of the grid.&lt;/p&gt;
&lt;p&gt;Especially since the size of an effect matters, and the files you’ll create will just be lines of codes and super light compared with actual textures.&lt;/p&gt;
&lt;p&gt;We&#39;ll build a shader file (.sca) that we&#39;ll import into SparkAR and apply to a plane&#39;s material to make a very custom and very dynamic texture.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Creating a GLSL fragment shader&lt;/h3&gt;
&lt;p&gt;To create a fragment shader super easily, let&#39;s start by opening &lt;a href=&quot;https://shdr.bkcore.com&quot; class=&quot;mdf-link&quot;&gt;https://shdr.bkcore.com&lt;/a&gt;, an editor that puts you directly into the code.&lt;/p&gt;
&lt;p&gt;Let’s say we want to create a fragment shader that adds a “tv noise” effect to the material. The initial code should look something like :&lt;/p&gt;
&lt;pre class=&quot;mdf-code-block&quot;&gt;&lt;code&gt;precision highp float;
uniform float time;
uniform vec2 resolution;
varying vec3 fPosition;
varying vec3 fNormal;

    void main() {
        gl_FragColor = vec4(fNormal, 1.0);
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And we’ll add a noise function that does the effect, remove what we don’t need, and add the effect to the normal vector :&lt;/p&gt;
&lt;pre class=&quot;mdf-code-block&quot;&gt;&lt;code&gt;precision highp float;
uniform float time;
varying vec3 fNormal;

    float tvNoise(vec2 p, float ta, float tb) {
        return fract(sin(p.x * ta + p.y * tb) * 5678.);
    }

    void main() {
        float t = time + 123.;
        float ta = t * .654321;
        float tb = t * (ta * .123456);
        float tvNoise = tvNoise(fNormal.xy, ta, tb);
        gl_FragColor = vec4(fNormal + vec3(tvNoise), 1.0);
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You should get something like this :&lt;/p&gt;
&lt;img src=&quot;https://live.staticflickr.com/65535/51792820918_76e4614f79_z.jpg&quot; alt=&quot;3D multicolor monkey head on a black background.&quot;&gt;
&lt;p&gt;We can now save this code in a new file with the extension .frag, for example &lt;strong&gt;tvNoise.frag&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Making this shader SparkAR compatible&lt;/h3&gt;
&lt;p&gt;Now we would like to use this file inside SparkAR and get the same kind of effect on the camera for example. However, SparkAR can not really read .frag files directly, we’ll have to make it a .sca file that requires some changes as far as syntax is concerned.&lt;/p&gt;
&lt;p&gt;First of all, to be able to retrieve the global variables such as the position of each fragment, and the time variable, we need to import the &lt;strong&gt;std&lt;/strong&gt; util (&lt;a href=&quot;https://sparkar.facebook.com/ar-studio/learn/sparksl/sparksl-api/utils&quot; class=&quot;mdf-link&quot;&gt;see the docs&lt;/a&gt;):&lt;/p&gt;
&lt;pre class=&quot;mdf-code-block&quot;&gt;&lt;code&gt;#import &amp;lt;utils&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then replace the corresponding variables in the main function :&lt;/p&gt;
&lt;pre class=&quot;mdf-code-block&quot;&gt;&lt;code&gt;vec4 main(vec3 camera) {
float t = std::getTime() _ 10.;
float ta = t _ .654321;
float tb = t _ (ta _ .123456);
float noise = tvNoise(fragment(std::getVertexTexCoord()).xy, ta, tb);
return vec4((noise + 0.4) &#92;* camera, 1.);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I couldn’t find a clear documentation for all the SparkSL functions that can be used. I often rely on random codes examples in the rest of the docs that use them without explaining. For example, the only place I could find &lt;strong&gt;getVertexTexCoord&lt;/strong&gt; &lt;a href=&quot;https://sparkar.facebook.com/ar-studio/learn/scripting/shader-code-asset/#defining-functions&quot; class=&quot;link&quot;&gt;was there&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The repo &lt;a href=&quot;https://github.com/aferriss/sparksl-shader-examples&quot; class=&quot;link&quot;&gt;sparksl-shader-examples&lt;/a&gt; was even more useful than the docs.&lt;/p&gt;
&lt;p&gt;Then the &lt;strong&gt;tvNoise.sca&lt;/strong&gt; should look like this :&lt;/p&gt;
&lt;pre class=&quot;mdf-code-block&quot;&gt;&lt;code&gt;#import &amp;lt;utils&amp;gt;

    precision highp float;

    float tvNoise(vec2 p, float ta, float tb) {
        return fract(sin(p.x * ta + p.y * tb) * 5678.);
    }

    vec4 main(vec3 camera) {
        float t = std::getTime() * 10.;
        float ta = t * .654321;
        float tb = t * (ta * .123456);
        float noise = tvNoise(fragment(std::getVertexTexCoord()).xy, ta, tb);
        return vec4((noise + 0.4) * camera, 1.);
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I also have increased the time by multiplying it, and added the camera input that will be useful in SparkAR.&lt;/p&gt;
&lt;p&gt;As I understand, the line &lt;strong&gt;precision highp float;&lt;/strong&gt; is not a best practice, but useful especially on mobile phones to ensure that the shader will get enough ressources to be displayed correctly.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Using the .sca file in a SparkAR project&lt;/h3&gt;
&lt;p&gt;Now let’s create a new SparkAR project without using any template. What we’ll do is we will make a front panel that reproduces the camera image, but sends it through our shader. Thus we will be able to modify the image as we want.&lt;/p&gt;
&lt;p&gt;For this particular tv noise example, it is not really necessary to do all that, but once you’re done setting it up, you will be able to make very custom effects to the camera view.&lt;/p&gt;
&lt;p&gt;In the &lt;strong&gt;Scene&lt;/strong&gt; panel, inside &lt;strong&gt;Focal Distance&lt;/strong&gt;, you’ll create a new &lt;strong&gt;Canvas&lt;/strong&gt; in which you’ll create a &lt;strong&gt;Rectangle&lt;/strong&gt;. And you’ll give this rectangle 100 relative width and height.&lt;/p&gt;
&lt;p&gt;In the &lt;strong&gt;Asset&lt;/strong&gt; section, add a new file from your computer and select the .sca file you’ve just created. If everything works correctly you shouldn’t get any error in the console.&lt;/p&gt;
&lt;p&gt;Then create a new &lt;strong&gt;Asset&lt;/strong&gt; of type &lt;strong&gt;Material&lt;/strong&gt;, and set its &lt;strong&gt;Shader Type&lt;/strong&gt; to the shader file we’ve just imported by selecting &lt;strong&gt;Shader Asset&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Now select your rectangle in the &lt;strong&gt;Scene&lt;/strong&gt; and give it the &lt;strong&gt;Material&lt;/strong&gt; we’ve just created. You should see now a black plane fitting the camera in front of the image.&lt;/p&gt;
&lt;p&gt;Then select the material, and click the small arrow next to the &lt;strong&gt;camera&lt;/strong&gt; parameter. You should see the corresponding patch appear in the Patch Editor.&lt;/p&gt;
&lt;p&gt;We’ll then make a texture asset of the &lt;strong&gt;camera&lt;/strong&gt; by clicking on &lt;strong&gt;Texture Extraction&lt;/strong&gt; in the &lt;strong&gt;camera&lt;/strong&gt; info.&lt;/p&gt;
&lt;p&gt;Finally select the texture, and create a patch out of it. In the patch editor, link the RGB output of the texture to the camera parameter of the material.&lt;/p&gt;
&lt;img src=&quot;https://live.staticflickr.com/65535/51791757467_0f37df46a5_z.jpg&quot; alt=&quot;Screenshot from the SparkSL app. The patch editor tab is open, and there are two blocks cameraTexture0 and material0 linked from the RGB node on the first one to the camera node on the other one.&quot;&gt;
&lt;p&gt;And you should see now the camera having a tv noise effect. This effect could have been done more simply without creating a separate panel, but now you can tweak the shaders params and see all the effects you can do with this setup.&lt;/p&gt;
&lt;p&gt;SparkAR is well documented, unlike SparkSL. After hours of researching in the docs, I came up with this way to quickly make working shaders inside effects. But my understanding of shaders and spareAR are limited. If you know any more efficient way to do all this, please let me know 💝.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Groix 2021</title>
    <link href="https://guillaumemeigniez.me/blog/Groix2021/" />
    <updated>2022-01-01T00:00:00Z</updated>
    <id>https://guillaumemeigniez.me/blog/Groix2021/</id>
    <content type="html">&lt;p lang=&quot;fr&quot;&gt;Pour la documentation de la collection André·e Lawrance *Beginner*, je suis allé le temps d&#39;un week end avec 4 amis sur l&#39;île de Groix en Bretagne. La plupart des photos des vêtements ont été faites avec un appareil numérique, mais j&#39;avais aussi apporté un appareil argentique (Cannon AE-1) pour montrer l&#39;envers du décors.&lt;/p&gt;
&lt;div class=&quot;photo-album&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51792325639_e8094db876_z.jpg&quot; alt=&quot;A man in the foreground is looking at the camera at night in a small street of Groix. In the background, three blurry men are waiting.&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51792687755_18608643cd.jpg&quot; alt=&quot;A white cat on the roof of a white house.&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51792325689_3a66b9025e.jpg&quot; alt=&quot;At night on a beach, a person is standing next to a rock. Their coat is reflecting a lot of light. It&#39;s black and white as if it was an outdoor static camera footage.&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51792687810_7d11de20ee.jpg&quot; alt=&quot;A person standing in front of the blue sea on a beach. Boats are passing by at the horizon.&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51792687835_ee228a7fb5.jpg&quot; alt=&quot;The hand of a person holding an orange and blue beer can. There is a green bike behind.&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51792325724_3208723de2.jpg&quot; alt=&quot;Two men on a beach at night. They are searching something in their bags. They have frontal red lights.&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51791004332_3c9c221e9e.jpg&quot; alt=&quot;Two persons taking pictures hidden behind a rock.&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51792325654_3839e523eb_z.jpg&quot; alt=&quot;Five people on black and green rocks in front of an agitated sea. ne of them is almost falling.&quot;&gt;
&lt;/div&gt;
&lt;p&gt;Finalement beaucoup des photos argentiques ont servi à la promotion visuelle sur Instagram &lt;a href=&quot;https://www.instagram.com/andre.elawrance/&quot; class=&quot;mdf-link&quot;&gt;@andre.elawrance&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Making bags for strawberry picking</title>
    <link href="https://guillaumemeigniez.me/blog/makingtheBags/" />
    <updated>2021-08-26T00:00:00Z</updated>
    <id>https://guillaumemeigniez.me/blog/makingtheBags/</id>
    <content type="html">&lt;p&gt;The goal is to make bags for André·e L. that are solid and convenient. Unlike those made for the first chapter, these should be waterproof, thick and not too big. Perfect for the city market or strawberry picking in the rain.&lt;/p&gt;
&lt;img src=&quot;https://live.staticflickr.com/65535/51403386027_87bee15a9e_z.jpg&quot; alt=&quot;Bag full of strawberries&quot;&gt;
&lt;p&gt;During summer, I went to Brittany and took a few pictures. I went to La Pointe Du Bill to shoot a sailing class, and to l&#39;île d&#39;Arz to get some hydrangeas pics. A collection of the pictures taken is available &lt;a href=&quot;https://guillaumemeigniez.me/photos/brittanySummer2021&quot; class=&quot;mdf-link&quot;&gt;here&lt;/a&gt;. With those, I made large digital collages, and printed them on waterproof fabric. The print was made with &lt;a href=&quot;https://www.contrado.fr&quot; class=&quot;mdf-link&quot;&gt;Contrado&lt;/a&gt; which I tried ordering at for the first time. For the fabric I chose (Tissu imperméable respirant 155g/m²) the result is really worth the price.&lt;/p&gt;
&lt;div class=&quot;photo-album&quot;&gt;
   &lt;img src=&quot;https://live.staticflickr.com/65535/51404396438_4d9d1a1fa1.jpg&quot; alt=&quot;Collage of brittany pictures&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51404890054_86a17e1284.jpg&quot; alt=&quot;Collage of brittany pictures&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51404153531_2fa35e847e.jpg&quot; alt=&quot;Printed fabric&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51405132290_37dcce0ecf.jpg&quot; alt=&quot;Printed fabric&quot;&gt;
&lt;/div&gt;
&lt;p&gt;I then cut the fabric, and sewed the bags along with a layer of a dark blue satin on the inside. The result is soft &amp;amp; strong &amp;amp; cute.&lt;/p&gt;
&lt;div class=&quot;photo-album&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51404150716_d31c4cf813.jpg&quot; alt=&quot;Bag in front of the library&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51404412563_f4d1047e91.jpg&quot; alt=&quot;Bag in front of the library&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51405129815_60446b82aa.jpg&quot; alt=&quot;Bag in front of the library&quot;&gt;
&lt;/div&gt;
&lt;p&gt;It&#39;s always hard to find the right fabric for a project. Even though I live down the street from the largest Parisian fabric shops, it&#39;s the discovery of a fabric that sparks the will to make a project, and rarely the other way around. And buying fabric online is quite scary and ends up more expensive. I&#39;m glad it was actually pretty easy to print custom fabric, and I&#39;m glad the result matches the expectations!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Brittany Summer 2021</title>
    <link href="https://guillaumemeigniez.me/blog/brittanySummer2021/" />
    <updated>2021-08-26T00:00:00Z</updated>
    <id>https://guillaumemeigniez.me/blog/brittanySummer2021/</id>
    <content type="html">&lt;p&gt;In the summer of 2021 I went to Brittany to see family. I took a few pictures of the landscapes near Séné.&lt;/p&gt;
&lt;div class=&quot;photo-album&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51404858959_a5ed75e40d.jpg&quot; alt=&quot;Boats in the golfe du morbihan&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51403356062_dd911843b1.jpg&quot; alt=&quot;Sailboards in the golfe du morbihan&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51404859084_91fc1fd407.jpg&quot; alt=&quot;Roofs behind trees in Arz island&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51403356262_aafa600e41.jpg&quot; alt=&quot;Hydrageas on a wall in Arz&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51403356172_97ae43464d.jpg&quot; alt=&quot;Boat in a shiny waters&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51404858994_b1441f99c0.jpg&quot; alt=&quot;Boats in the golfe du morbihan&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51404104316_2d981185db.jpg&quot; alt=&quot;House in the distance&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51403356062_dd911843b1.jpg&quot; alt=&quot;Sailboards in the golfe du morbihan&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51404365923_4c291850ef.jpg&quot; alt=&quot;Sailboards in the golfe du morbihan&quot;&gt;
    &lt;img src=&quot;https://live.staticflickr.com/65535/51403356232_562f4811f3.jpg&quot; alt=&quot;Landscape in the golfe du morbihan&quot;&gt;
&lt;/div&gt;
</content>
  </entry>
  <entry>
    <title>A·EL-B Chapter 2</title>
    <link href="https://guillaumemeigniez.me/blog/aelbChapitre2/" />
    <updated>2021-07-29T00:00:00Z</updated>
    <id>https://guillaumemeigniez.me/blog/aelbChapitre2/</id>
    <content type="html">&lt;p&gt;In 2020 I started sewing again. I made my first jackets based on a pattern I drew from a second hand jacket I found at a Guerrida shop.&lt;/p&gt;
&lt;p&gt;I&#39;ve been willing for 2 years to make a sewing project with some kind of data visualization involved. Since I saw the Arte documentary &amp;quot;Fashion Geek&amp;quot;, I follow and admire the work of &lt;a href=&quot;https://www.claradaguin.com&quot; class=&quot;mdf-link&quot;&gt;Clara Daguin&lt;/a&gt; and &lt;a href=&quot;http://yinggao.ca&quot; class=&quot;mdf-link&quot;&gt;Ying Gao&lt;/a&gt;. They both include elecronic devices in clothes to convey impressions, and to explore the interfaces between body and technology.&lt;/p&gt;
&lt;p&gt;I&#39;ve been making 2 jackets, 2 shorts and I&#39;ll try to make 2 hats and 2 bags. I want to use geospatial sensors attached to the clothes, and then use the data to produce sounds made of samples. The sound would be linked to the movement. For this I need to do a few things :&lt;/p&gt;
&lt;ul class=&quot;mdf-list&quot;&gt;
&lt;li class=&quot;mdf-list-item&quot;&gt;Find or draw appropriate patterns&lt;/li&gt;
&lt;li class=&quot;mdf-list-item&quot;&gt;Sew the clothes&lt;/li&gt;
&lt;li class=&quot;mdf-list-item&quot;&gt;Setup the sensors with a Raspberry Pi&lt;/li&gt;
&lt;li class=&quot;mdf-list-item&quot;&gt;Setup the server that saves the data&lt;/li&gt;
&lt;li class=&quot;mdf-list-item&quot;&gt;Build the interface that reads it&lt;/li&gt;
&lt;li class=&quot;mdf-list-item&quot;&gt;Write the algorithm that produces the sounds&lt;/li&gt;
&lt;li class=&quot;mdf-list-item&quot;&gt;Record the movement of the clothes and film it&lt;/li&gt;
&lt;li class=&quot;mdf-list-item&quot;&gt;Create a video with both sound generated and images&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of this points is finished yet, but I&#39;ve started working on all of them.&lt;/p&gt;
&lt;div class=&quot;photo-album&quot;&gt;
    &lt;div class=&quot;images-row images-row-2&quot;&gt;
        &lt;img src=&quot;https://live.staticflickr.com/65535/51343198813_6c4c1198e3.jpg&quot; alt=&quot;Blue fabric being cut on the ground&quot;&gt;
        &lt;img src=&quot;https://live.staticflickr.com/65535/51343198883_bd2105498e.jpg&quot; alt=&quot;Close up of the sewing of the zip for the jacket&quot;&gt;
    &lt;/div&gt;
    &lt;div class=&quot;images-row images-row-2&quot;&gt;
        &lt;img src=&quot;https://live.staticflickr.com/65535/51342971306_093fb5049b.jpg&quot; alt=&quot;Jacket under a plant&quot;&gt;
        &lt;img src=&quot;https://live.staticflickr.com/65535/51343993905_184470d67b.jpg&quot; alt=&quot;Close up of the sewing of the zip for the jacket&quot;&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To be continued...&lt;/p&gt;
&lt;p&gt;🙋‍♂️&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>About this website</title>
    <link href="https://guillaumemeigniez.me/blog/aboutThisWebsite/" />
    <updated>2021-07-29T00:00:00Z</updated>
    <id>https://guillaumemeigniez.me/blog/aboutThisWebsite/</id>
    <content type="html">&lt;p&gt;Oops I did it again... Making this personal website again is probably a waste of time. But the previous version that I made a year ago was too much inaccessible. I would avoid opening it on my phone when my power level was too low, or the ReactJS + ThreeJS + unoptimized GLSL Shaders would kill it.&lt;/p&gt;
&lt;p&gt;Thus it was painful to update any content. This time I tried a new exercise, instead of making something &lt;em&gt;cool&lt;/em&gt; that barely works, I tried to make something &lt;em&gt;boring&lt;/em&gt; that works everywhere for everyone. Even the fact that I&#39;ve had this thinking is unoriginal as an (almost senior) front-end developer.&lt;/p&gt;
&lt;p&gt;I need a space to document what I do as a front-end developer, as a creative data-visualization developer, and as a sewing amateur. For this, I was inspired by simple yet effective personal websites/blogs in the tech world.&lt;/p&gt;
&lt;p&gt;I used &lt;a href=&quot;https://hexo.io&quot; class=&quot;mdf-link&quot;&gt;hexo&lt;/a&gt; as the base for creating a blog-friendly website with my own custom template. Even tho the documentation could be clearer it does the job well and I enjoy building it.&lt;/p&gt;
&lt;p&gt;But hexo plugins didn&#39;t offer what I was looking for as far as images management is concerned, besides a lazy-loading plugin (the problem being that loading images is what takes the most times). I tried building a S3 with a &lt;a href=&quot;https://aws.amazon.com/fr/solutions/implementations/serverless-image-handler/&quot; class=&quot;mdf-link&quot;&gt;serverless image handler&lt;/a&gt;, like adults do. And I couldn&#39;t. It reassures me that I&#39;m not strong enough mentally to be a back-end developer. I&#39;m too much afraid that one of the 100 services set up doesn&#39;t have the right security or isn&#39;t adapted, and I&#39;ll end up paying 1000s of dollars for a small mistake.&lt;/p&gt;
&lt;p&gt;I found out that &lt;a href=&quot;https://www.flickr.com&quot; class=&quot;mdf-link&quot;&gt;Flickr&lt;/a&gt; allows you to store 1000 images for free in any resolution, &lt;strong&gt;and&lt;/strong&gt; they automatically create tons of different resolutions for each images that can be retrieved with a simple param in the url 🎉 Which is all I asked for.&lt;/p&gt;
&lt;p&gt;You can find the code for this blog &lt;a href=&quot;https://github.com/GuillaumeMMM/personal-blog&quot; class=&quot;mdf-link&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;🙋‍♂️&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Data Humanism - A case study</title>
    <link href="https://guillaumemeigniez.me/blog/dataHumanismACaseStudy/" />
    <updated>2019-05-14T00:00:00Z</updated>
    <id>https://guillaumemeigniez.me/blog/dataHumanismACaseStudy/</id>
    <content type="html">&lt;h3 class=&quot;mdf-title3&quot;&gt;Data humanism&lt;/h3&gt;
&lt;p&gt;Data is an imperfect abstraction of the world. We use blindly this interface as reality itself. This is obscurantism and data humanists are here to switch the light on.&lt;/p&gt;
&lt;img src=&quot;https://guillaumemeigniez.me/blog/dataHumanismACaseStudy/4ZZW4qZO-Q-800.webp&quot; alt=&quot;Visualization of running experiences in the form of discs filled with colors relative to the scenery of the Paris circuits&quot; style=&quot;height: auto&quot; width=&quot;800&quot; height=&quot;483&quot;&gt;
&lt;p&gt;The world is made of complicated mechanisms and interactions. Thus, the data capturing the world is also complex. But do we always consider this complexity when working with data ?&lt;/p&gt;
&lt;p&gt;In Big Data projects, a piece of data is just one more line. The more lines there are, the more credible the dataset is. The line itself is no more than a drop in the ocean and does not represent anything anymore. It has no specific form, and gives us very little hook on reality. Data is a magic plasma which we feed to data visualization tools which then recommend us the best way of depicting it.&lt;/p&gt;
&lt;p&gt;As far as data visualization is concerned, especially dashboards in which each widget answers a specific question and gives a limited amount of information, we hope to explain complex phenomena with generic questions and formatted answers.&lt;/p&gt;
&lt;p&gt;Most of the time, data is just what we take from the world to answer our most &lt;em&gt;valuable&lt;/em&gt; questions. &lt;strong&gt;We lose the sense of what data represents&lt;/strong&gt;. Thus, its complexity in not considered.&lt;/p&gt;
&lt;p&gt;Maybe using our digital tools to find answers to generic pre-existing questions is not the only way of behaving with data.&lt;/p&gt;
&lt;p&gt;Let’s say I have an app which tracks how many kilometers I ran in the last month. I chose a bar chart to show the distance in km for each week of the month. It is a valid design which gives valid information. It answers the question : “How many kilometers did I run each week ?”. However, it’s only valid and nothing more, because it doesn’t try to mean anything else than what it shows. Maybe one bar in the visualization matches with hours of physical effort in various places with various people feeling various emotions.&lt;/p&gt;
&lt;p&gt;Data humanists like &lt;a href=&quot;http://giorgialupi.com/&quot; class=&quot;mdf-link&quot;&gt;Giorgia Lupi&lt;/a&gt;, who wrote &lt;a href=&quot;https://medium.com/@giorgialupi/data-humanism-the-revolution-will-be-visualized-31486a30dbfb&quot; class=&quot;mdf-link&quot;&gt;a manifesto&lt;/a&gt;, say the bar chart is not the issue. The fault is ours, willing to show an inherently human piece of information without considering the human. To find the human in the dataset, they suggest ways to reincorporate empathy at different levels of the data handling.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;Guidelines&lt;/h3&gt;
&lt;p&gt;Unlike the traditional approach in which questions are asked and answers are found, data should be contextualized. “Sneak context in. (always)” says Giorgia Lupi. The process of analyzing the data while thinking about its possible visual representations will hopefully reveal the substance of the context.&lt;/p&gt;
&lt;p class=&quot;mdf-quote&quot;&gt;This is why we have to reclaim a personal approach to how data is captured, analyzed and displayed, proving that subjectivity and context play a big role in understanding even big events and social changes — especially when data is about people.&lt;/p&gt;
&lt;p&gt;Manually collecting the data makes it more human. Generally, normal data engineers would find an available dataset that suits their needs. But by carefully making it on their own, they would not forget what data represents. Moreover, in trying to have a more humanist approach, there is no need for any specific set of data. In the case of the running app above, the goal is just to translate the experience of the runner into an abstracted visual form, thus no specific form of data is recommended.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.stefanieposavec.com/&quot; class=&quot;mdf-link&quot;&gt;Stefani Posavec&lt;/a&gt; suggests in her talk &lt;a href=&quot;https://vimeo.com/287094544&quot; class=&quot;mdf-link&quot;&gt;at Eyeo 2018&lt;/a&gt; that the gathering of data can be a worthwhile activity in itself. And she rehabilitates what she calls anoraks providing very personal examples.&lt;/p&gt;
&lt;p&gt;Then, the data analysis process can be partly done by diving into the dataset. Doing data visualization hand sketching at the same time may reveal the set’s underlying structures. With this way of mixed analysis and design, the usual data driven designs paradigm might be dodged.&lt;/p&gt;
&lt;p&gt;Even after the data visualization design is done, the data analysis process is not over yet. The design’s purpose is to depict complex phenomena, therefore part of the analysis work should be left to the reader of the design. This is what people at &lt;a href=&quot;https://www.accurat.it/&quot; class=&quot;mdf-link&quot;&gt;Accurat&lt;/a&gt; call non-linear storytelling. The users are invited to pick their information and to make a story out of it.&lt;/p&gt;
&lt;h3 class=&quot;mdf-title3&quot;&gt;A more human running app&lt;/h3&gt;
&lt;p&gt;I like running a lot. And when I discover a city, I try to find nice running tracks, both to exercise and to discover the places I visit. I sometimes use a running app that tracks my runs and sums it up into data visualization designs. Of course the running apps are mainly made for athletes who want to have reports about their performances, therefore the designs are non-humanistic. As I am not an athlete, and now that the data humanism rules are a little clearer to me, I have tried to design my own running reports.&lt;/p&gt;
&lt;p&gt;The reports in the original running app gives three types of visualization design. First a bar chart giving the km ran in the last weeks, like mentioned above. Then a map, where the circuit is highlighted, with gradients from green to red depending of the speed. And finally line charts giving many other insights on the last run.&lt;/p&gt;
&lt;img src=&quot;https://guillaumemeigniez.me/blog/dataHumanismACaseStudy/XB8Q9MJSB0-800.webp&quot; alt=&quot;Screenshots of traditional running mobile apps.&quot; style=&quot;height: auto&quot; width=&quot;800&quot; height=&quot;449&quot;&gt;
&lt;p&gt;I am sensitive to colors as general impressions. When I think about the tracks I’m used to running through, I imagine a series of colors. In Paris, I imagine the beige of the buildings with the grey of the Seine and the intense blue sky.&lt;/p&gt;
&lt;p&gt;For the data collection, I decided to go through my usual tracks on google street view, and to choose at each kilometers the color that strikes me the most.&lt;/p&gt;
&lt;img src=&quot;https://guillaumemeigniez.me/blog/dataHumanismACaseStudy/KouT45Q0mK-800.webp&quot; alt=&quot;Google stree view screenshot of a road in Paris under a bridge and next to the Ile aux cygnes.&quot; style=&quot;height: auto&quot; width=&quot;800&quot; height=&quot;388&quot;&gt;
&lt;p&gt;Now my data is made of a series of circuits, and for each of them a series of colors.&lt;/p&gt;
&lt;p&gt;Just like most people on earth, I rarely run without listening to music. And I also see the albums I listen to as shades. Therefore, for each one of my last 9 runs, I wrote down the music I listened to and gave it colors.&lt;/p&gt;
&lt;p&gt;For each of these runs, I also gave three types of feedback. An environmental feedback, from 1/3 for a poor running environment at that time, to 3/3 for a great experience. A physical fulfillment feedback, 1/3 for physical hard times, and 3/3 for perfect conditions. End eventually a psychological feedback, often linked to the music I listened to.&lt;/p&gt;
&lt;p&gt;I also added to my personal data various indicators like the length of the tracks or its difficulty.&lt;/p&gt;
&lt;p&gt;Then, I had to find interesting ways to squeeze the data and to shape the design so that I could achieve a visualization that translates my running experience. I wanted to give a colorful feel for each of the runs.&lt;/p&gt;
&lt;img src=&quot;https://guillaumemeigniez.me/blog/dataHumanismACaseStudy/SDEHw-Tf6P-800.webp&quot; alt=&quot;Visualization of running experiences in the form of discs filled with colors relative to the scenery of the New Taipei City circuits&quot; style=&quot;height: auto&quot; width=&quot;800&quot; height=&quot;424&quot;&gt;
&lt;p&gt;The fact that I decided to make a (slightly) interactive website with the library d3.js is not insignificant. One of the themes of data humanism is that technology and data should drive as few decisions as possible. And displaying the unfixed result through a digital interactive medium (with a library meaning literally ‘data driven’) means that technology has given structure to the design.&lt;/p&gt;
&lt;p&gt;However, in that case study, I used the JavaScript technology to enhance the storytelling by adding interactivity. A click on any color element related to a specific music opens a new tab with a YouTube video playing that music.&lt;/p&gt;
&lt;p&gt;A click of the mouse, a tap with the thumb or the mouse going over an element are all dimensions added to the space of the stories that can be told through the design. And as a first attempt to data humanism design I hope that at least some running stories will be read through my experiment.&lt;/p&gt;
</content>
  </entry>
</feed>